gd-canvas
Version:
This set of libraries was generated with [Angular CLI](https://github.com/angular/angular-cli) version 9.1.0 and no dependencies accept gd-tree (it has jquery and jstree) and gd-graph (it has jquery and chart.js).
703 lines • 122 kB
JavaScript
import { Types } from './gd-canvas.base';
import { Actions } from './gd-canvas.base';
import { Tools } from './gd-canvas.tools';
import { Point } from 'gd-common';
import { Rect } from 'gd-common';
import { Vector } from 'gd-common';
import { Line } from 'gd-common';
import { CustomObject } from 'gd-canvas-custom-types';
export class Selector {
constructor(canvas, service) {
this.service = service;
this.canvas = canvas;
this.selected = new Array();
this.focused = null;
this.tools = new Tools();
service.focusedMove$.subscribe((offset) => this.OnFocusedMove(offset));
}
get StartX() { return this.startX; }
set StartX(x) { this.startX = x; this.rect = null; }
get StartY() { return this.startY; }
set StartY(y) { this.startY = y; this.rect = null; }
get EndX() { return this.endX; }
set EndX(x) { this.endX = x; this.rect = null; }
get EndY() { return this.endY; }
set EndY(y) { this.endY = y; this.rect = null; }
OnFocusedMove(offset) {
for (let i = 0; i < this.selected.length; ++i) {
if (this.selected[i].IsFocused)
continue;
if (this.selected[i].ParentID !== null)
continue;
this.selected[i].MoveOffset(offset.x, offset.y);
}
}
GetPoints() {
const x = Math.min(this.startX, this.endX);
const y = Math.min(this.startY, this.endY);
const w = Math.abs(this.startX - this.endX);
const h = Math.abs(this.startY - this.endY);
const points = [
{ x: x, y: y },
{ x: x + w, y: y },
{ x: x + w, y: y + h },
{ x: x, y: y + h },
{ x: x, y: y }
];
return points;
}
Refresh() {
if (this.rect !== null)
return;
const x = Math.min(this.startX, this.endX);
const y = Math.min(this.startY, this.endY);
const w = Math.abs(this.startX - this.endX);
const h = Math.abs(this.startY - this.endY);
this.rect = new Rect(x, y, w, h);
}
Add(object) {
if (this.rect === null)
return false;
if (object === undefined)
return false;
if (object.IsSelected)
return false;
let flag = true;
const x = this.rect.x / this.canvas.scale - this.canvas.canvasOffsetX;
const y = this.rect.y / this.canvas.scale - this.canvas.canvasOffsetY;
const modelRect = new Rect(x, y, this.rect.w / this.canvas.scale, this.rect.h / this.canvas.scale);
const points = object.GetPolygon();
for (let j = 0; j < points.length; ++j) {
if (!modelRect.IsContains(points[j])) {
flag = false;
break;
}
}
if (!flag)
return false;
if (this.selected.length === 0) {
this.focused = object;
object.IsFocused = true;
}
this.selected.push(object);
object.IsSelected = true;
return true;
}
ClearSelection() {
this.selected = new Array();
if (this.focused === null)
return;
this.focused.IsFocused = false;
this.focused.activePoint = -1;
this.focused.activeLine = -1;
this.focused = null;
}
Select(point, isRightClick) {
var toRedraw = [];
var object = this.canvas.GetObjectClicked(point);
if (object === undefined) {
if (this.focused !== null) {
const res = this.UnSelect();
this.canvas.DRAW(res);
this.service.SelectedChanged(null);
}
return false;
}
if (!this.canvas.isAltKey) {
if (object.type === Types.polyline) {
}
if (object.type === Types.polygon) {
if (object.Text.IsFocused) {
this.selected.push(object);
}
else {
if (!object.IsSelected) {
this.UnSelect();
}
if (object.activeLine !== -1) {
this.selected.push(object);
}
}
}
else {
if (object.IsRef) {
if (object.IsSelected) {
object.Reference.IsVisible = !object.Reference.IsVisible;
if (object.Reference.IsRef) {
object.Reference.Reference.IsVisible = object.Reference.IsVisible; //?????????????????????
}
}
else {
object.Reference.IsVisible = true;
}
}
if (!object.IsSelected) {
toRedraw = this.UnSelect();
this.selected.push(object);
if (CustomObject.Select(object)) {
var layer = this.canvas.map.get(object.Type);
if (layer !== undefined) {
var type = Types[object.Type].toString();
if (toRedraw.indexOf(type) === -1)
toRedraw.push(type);
var child = this.canvas.mapChildren.get(object.Type);
if (child !== undefined) {
var type = Types[child].toString();
if (toRedraw.indexOf(type) === -1)
toRedraw.push(type);
}
}
var layer = this.canvas.map.get(object.ParentType);
if (layer !== undefined) {
var type = Types[object.ParentType].toString();
if (toRedraw.indexOf(type) === -1)
toRedraw.push(type);
}
}
if (object.type === Types.reference) {
object.IsVisible = true;
object.Select();
}
}
}
if (this.focused !== null && this.focused !== object) {
this.focused.IsFocused = false;
this.focused.activePoint = -1;
this.focused.activeLine = -1;
if (!object.IsSelected) {
this.focused.IsSelected = false;
}
}
this.focused = object;
this.focused.IsFocused = true;
this.focused.IsSelected = true;
this.focused.ClickOffsetX = point.x - this.focused.X;
this.focused.ClickOffsetY = point.y - this.focused.Y;
}
else {
if (object.type === Types.polygon) {
if (object.Text.IsFocused) {
this.selected.push(object);
}
else {
if (!object.IsSelected) {
this.UnSelect();
}
if (object.activeLine !== -1) {
this.selected.push(object);
}
}
}
else {
if (!object.IsSelected) {
this.selected.push(object);
if (CustomObject.Select(object)) {
var layer = this.canvas.map.get(object.Type);
if (layer !== undefined) {
var type = Types[object.Type].toString();
if (toRedraw.indexOf(type) === -1)
toRedraw.push(type);
}
var layer = this.canvas.map.get(object.ParentType);
if (layer !== undefined) {
var type = Types[object.ParentType].toString();
if (toRedraw.indexOf(type) === -1)
toRedraw.push(type);
}
}
if (object.type === Types.reference) {
object.IsVisible = true;
}
if (object.type === Types.shape) {
if (object.IsRef)
object.Reference.IsVisible = true;
}
if (this.focused !== null) {
this.focused.IsFocused = false;
this.focused.activePoint = -1;
this.focused.activeLine = -1;
}
this.focused = object;
this.focused.IsFocused = true;
this.focused.IsSelected = true;
this.focused.ClickOffsetX = point.x - this.focused.X;
this.focused.ClickOffsetY = point.y - this.focused.Y;
}
else {
const i = this.selected.indexOf(object);
if (i > -1) {
this.selected.splice(i, 1);
}
object.IsSelected = false;
if (object.IsFocused) {
this.focused.IsFocused = false;
this.focused.activePoint = -1;
this.focused.activeLine = -1;
this.focused = null;
if (this.selected.length > 0) {
this.focused = this.selected[0];
this.focused.IsFocused = true;
}
}
}
}
}
var newSelected = Types[object.type];
if (toRedraw.indexOf(newSelected) === -1)
toRedraw.push(Types[object.type]);
if (toRedraw.indexOf('selected') === -1)
toRedraw.push('selected');
if (object.isRef)
if (toRedraw.indexOf('reference') === -1)
toRedraw.push('reference');
if (object.type === Types.text && object.ParentType === Types.polygon)
if (toRedraw.indexOf('polygon') === -1)
toRedraw.push('polygon');
this.canvas.DRAW(toRedraw);
return true;
}
UnSelect() {
if (this.selected.length === 0)
return [];
const wasSelected = new Array();
wasSelected.push('selected');
for (let i = 0; i < this.selected.length; ++i) {
this.selected[i].IsSelected = false;
if (CustomObject.UnSelect(this.selected[i])) {
var child = this.canvas.mapChildren.get(this.selected[i].type);
if (child !== undefined) {
var type = Types[child].toString();
if (wasSelected.indexOf(type) === -1)
wasSelected.push(type);
type = Types[this.selected[i].type].toString();
if (wasSelected.indexOf(type) === -1)
wasSelected.push(type);
}
}
switch (this.selected[i].type) {
case Types.block:
{
if (wasSelected.indexOf('block') === -1)
wasSelected.push('block');
}
break;
case Types.dimension:
{
if (wasSelected.indexOf('dimension') === -1)
wasSelected.push('dimension');
}
break;
case Types.segment:
{
if (wasSelected.indexOf('segment') === -1)
wasSelected.push('segment');
}
break;
case Types.arc:
{
if (wasSelected.indexOf('arc') === -1)
wasSelected.push('arc');
}
break;
case Types.polygon:
{
if (wasSelected.indexOf('polygon') === -1)
wasSelected.push('polygon');
}
break;
case Types.callout:
{
if (wasSelected.indexOf('callout') === -1)
wasSelected.push('callout');
}
break;
case Types.polyline:
{
if (wasSelected.indexOf('polyline') === -1)
wasSelected.push('polyline');
this.selected[i].activePoint = -1;
this.selected[i].activeLine = -1;
this.selected[i].activeLineKeeper = -1;
}
break;
case Types.reference:
{
this.selected[i].IsVisible = false;
if (wasSelected.indexOf('reference') === -1)
wasSelected.push('reference');
for (var j = 0; j < this.selected[i].Children.length; ++j) {
var toRedraw = Types[this.selected[i].Children[j].type];
if (wasSelected.indexOf(toRedraw) === -1)
wasSelected.push(toRedraw);
}
}
break;
case Types.shape:
{
if (CustomObject.UnSelect(this.selected[i])) {
var layer = this.canvas.map.get(this.selected[i].ParentType);
if (layer !== null) {
var type = Types[this.selected[i].ParentType].toString();
if (wasSelected.indexOf(type) === -1)
wasSelected.push(type);
}
}
if (this.selected[i].IsRef) {
this.selected[i].Reference.IsVisible = false;
if (this.selected[i].Reference.IsRef) {
this.selected[i].Reference.Reference.IsVisible = false;
}
if (wasSelected.indexOf('reference') === -1)
wasSelected.push('reference');
}
if (wasSelected.indexOf('shape') === -1)
wasSelected.push('shape');
}
break;
case Types.text:
{
if (this.selected[i].ParentType === Types.polygon) {
if (wasSelected.indexOf('polygon') === -1)
wasSelected.push('polygon');
}
else {
if (wasSelected.indexOf('text') === -1)
wasSelected.push('text');
}
}
break;
}
}
this.ClearSelection();
return wasSelected;
}
IsContains(point) {
return false;
}
Draw(c) {
if (c === null || c === undefined)
return;
this.Refresh();
const borderThickness = 0.25;
c.clearRect(-0.5, -0.5, this.canvas.width + 1, this.canvas.height + 1);
if (this.canvas.action === Actions.select || this.canvas.action === Actions.selectShapes) {
c.save();
c.fillStyle = 'rgba(128, 159, 255, 0.15)';
c.strokeStyle = 'rgba( 0, 45, 179, 1.00)';
c.lineWidth = borderThickness;
c.beginPath();
c.rect(this.rect.x + (0.5 / this.canvas.scale), this.rect.y + (0.5 / this.canvas.scale), this.rect.w, this.rect.h);
c.closePath();
c.fill();
c.stroke();
c.restore();
}
if (this.canvas.action === Actions.selectShapesInOrder) {
c.save();
c.strokeStyle = 'rgba( 0, 45, 179, 1.00)';
c.lineWidth = borderThickness;
c.beginPath();
c.moveTo(this.startX, this.startY);
c.lineTo(this.endX, this.endY);
c.closePath();
c.stroke();
c.restore();
}
CustomObject.DoCustomAction(c, this.canvas.action, this.startX, this.startY, this.endX, this.endY, this.canvas.scale, borderThickness);
}
DrawRegularGondola(c) {
const LocationW = 40;
const LocationH = 20;
const Start = 0;
const End = 0;
try {
const start = new Point(this.StartX / this.canvas.scale, this.StartY / this.canvas.scale);
const end = new Point(this.EndX / this.canvas.scale, this.EndY / this.canvas.scale);
const vector = new Vector(start, end);
const angle = vector.Angle();
const len = vector.Length();
const vectorStartCap = new Vector(start, end);
vectorStartCap.Normalize();
vectorStartCap.Scale(-LocationH);
const vectorEndCap = new Vector(start, end);
vectorEndCap.Normalize();
vectorEndCap.Scale(LocationH);
const vector1 = new Vector(start, end);
vector1.Rotate90();
vector1.Normalize();
vector1.Scale(LocationH);
const vector2 = new Vector(start, end);
vector2.Rotate90();
vector2.Rotate90();
vector2.Rotate90();
vector2.Normalize();
vector2.Scale(LocationH);
const gondola = new Line(this.startX, this.startY, this.endX, this.endY);
const line1 = new Line(this.startX + vector2.x, this.startY + vector2.y, this.startX + vector1.x, this.startY + vector1.y);
const line2 = new Line(this.startX + vector1.x, this.startY + vector1.y, this.endX + vector1.x, this.endY + vector1.y);
const line3 = new Line(this.endX + vector1.x, this.endY + vector1.y, this.endX + vector2.x, this.endY + vector2.y);
const line4 = new Line(this.endX + vector2.x, this.endY + vector2.y, this.startX + vector2.x, this.startY + vector2.y);
const line5 = new Line(this.startX + vector1.x, this.startY + vector1.y, this.startX + vectorStartCap.x + vector1.x, this.startY + vectorStartCap.y + vector1.y);
const line6 = new Line(this.startX + vectorStartCap.x + vector1.x, this.startY + vectorStartCap.y + vector1.y, this.startX + vectorStartCap.x + vector2.x, this.startY + vectorStartCap.y + vector2.y);
const line7 = new Line(this.startX + vectorStartCap.x + vector2.x, this.startY + vectorStartCap.y + vector2.y, this.startX + vector2.x, this.startY + vector2.y);
const line8 = new Line(this.endX + vector1.x, this.endY + vector1.y, this.endX + vectorEndCap.x + vector1.x, this.endY + vectorEndCap.y + vector1.y);
const line9 = new Line(this.endX + vectorEndCap.x + vector1.x, this.endY + vectorEndCap.y + vector1.y, this.endX + vectorEndCap.x + vector2.x, this.endY + vectorEndCap.y + vector2.y);
const line10 = new Line(this.endX + vectorEndCap.x + vector2.x, this.endY + vectorEndCap.y + vector2.y, this.endX + vector2.x, this.endY + vector2.y);
c.beginPath();
c.moveTo(gondola.x1, gondola.y1);
c.lineTo(gondola.x2, gondola.y2);
c.moveTo(line1.x1, line1.y1);
c.lineTo(line1.x2, line1.y2);
c.lineTo(line2.x2, line2.y2);
c.lineTo(line3.x2, line3.y2);
c.lineTo(line4.x2, line4.y2);
c.moveTo(line5.x1, line5.y1);
c.lineTo(line5.x2, line5.y2);
c.lineTo(line6.x2, line6.y2);
c.lineTo(line7.x2, line7.y2);
c.moveTo(line8.x1, line8.y1);
c.lineTo(line8.x2, line8.y2);
c.lineTo(line9.x2, line9.y2);
c.lineTo(line10.x2, line10.y2);
c.closePath();
c.stroke();
const vector3 = new Vector(start, end);
const tempID = 1;
// int tempID = Map.NextAreaID;
const count = (len / LocationW);
const areaCount = 2 * count + 2;
for (let i = 1; i <= count; ++i) {
vector3.Normalize();
vector3.Scale(LocationW * i);
const line = new Line(this.startX + vector1.x + vector3.x, this.startY + vector1.y + vector3.y, this.startX + vector2.x + vector3.x, this.startY + vector2.y + vector3.y);
c.beginPath();
c.moveTo(line.x1, line.y1);
c.lineTo(line.x2, line.y2);
c.closePath();
c.stroke();
}
const vector5 = new Vector(start, end);
const vector6 = new Vector(start, end);
vector6.Normalize();
vector6.Scale(-LocationW / 2);
const vector7 = new Vector(start, end);
vector7.Rotate90();
vector7.Normalize();
vector7.Scale(LocationH / 2 - 4);
let text = '';
let x = 0;
let y = 0;
for (let i = 1; i <= count; ++i) {
c.save();
vector5.Normalize();
vector5.Scale(LocationW * i);
// text = (tempID + i-1).toString();
text = (tempID + 2 * Math.floor(count) + 1 - i).toString();
x = this.startX + vector5.x + vector6.x + vector7.x;
y = this.startY + vector5.y + vector6.y + vector7.y;
c.translate(x, y);
c.rotate(angle * Math.PI / 180);
// c.font = '10px Source Sans Pro';
// c.font = '10px Open Sans';
c.font = '10px Sans';
c.fillStyle = 'black';
c.textAlign = 'center';
c.fillText(text, 0, 0);
c.restore();
}
text = (tempID + Math.floor(count)).toString();
const vector8 = new Vector(start, end);
vector8.Normalize();
vector8.Scale(LocationH / 2 - 3);
x = this.endX + vector8.x;
y = this.endY + vector8.y;
c.save();
c.translate(x, y);
c.rotate((angle + 90) * Math.PI / 180);
c.font = '10px Sans';
c.fillStyle = 'black';
c.textAlign = 'center';
c.fillText(text, 0, 0);
c.restore();
vector7.Normalize();
vector7.Scale(-LocationH / 2 + 4);
for (let i = 1; i <= count; ++i) {
c.save();
vector5.Normalize();
vector5.Scale(LocationW * i);
text = (tempID + i - 1).toString();
// text = (tempID + 2 * Math.floor(count) + 1 - i).toString();
x = this.startX + vector5.x + vector6.x + vector7.x;
y = this.startY + vector5.y + vector6.y + vector7.y;
c.translate(x, y);
c.rotate((angle + 180) * Math.PI / 180);
c.font = '10px Sans';
c.fillStyle = 'black';
c.textAlign = 'center';
c.fillText(text, 0, 0);
c.restore();
}
const vector9 = new Vector(start, end);
vector9.Normalize();
vector9.Scale(-LocationH / 2 + 4);
text = (tempID + 2 * Math.floor(count) + 1).toString();
x = this.startX + vector9.x;
y = this.startY + vector9.y;
c.save();
c.translate(x, y);
c.rotate((angle + 270) * Math.PI / 180);
c.font = '10px Sans';
c.fillStyle = 'black';
c.textAlign = 'center';
c.fillText(text, 0, 0);
c.restore();
}
catch (ex) {
}
}
DrawWallGondola(c) {
const LocationW = 40;
const LocationH = 20;
const Start = 0;
const End = 0;
try {
const start = new Point(this.StartX / this.canvas.scale, this.StartY / this.canvas.scale);
const end = new Point(this.EndX / this.canvas.scale, this.EndY / this.canvas.scale);
const vector = new Vector(start, end);
const angle = vector.Angle();
const len = vector.Length();
const vector2 = new Vector(start, end);
vector2.Rotate90();
vector2.Normalize();
vector2.Scale(-LocationH);
const gondola = new Line(this.startX, this.startY, this.endX, this.endY);
const line1 = new Line(this.endX, this.endY, this.endX + vector2.x, this.endY + vector2.y);
const line2 = new Line(this.endX + vector2.x, this.endY + vector2.y, this.startX + vector2.x, this.startY + vector2.y);
const line3 = new Line(this.startX, this.startY, this.startX + vector2.x, this.startY + vector2.y);
c.beginPath();
c.moveTo(gondola.x1, gondola.y1);
c.lineTo(gondola.x2, gondola.y2);
c.lineTo(line1.x2, line1.y2);
c.lineTo(line2.x2, line2.y2);
c.lineTo(line3.x2, line3.y2);
c.closePath();
c.stroke();
const vector3 = new Vector(start, end);
const tempID = 1;
// int tempID = Map.NextAreaID;
const count = (len / LocationW);
const areaCount = 2 * count + 2;
for (let i = 1; i <= count; ++i) {
vector3.Normalize();
vector3.Scale(LocationW * i);
const line = new Line(this.startX + vector3.x, this.startY + vector3.y, this.startX + vector2.x + vector3.x, this.startY + vector2.y + vector3.y);
c.beginPath();
c.moveTo(line.x1, line.y1);
c.lineTo(line.x2, line.y2);
c.closePath();
c.stroke();
}
const vector4 = new Vector(start, end);
const vector5 = new Vector(start, end);
vector5.Normalize();
vector5.Scale(-LocationW / 2 - 5);
const vector6 = new Vector(start, end);
vector6.Normalize();
vector6.Scale(LocationH / 2 - 3);
let text = '';
let x = 0;
let y = 0;
for (let i = 1; i <= count; ++i) {
c.save();
vector4.Normalize();
vector4.Scale(LocationW * i);
text = (tempID + i - 1).toString();
x = this.startX + vector4.x + vector5.x + vector6.x;
y = this.startY + vector4.y + vector5.y + vector6.x;
c.translate(x, y);
c.rotate((angle + 180) * Math.PI / 180);
c.font = '10px Sans';
c.fillStyle = 'black';
c.textAlign = 'center';
c.fillText(text, 0, 0);
c.restore();
}
}
catch (ex) {
}
}
DrawArea(c) {
if (this.startX > this.endX)
return;
if (this.startY > this.endY)
return;
const LocationW = 40;
const LocationH = 20;
const paddingLeft = 5;
const paddingTop = 5;
const paddingRight = 5;
const paddingBottom = 5;
const rect = new Rect(this.startX, this.startY, this.endX - this.startX, this.endY - this.startY);
let itemX = rect.x + paddingLeft * this.canvas.scale;
let itemY = rect.y + paddingTop * this.canvas.scale;
let text = '';
const tempID = 1;
c.globalAlpha = 0.75;
c.strokeStyle = '#444';
c.fillStyle = '#eee';
c.save();
c.beginPath();
c.rect(rect.x, rect.y, rect.w, rect.h);
c.closePath();
c.fill();
c.stroke();
c.restore();
c.save();
text = 'Area 1';
const x = itemX;
const y = itemY;
c.font = '10px Sans';
c.fillStyle = 'black';
c.textAlign = 'left';
c.fillText(text, rect.x + 1, rect.y - 3);
c.restore();
c.strokeStyle = '#777';
c.fillStyle = '#eee';
if (rect.w < 45 || rect.h < 25)
return;
const vector4 = new Vector(100, 0);
vector4.Normalize();
vector4.Scale(LocationW / 2);
const vector5 = new Vector(0, 100);
vector5.Normalize();
vector5.Scale(LocationH / 2 + 4);
for (let i = 0;; ++i) {
if (itemX + LocationW + 3 > rect.x + rect.w) {
itemX = rect.x + paddingLeft * this.canvas.scale;
itemY = itemY + LocationH + 3;
if (itemY + LocationH + 3 > rect.y + rect.h) {
break;
}
}
c.save();
c.beginPath();
this.tools.RoundRect(c, itemX, itemY, LocationW, LocationH, 3, '#f00', '#000');
c.closePath();
c.stroke();
c.restore();
c.save();
vector4.Normalize();
vector4.Scale(LocationW / 2);
text = (tempID + i).toString();
const x = itemX + vector4.x + vector5.x;
const y = itemY + vector4.y + vector5.y;
c.font = '10px Sans';
c.fillStyle = 'black';
c.textAlign = 'center';
c.fillText(text, x, y);
c.restore();
itemX = itemX + LocationW + 3;
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2QtY2FudmFzLnNlbGVjdG9yLmpzIiwic291cmNlUm9vdCI6Im5nOi8vZ2QtY2FudmFzLyIsInNvdXJjZXMiOlsibGliL2dkLWNhbnZhcy5zZWxlY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFjLE1BQU0sa0JBQWtCLENBQUM7QUFDckQsT0FBTyxFQUFFLE9BQU8sRUFBWSxNQUFNLGtCQUFrQixDQUFDO0FBRXJELE9BQU8sRUFBRSxLQUFLLEVBQWMsTUFBTSxtQkFBbUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsS0FBSyxFQUFjLE1BQU0sV0FBVyxDQUFDO0FBQzlDLE9BQU8sRUFBRSxJQUFJLEVBQWUsTUFBTSxXQUFXLENBQUM7QUFDOUMsT0FBTyxFQUFFLE1BQU0sRUFBYSxNQUFNLFdBQVcsQ0FBQztBQUM5QyxPQUFPLEVBQUUsSUFBSSxFQUFlLE1BQU0sV0FBVyxDQUFDO0FBRTlDLE9BQU8sRUFBRSxZQUFZLEVBQU8sTUFBTSx3QkFBd0IsQ0FBQztBQUUzRCxNQUFNLE9BQU8sUUFBUTtJQXlCakIsWUFBYSxNQUEwQixFQUFVLE9BQXlCO1FBQXpCLFlBQU8sR0FBUCxPQUFPLENBQWtCO1FBRXRFLElBQUksQ0FBQyxNQUFNLEdBQUssTUFBTSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsT0FBTyxHQUFJLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsS0FBSyxHQUFNLElBQUksS0FBSyxFQUFFLENBQUM7UUFFNUIsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUUsQ0FBQyxNQUFZLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUUsQ0FBQztJQUNuRixDQUFDO0lBcEJELElBQUksTUFBTSxLQUF1QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBdUIsQ0FBQztJQUM1RSxJQUFJLE1BQU0s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LE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRyxJQUFJLENBQUMsSUFBSSxDQUFFLENBQUM7UUFDOUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUUsQ0FBQztRQUM5QyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBRSxDQUFDO1FBRTlDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVPLEdBQUcsQ0FBRSxNQUFZO1FBRXJCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJO1lBQVEsT0FBTyxLQUFLLENBQUM7UUFDM0MsSUFBSSxNQUFNLEtBQVEsU0FBUztZQUFHLE9BQU8sS0FBSyxDQUFDO1FBQzNDLElBQUksTUFBTSxDQUFDLFVBQVU7WUFBUyxPQUFPLEtBQUssQ0FBQztRQUUzQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7UUFFaEIsTUFBTSxDQUFDLEdBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUM7UUFDdkUsTUFBTSxDQUFDLEdBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUM7UUFFdkUsTUFBTSxTQUFTLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFB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LEtBQUssQ0FBQyxTQUFTO29CQUFHO3dCQUFFLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7NEJBQUcsV0FBVyxDQUFDLElBQUksQ0FBRSxXQUFXLENBQUUsQ0FBQztxQkFBRTtvQkFBQyxNQUFNO2dCQUNoSCxLQUFLLEtBQUssQ0FBQyxPQUFPO29CQUFLO3dCQUFFLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBTyxDQUFDLENBQUM7NEJBQUcsV0FBVyxDQUFDLElBQUksQ0FBRSxTQUFTLENBQUksQ0FBQztxQkFBRTtvQkFBQyxNQUFNO2dCQUNoSCxLQUFLLEtBQUssQ0FBQyxHQUFHO29CQUFTO3dCQUFFLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBVyxDQUFDLENBQUM7NEJBQUcsV0FBVyxDQUFDLElBQUksQ0FBRSxLQUFLLENBQVEsQ0FBQztxQkFBRTtvQkFBQyxNQUFNO2dCQUNoSCxLQUFLLEtBQUssQ0FBQyxPQUFPO29CQUFLO3dCQUFFLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBTyxDQUFDLENBQUM7NEJBQUcsV0FBVyxDQUFDLElBQUksQ0FBRSxTQUFTLENBQUksQ0FBQztxQkFBRTtvQkFBQyxNQUFNO2dCQUNoSCxLQUFLLEtBQUssQ0FBQyxPQUFPO29CQUFLO3dCQUFFLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBTyxDQUFDLENBQUM7NEJBQUcsV0FBVyxDQUFDLElBQUksQ0FBRSxTQUFTLENBQUksQ0FBQztxQkFBRTtvQkFBQyxNQUFNO2dCQUNoSCxLQUFLLEtBQUssQ0FBQyxRQUFRO29CQUNuQjt3QkFDSSxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQU0sQ0FBQyxDQUFDOzRCQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUUsVUFBVSxDQUFHLENBQUM7d0JBQzlFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FB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