UNPKG

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
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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