├── README.md ├── drawHex.js ├── generateSector.html ├── readSector.html ├── testSector.txt ├── travGen.js └── travGenUtils.js /README.md: -------------------------------------------------------------------------------- 1 | # travGenJS 2 | Javascript library for generating, reading, writing, and drawing sector data for sci-fi RPGs such as Traveller. 3 | 4 | ## Getting Started 5 | 6 | The file generateSector.html is a simple example of using the library to generate a new sector, a new world, and a new UWP. 7 | 8 | The file readSector.html is a simple example of using travGenJS to read sector data into a Sector object, and then outputing that data to the screen in standard .sec format. 9 | 10 | ### Prerequisites 11 | 12 | None 13 | 14 | ### Installing 15 | 16 | `` 17 | `` 18 | 19 | 20 | ## API Reference 21 | 22 | sector generation 23 | subsector generation 24 | world generation 25 | uwp generation 26 | trade route generation 27 | 28 | sector reading 29 | subsector reading 30 | world reading 31 | 32 | sector output 33 | subsector output 34 | world output 35 | 36 | sector drawing 37 | subsector drawing 38 | 39 | 40 | ## Built With 41 | 42 | * [atom](http://www.atom.io) - Text Editor 43 | * [jQuery](https://jquery.com) 44 | 45 | 46 | ## Contributing 47 | 48 | ?? 49 | 50 | 51 | ## Versioning 52 | 53 | ?? 54 | 55 | 56 | ## Authors 57 | 58 | * **[forthekill](https://github.com/forthekill)** * 59 | 60 | See also the list of [contributors](https://github.com/your/project/contributors) who participated in this project. 61 | 62 | 63 | ## License 64 | 65 | ?? 66 | 67 | 68 | ## Acknowledgments 69 | 70 | * [Joshua Bell](http://www.travellermap.com) 71 | * [Marc Miller](http://www.farfuture.net) 72 | 73 | * The Traveller game in all forms is owned by Far Future Enterprises. Copyright 1977 - 1998 Far Future Enterprises. Traveller is a registered trademark of Far Future Enterprises. Far Future permits web sites and fanzines for this game, provided it contains this notice, that Far Future is notified, and subject to a withdrawal of permission on 90 days notice. The contents of this site are for personal, non-commercial use only. Any use of Far Future Enterprises's copyrighted material or trademarks anywhere on this web site and its files should not be viewed as a challenge to those copyrights or trademarks. In addition, any program/articles/file on this site cannot be republished or distributed without the consent of the author who contributed it. 74 | -------------------------------------------------------------------------------- /drawHex.js: -------------------------------------------------------------------------------- 1 | var HEXSIZE = 48; // Length of hex side 2 | var SEC_COLS = 32; // Number of hex columns 3 | var SEC_ROWS = 40; // Number of hex rows 4 | 5 | // Width from hex point to start of side 6 | var HEXH = Math.abs(Math.sin(30*Math.PI/180) * HEXSIZE); 7 | // Height from center point to flat side 8 | var HEXR = Math.abs(Math.cos(30*Math.PI/180) * HEXSIZE); 9 | 10 | // Canvas size 11 | // TODO: Figure out why the canvas seems to big based on this calc 12 | var CANVAS_HEIGHT = (HEXSIZE + (HEXH * 2)) * SEC_ROWS; 13 | var CANVAS_WIDTH = (HEXR * 2) * SEC_COLS; 14 | 15 | var worldHexNumbers = true; // If true, draws hex numbers only when a world is present 16 | 17 | // Colors 18 | var hexColor = "#AAA"; // Color of Hex Outline 19 | var hexNumColor = "#777" // Color of Hex Number 20 | 21 | var zoneAmberColor = "#FD0"; // Amber zone color 22 | var zoneRedColor = "#F00"; // Red zone color 23 | var stpColor = "#FFF"; // Color of Starport Text 24 | var nameColor = "#FFF"; 25 | var nameColorCapital = "#F00"; 26 | 27 | var xboatRouteColor = "#390"; 28 | var btn08RouteColor = "#A00"; 29 | var btn09RouteColor = "#FF6"; 30 | var btn10RouteColor = "#F90"; 31 | var btn11RouteColor = "#09F"; 32 | var btn12RouteColor = "#939"; 33 | 34 | 35 | // World Colors 36 | var worldColor = "#390"; 37 | var worldColorAsteroid = "#333"; 38 | var worldColorDesert = "#FC3"; 39 | var worldColorExotic = "#F00"; 40 | var worldColorIce = "#7BF"; 41 | var worldColorWater = "#069"; 42 | var worldColorVaccuum = "#FFF"; 43 | 44 | // Font of all text 45 | var textFont = "Arial" // Generic text font 46 | var nameFont = "Arial"; // Font for world data 47 | var nameSize = (HEXSIZE * 0.25) + "px"; // Font size for world data 48 | var nameStyle = "bold"; // Font style for world data 49 | 50 | // Line widths 51 | var hexLineWidth = HEXSIZE / 48; 52 | var tradeLineWidth = HEXSIZE / 6; 53 | var travelZoneLineWidth = HEXSIZE / 14; 54 | var worldRadius = HEXSIZE * 0.18; 55 | var worldMaskRadius = HEXSIZE * 0.28; 56 | 57 | /* Sets the size of the hex and reevaluates the appropriate variables */ 58 | function resizeHex(size){ 59 | if(size <= 0){ size = 1 }; // size must be a positive value 60 | if(size > 96){ size = 96 }; // size cannot be greater than 96 or Canvas throws an error 61 | HEXSIZE = size; 62 | 63 | HEXH = Math.abs(Math.sin(30*Math.PI/180) * HEXSIZE); 64 | HEXR = Math.abs(Math.cos(30*Math.PI/180) * HEXSIZE); 65 | CANVAS_HEIGHT = (HEXSIZE + (HEXH * 2)) * SEC_ROWS; 66 | CANVAS_WIDTH = (HEXR * 2) * SEC_COLS; 67 | 68 | hexLineWidth = HEXSIZE / 48; 69 | tradeLineWidth = HEXSIZE / 6; 70 | travelZoneLineWidth = HEXSIZE / 14; 71 | worldRadius = HEXSIZE * 0.18; 72 | worldMaskRadius = HEXSIZE * 0.28; 73 | 74 | nameSize = (HEXSIZE * 0.25) + "px"; 75 | } 76 | 77 | 78 | /* MAIN MAP DRAW FUNCTIONS */ 79 | 80 | /* Takes a Canvas context and draws all map components */ 81 | function drawMap(sector,context){ 82 | drawHexes(context); 83 | if(worldHexNumbers){ 84 | drawWorldHexNumbers(sector,context); 85 | }else{ 86 | drawHexNumbers(context); 87 | } 88 | drawWorlds(sector,context); 89 | drawSectorData(sector,context); 90 | drawRoutes2(sector,context); 91 | } 92 | 93 | /* Takes a Canvas context and draws a hex map */ 94 | function drawHexes(context){ 95 | for (var c=0; c < SEC_COLS; c++){ 96 | for (var i=0; i < SEC_ROWS; i++){ 97 | var hex = getHex(c,i); 98 | drawHex(hex,context); 99 | } 100 | } 101 | } 102 | 103 | /* Takes a Canvas context and draws hex map numbers */ 104 | function drawHexNumbers(context){ 105 | for (var c=0; c < SEC_COLS; c++){ 106 | for (var i=0; i < SEC_ROWS; i++){ 107 | var hex = getHex(c,i); 108 | drawHexNumber(hex,context); 109 | } 110 | } 111 | } 112 | 113 | /* Takes a sector object and Canvas context and draws hex map numbers only in hexes where worlds exist */ 114 | function drawWorldHexNumbers(sector,context){ 115 | var len = sector.worlds.length; 116 | for(var x=0; x < len; x++){ 117 | var hex = getWorldHex(sector.worlds[x]); 118 | drawHexNumber(hex,context); 119 | } 120 | } 121 | 122 | /* Takes a sector object and a Canvas context and draws the worlds for a sector */ 123 | function drawWorlds(sector,context){ 124 | var len = sector.worlds.length; 125 | for(var x=0; x < len; x++){ 126 | drawWorld(sector.worlds[x],context); 127 | } 128 | } 129 | 130 | /* Takes a sector object and a Canvas context and draws the world data for a sector */ 131 | function drawSectorData(sector,context) { 132 | var len = sector.worlds.length; 133 | for(var x=0; x < len; x++){ 134 | drawWorldData(sector.worlds[x],context); 135 | } 136 | } 137 | 138 | /* Draws world name, starport, travel zone, gas giant, and bases for a world */ 139 | function drawWorldData(world,context){ 140 | drawName(world,context); 141 | drawStarport(world,context); 142 | if(world.zone == 1 || world.zone == 2) { drawTravelZone(world,context); } 143 | drawGasGiant(world,context); 144 | drawBases(world,context); 145 | } 146 | 147 | /* Takes a sector object and a Canvas context and draws the trade routes for a sector */ 148 | function drawRoutes(sector,context) { 149 | // Loop through the pairs and drawRoute for each one 150 | var len = sector.tradeRoutePairs.length; 151 | if (len > 0){ 152 | for(var x=0; x < len; x++){ 153 | drawRoute(sector.tradeRoutePairs[x].start,sector.tradeRoutePairs[x].end,sector.tradeRoutePairs[x].btn,context); 154 | } 155 | }else{ 156 | console.log("There are no trade route pairs. Please run generateTradeRoutePairs(sector)."); 157 | } 158 | } 159 | 160 | /* SINGLE DRAW FUNCTIONS */ 161 | 162 | /* Takes a hex and a Canvas context and draws the hex */ 163 | function drawHex(hex,context){ 164 | context.lineWidth = hexLineWidth; 165 | context.strokeStyle = hexColor; 166 | context.beginPath(); 167 | context.moveTo(hex.points[0].x,hex.points[0].y); 168 | context.lineTo(hex.points[1].x,hex.points[1].y); 169 | context.lineTo(hex.points[2].x,hex.points[2].y); 170 | context.lineTo(hex.points[3].x,hex.points[3].y); 171 | context.lineTo(hex.points[4].x,hex.points[4].y); 172 | context.lineTo(hex.points[5].x,hex.points[5].y); 173 | context.lineTo(hex.points[0].x,hex.points[0].y) 174 | context.stroke(); 175 | context.closePath(); 176 | } 177 | 178 | /* Takes a hex and a Canvas context and draws the hexnumber */ 179 | function drawHexNumber(hex,context){ 180 | var hexnum = hexString(hex.col,hex.row); 181 | context.font = (hex.s * 0.25) + "px " + textFont; 182 | context.textAlign = "center"; 183 | context.fillStyle = hexNumColor; 184 | context.fillText(hexnum,hex.centerX,hex.centerY - hex.r + (hex.s * 0.25)); 185 | context.closePath(); 186 | } 187 | 188 | /* Takes a world object and a Canvas context and draws the world */ 189 | function drawWorld(world,context){ 190 | //console.log("In drawWorld, hex " + world.hex); 191 | 192 | var hex = getWorldHex(world); 193 | 194 | // Draw mask circle under world to make ends of route line concave 195 | context.beginPath(); 196 | context.fillStyle = "#000"; 197 | context.arc(hex.centerX,hex.centerY,worldMaskRadius,0,Math.PI*2,true); 198 | context.fill(); 199 | context.closePath(); 200 | 201 | context.beginPath(); 202 | context.fillStyle = worldColor; 203 | if(world.codes.as) { context.fillStyle = worldColorAsteroid; } 204 | if(world.codes.de) { 205 | context.fillStyle = worldColorDesert; 206 | } 207 | if(world.codes.ic) { context.fillStyle = worldColorIce; } 208 | if(world.codes.va && (world.hyd < 1)) { context.fillStyle = worldColorVaccuum; } 209 | if(world.codes.wa) { 210 | context.fillStyle = worldColorWater; 211 | } 212 | if(world.atm == 10) { context.fillStyle = worldColorExotic; }; 213 | 214 | context.arc(hex.centerX,hex.centerY,worldRadius,0,Math.PI*2,true); 215 | context.fill(); 216 | context.closePath(); 217 | 218 | // TEMP: Dots for alignment, remove later 219 | //context.fillStyle = "#F00"; 220 | //context.fillRect(hex.centerX,hex.centerY,1,1); 221 | //context.fillRect(hex.centerX,hex.centerY - (hex.r * .5),1,1); 222 | } 223 | 224 | /* Takes a world object and a Canvas context and draws the world name */ 225 | function drawName(world,context){ 226 | 227 | var hex = getWorldHex(world); 228 | var wName = world.name; 229 | 230 | // Over 1 Billion is CAPS 231 | if(world.pop > 8){ wName = wName.toUpperCase(); } 232 | 233 | context.font = nameStyle + " " + nameSize + " " + nameFont; 234 | context.textAlign = "center"; 235 | context.fillStyle = nameColor; 236 | // TODO: Subsec capitals are colored Cx = Sec Cap 237 | if(world.codes.cp || world.codes.cx) { context.fillStyle = nameColorCapital; } 238 | context.fillText(wName,hex.centerX,hex.centerY + hex.r - (hex.s * 0.1)); 239 | } 240 | 241 | /* Takes a world object and a Canvas context and draws starport indicator */ 242 | function drawStarport(world,context){ 243 | 244 | var hex = getWorldHex(world); 245 | 246 | // Starport Letter 247 | context.font = "bold " + (hex.s * 0.3) + "px " + textFont; 248 | context.textAlign = "center"; 249 | context.fillStyle = stpColor; 250 | context.fillText(world.stp,hex.centerX,hex.centerY - (hex.r * 0.3)); 251 | } 252 | 253 | /* Takes a world object and a Canvas context and draws a travel zone indicator if any */ 254 | function drawTravelZone(world,context){ 255 | 256 | var hex = getWorldHex(world); 257 | 258 | if(world.zone == 1){ context.strokeStyle = zoneAmberColor; } // AMBER 259 | else if(world.zone == 2){ context.strokeStyle = zoneRedColor; } // RED 260 | else { return; } 261 | context.beginPath(); 262 | context.lineWidth = travelZoneLineWidth; 263 | context.lineCap = "round"; 264 | context.arc(hex.centerX,hex.centerY,(HEXSIZE / 3) * 2,0.75 * Math.PI,0.25 * Math.PI,false); 265 | context.stroke(); 266 | context.closePath(); 267 | } 268 | 269 | /* Takes a world object and a Canvas context and draws gas giant indicator if any */ 270 | function drawGasGiant(world,context){ 271 | 272 | var hex = getWorldHex(world); 273 | 274 | context.beginPath(); 275 | context.fillStyle = stpColor; 276 | context.arc(hex.centerX + (hex.s * 0.5),hex.centerY - (hex.r * 0.33),(hex.s / 15),0,Math.PI*2,true); 277 | context.fill(); 278 | context.closePath(); 279 | } 280 | 281 | /* Takes a world object and a Canvas context and draws base indicators if any */ 282 | function drawBases(world,context){ 283 | 284 | var hex = getWorldHex(world); 285 | 286 | // Base Indicators - Naval: Star, Scout: Triangle, Military: Diamond? 287 | if(world.base == "N" || world.base == "A"){ drawStar(context,hex); } 288 | if(world.base == "S" || world.base == "A"){ drawTriangle(context,hex); } 289 | if(world.base == "M"){ drawSquare(context,hex); } 290 | } 291 | 292 | 293 | /* UTILITY DRAW FUNCTIONS */ 294 | 295 | /* Takes a world object and returns a hex object for that world */ 296 | function getWorldHex(world){ 297 | // Split hex string into x and y and get zero based column and row 298 | var col = parseInt(world.hex.substr(0,2),10) - 1; 299 | var row = parseInt(world.hex.substr(2,2),10) - 1; 300 | 301 | return getHex(col,row); 302 | } 303 | 304 | /* Takes a hex column and row and returns a hex object with coordinate information for drawing */ 305 | function getHex(col,row){ 306 | var hex = {points: []}; 307 | var p0 = {}, p1 = {}, p2 = {}, p3 = {}, p4 = {}, p5 = {}; 308 | 309 | hex.col = col + 1; 310 | hex.row = row + 1; 311 | 312 | // Hex size calculations (flat side horizontal) 313 | hex.s = HEXSIZE; // Length of side 314 | // Width from hex point to start of side 315 | hex.h = Math.abs(Math.sin(30*Math.PI/180) * hex.s); 316 | // Height from center point to flat side 317 | hex.r = Math.abs(Math.cos(30*Math.PI/180) * hex.s); 318 | hex.b = hex.s + (2*hex.h); // Width (point to point) 319 | hex.p = hex.b * 0.5; // Center to point 320 | hex.a = 2*hex.r; // Height (side to side) 321 | 322 | // Point 0 323 | p0.x = 0 + (col * (hex.h + hex.s)); 324 | if(col%2){ // if odd else even 325 | p0.y = (2 * hex.r) + (row * 2 * hex.r); 326 | }else{ 327 | p0.y = hex.r + (row * 2 * hex.r); 328 | } 329 | hex.points.push(p0); 330 | 331 | // Point 1 332 | p1.x = p0.x + hex.h; 333 | p1.y = p0.y + hex.r; 334 | hex.points.push(p1); 335 | 336 | // Point 2 337 | p2.x = p1.x + hex.s; 338 | p2.y = p1.y; 339 | hex.points.push(p2); 340 | 341 | // Point 3 342 | p3.x = p2.x + hex.h; 343 | p3.y = p2.y - hex.r; 344 | hex.points.push(p3); 345 | 346 | // Point 4 347 | p4.x = p3.x - hex.h; 348 | p4.y = p3.y - hex.r; 349 | hex.points.push(p4); 350 | 351 | // Point 5 352 | p5.x = p4.x - hex.s; 353 | p5.y = p4.y; 354 | hex.points.push(p5); 355 | 356 | hex.centerX = hex.points[0].x + (hex.b * 0.5); 357 | hex.centerY = hex.points[0].y; 358 | 359 | return hex; 360 | } 361 | 362 | /* Draws a triangle in a hex to indicate a scout base */ 363 | function drawTriangle(context,hex){ 364 | 365 | var side = HEXSIZE / 6.25; 366 | var a = Math.sqrt(Math.pow(side,2) - Math.pow(side * 0.5,2)); 367 | var x = hex.centerX - (hex.s * 0.5); 368 | var y = hex.centerY + (hex.r * 0.33) - (a * 0.5); 369 | 370 | context.beginPath(); 371 | context.fillStyle = stpColor; 372 | context.moveTo(x,y); 373 | context.lineTo(x+(side * 0.5),y+a); 374 | context.lineTo(x-(side * 0.5),y+a); 375 | context.lineTo(x,y); 376 | 377 | context.fill(); 378 | context.closePath(); 379 | } 380 | 381 | /* Draws a star in a hex to indicate a naval base */ 382 | function drawStar(context,hex){ 383 | // Sample star coords: 10,40 40,40 50,10 60,40 90,40 65,60 75,90 50,70 25,90 35,60 384 | context.beginPath(); 385 | context.fillStyle = stpColor; 386 | 387 | var x = hex.centerX - (hex.s * 0.5) - (HEXSIZE/10); 388 | var y = hex.centerY - (hex.r * 0.33) - Math.sqrt((HEXSIZE/10.666666)); 389 | 390 | context.moveTo(x,y); 391 | context.lineTo(x+(HEXSIZE/13.333333),y); 392 | context.lineTo(x+(HEXSIZE * 0.1),y-(HEXSIZE/13.333333)); 393 | context.lineTo(x+(HEXSIZE/8),y); 394 | context.lineTo(x+(HEXSIZE * 0.2),y); 395 | context.lineTo(x+(HEXSIZE/7.272727),y+(HEXSIZE * 0.05)); 396 | context.lineTo(x+(HEXSIZE/6.153846),y+(HEXSIZE/8)); 397 | context.lineTo(x+(HEXSIZE * 0.1),y+(HEXSIZE/13.333333)); 398 | context.lineTo(x+(HEXSIZE/26.666665),y+(HEXSIZE/8)); 399 | context.lineTo(x+(HEXSIZE/16),y+(HEXSIZE * 0.05)); 400 | context.lineTo(x,y); 401 | context.fill(); 402 | context.closePath(); 403 | } 404 | 405 | /* Draws a triangle in a hex to indicate a scout base */ 406 | function drawSquare(context,hex){ 407 | 408 | var side = HEXSIZE / 7; 409 | var x = hex.centerX - (hex.s * 0.5) - (side * 0.5); 410 | var y = hex.centerY - (hex.r * 0.33) - (side * 0.5); 411 | 412 | context.beginPath(); 413 | context.fillStyle = stpColor; 414 | context.moveTo(x,y); 415 | context.lineTo(x+side,y); 416 | context.lineTo(x+side,y+side); 417 | context.lineTo(x,y+side); 418 | context.lineTo(x,y); 419 | context.fill(); 420 | context.closePath(); 421 | } 422 | 423 | /* */ 424 | function drawRoute(start,end,btn,context){ 425 | var sCol = hexCol(start) - 1; 426 | var sRow = hexRow(start) - 1; 427 | var eCol = hexCol(end) - 1; 428 | var eRow = hexRow(end) - 1; 429 | var startHex = getHex(sCol,sRow); 430 | var endHex = getHex(eCol,eRow); 431 | 432 | context.beginPath(); 433 | context.lineWidth = tradeLineWidth; 434 | context.strokeStyle = xboatRouteColor; 435 | if(btn >= 8){ context.strokeStyle = btn08RouteColor; } 436 | if(btn >= 9){ context.strokeStyle = btn09RouteColor; } 437 | if(btn >= 10){ context.strokeStyle = btn10RouteColor; } 438 | if(btn >= 11){ context.strokeStyle = btn11RouteColor; } 439 | if(btn >= 12){ context.strokeStyle = btn12RouteColor; } 440 | 441 | context.moveTo(startHex.centerX,startHex.centerY); 442 | context.lineTo(endHex.centerX,endHex.centerY); 443 | 444 | context.stroke(); 445 | context.closePath(); 446 | } -------------------------------------------------------------------------------- /generateSector.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Untitled Document 5 | 6 | 7 | 8 | 24 | 25 | 26 |
27 |
28 |
29 | 30 | 68 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /readSector.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Untitled Document 5 | 6 | 7 | 12 | 13 | 19 | 20 | 21 |
22 | 23 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /testSector.txt: -------------------------------------------------------------------------------- 1 | IyBHZW5lcmF0ZWQgYnkgaHR0cDovL3d3dy50cmF2ZWxsZXJtYXAuY29tDQojIDIwMTItMDMtMzBUMDc6MTk6MzQtMDc6MDANCg0KIyBDb3JlDQojIDAsMA0KDQojIE5hbWU6IENvcmUNCiMgTmFtZTogVWthbiAodmkpDQoNCiMgQXV0aG9yOiAgICBKb2UgRnVnYXRlDQojIFNvdXJjZTogICAgQXRsYXMgb2YgdGhlIEltcGVyaXVtLCBHRW5pZSAoY29ycmVjdGVkKSwgVHJhdmVsbGVycycgRGlnZXN0ICM4LCAjOSwgIzEwDQojIFJlZjogICAgICAgaHR0cDovL3RyYXZlbGxlci5tdS5vcmcvYXJjaGl2ZS9HZW5lcmFsL3NlY3RvcnMvY29yZS5zZWMNCg0KIyBTdWJzZWN0b3IgQTogQXBnZQ0KIyBTdWJzZWN0b3IgQjogUGVyaXRlDQojIFN1YnNlY3RvciBDOiBBbWVyb3MNCiMgU3Vic2VjdG9yIEQ6IFNoaW5rYW4NCiMgU3Vic2VjdG9yIEU6IFNhbmNoZXMNCiMgU3Vic2VjdG9yIEY6IE1la2VlDQojIFN1YnNlY3RvciBHOiBDb3JlDQojIFN1YnNlY3RvciBIOiBLYXNraWkNCiMgU3Vic2VjdG9yIEk6IEJ1bmtlcmlhDQojIFN1YnNlY3RvciBKOiBDZW1wbGFzDQojIFN1YnNlY3RvciBLOiBDaGFudA0KIyBTdWJzZWN0b3IgTDogRGluZ3RyYQ0KIyBTdWJzZWN0b3IgTTogQ2FkaW9uDQojIFN1YnNlY3RvciBOOiBDaCduYWFyDQojIFN1YnNlY3RvciBPOiBEdW5lYQ0KIyBTdWJzZWN0b3IgUDogU2FyZWdvbg0KDQojIEFsbGVnOiBJbTogIlRoaXJkIEltcGVyaXVtIg0KIyBBbGxlZzogU3k6ICJTeWxlYW4gRmVkZXJhdGlvbiINCg0KIDEtMjU6IE5hbWUNCjI3LTMwOiBIZXhOYnINCjMyLTQwOiBVV1ANCiAgIDQyOiBCYXNlcw0KNDQtNjg6IFJlbWFya3MgJiBDb21tZW50cw0KICAgNzA6IFpvbmUNCjcyLTc0OiBQQkcNCjc2LTc3OiBBbGxlZ2lhbmNlDQo3OS05ODogU3RlbGxhciBEYXRhDQoNCklya2lna2hhbiAgICAgICAgICAgICAgICAgMDEwMyBFNTQ1MzZBLTIgICBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgNzAwIEltIE00ViAgICAgICAgICAgICAgICAgDQpTaGFuYSBNYSAgICAgICAgICAgICAgICAgIDAxMDQgRTM1MTExMi05ICAgTG8gTmkgUG8gICAgICAgICAgICAgICAgICAgIDkwMyBJbSBLMklWIE03RCAgICAgICAgICAgIA0KTmlpemVkaWp1ICAgICAgICAgICAgICAgICAwMTA2IEI5QzY4ODYtOSBOICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MDQgSW0gQTFWICAgICAgICAgICAgICAgICANClBlciAgICAgICAgICAgICAgICAgICAgICAgMDExMiBBNjczMzEwLUIgICBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgMTAzIEltIE02ViBNMEQgICAgICAgICAgICAgDQpLaGlzaGkgICAgICAgICAgICAgICAgICAgIDAxMTMgQzc5ODIwMC1EICAgTG8gTmkgRmwgICAgICAgICAgICAgICAgICAgIDMwMyBJbSBNNlYgICAgICAgICAgICAgICAgIA0KS2hpZCAgICAgICAgICAgICAgICAgICAgICAwMTE0IEIyNTA0MDEtQyBBIExvIE5pIFBvIERlICAgICAgICAgICAgICAgICAyMjAgSW0gTTFWICAgICAgICAgICAgICAgICANCklkcHV1ICAgICAgICAgICAgICAgICAgICAgMDExNiBCNDg1NjU2LUEgICBBZyBOaSBSaSAgICAgICAgICAgICAgICAgICAgODExIEltIE00ViAgICAgICAgICAgICAgICAgDQpOZWtpICAgICAgICAgICAgICAgICAgICAgIDAxMTcgQjY2NDQ4OS04IE4gTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDUxMCBJbSBNMElJSSBNOVYgTTREICAgICAgIA0KS2VpbiAgICAgICAgICAgICAgICAgICAgICAwMTIwIEMyNDQ0MDMtQyAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA2MDAgSW0gSzJWICAgICAgICAgICAgICAgICANCkxhcnNhbHV1ICAgICAgICAgICAgICAgICAgMDEyNSBCNjY0MDAwLUMgICBMbyBOaSBCYSAgICAgICAgICAgICAgICAgICAgODEwIEltIE02ViBNMUQgICAgICAgICAgICAgDQpEZXNlY2EgICAgICAgICAgICAgICAgICAgIDAxMjYgQjI0MTc2Mi1CICAgUG8gICAgICAgICAgICAgICAgICAgICAgICAgIDUxMyBJbSBHN1ZJIE00RCAgICAgICAgICAgIA0KTWFyc3VzICAgICAgICAgICAgICAgICAgICAwMTI3IEI1Nzg1OTgtQiBBIEFnIE5pICAgICAgICAgICAgICAgICAgICAgICAzMTQgSW0gTTFWICAgICAgICAgICAgICAgICANClByb3RhbHVzICAgICAgICAgICAgICAgICAgMDEyOCBCNTU5NDYzLUIgTiBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgMTIzIEltIEswViAgICAgICAgICAgICAgICAgDQpMYXNsaWkgTWlpICAgICAgICAgICAgICAgIDAxMjkgQjk4NDMzMS04ICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDUyMiBJbSBNOVYgICAgICAgICAgICAgICAgIA0KS2F0b2NrICAgICAgICAgICAgICAgICAgICAwMTMwIEUyMDAzMDEtQyAgIExvIE5pIFZhICAgICAgICAgICAgICAgICAgICAxMDIgSW0gTTJWIE0wRCAgICAgICAgICAgICANCkxhc2ggICAgICAgICAgICAgICAgICAgICAgMDEzMiBCNzZBMjAwLUUgQSBMbyBOaSBXYSAgICAgICAgICAgICAgICAgICAgNTIxIEltIEszViBNMEQgICAgICAgICAgICAgDQpIb2x0ICAgICAgICAgICAgICAgICAgICAgIDAxMzMgQjhENzM0Ni1DIE4gTG8gTmkgRmwgICAgICAgICAgICAgICAgICAgIDkxNSBJbSBHNVYgICAgICAgICAgICAgICAgIA0KQmxhbnVtICAgICAgICAgICAgICAgICAgICAwMTM0IEI0MjE2NzctQiBOIE5hIE5pIFBvICAgICAgICAgICAgICAgICAgICAyMDMgSW0gTTVJViAgICAgICAgICAgICAgICANCk1haXNodW4gICAgICAgICAgICAgICAgICAgMDEzNSBCNjY3NTg3LUMgTiBBZyBOaSAgICAgICAgICAgICAgICAgICAgICAgMjA0IEltIE00ViAgICAgICAgICAgICAgICAgDQpaaXJpcyAgICAgICAgICAgICAgICAgICAgIDAxMzggQTg3MzAwMC1BICAgTG8gTmkgQmEgICAgICAgICAgICAgICAgICAgIDcwMiBJbSBNMlYgICAgICAgICAgICAgICAgIA0KRGFzaHUgQWFyZGlyICAgICAgICAgICAgICAwMTM5IEI4N0ExMjAtRCBOIExvIE5pIFdhICAgICAgICAgICAgICAgICAgQSA2MTMgSW0gTTFWIE0zRCAgICAgICAgICAgICANClJlZmVyZW5jZSAgICAgICAgICAgICAgICAgMDE0MCBEMTAwMTAwLUIgQSBMbyBOaSBWYSBScyAgICAgICAgICAgICAgICAgMzAwIEltIEswViAgICAgICAgICAgICAgICAgDQpBemltdXRoICAgICAgICAgICAgICAgICAgIDAyMDIgQjg0NzQyNy1DIE4gTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDIwMCBJbSBNMlYgTTdEICAgICAgICAgICAgIA0KS2hhdXIgR2EgICAgICAgICAgICAgICAgICAwMjAzIEIyMzQzMTQtRiBOIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA2MDAgSW0gSzFWICAgICAgICAgICAgICAgICANCkdla3NoaWl1dW4gICAgICAgICAgICAgICAgMDIwOCBENTI3NTI0LTcgICBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgOTIzIEltIEY5SVYgICAgICAgICAgICAgICAgDQpVcmFzICAgICAgICAgICAgICAgICAgICAgIDAyMTAgQTc5NzY3OS1EICAgQWcgTmkgICAgICAgICAgICAgICAgICAgICAgIDcwMSBJbSBNMlYgTTdEICAgICAgICAgICAgIA0KR2lyICAgICAgICAgICAgICAgICAgICAgICAwMjEyIEI2NDU0MzctQyBOIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA0MDMgSW0gSzZJSSBNN0QgICAgICAgICAgICANCkVtdXVpcyAgICAgICAgICAgICAgICAgICAgMDIxNiBCNDIyMzY5LUMgTiBMbyBOaSBQbyAgICAgICAgICAgICAgICAgICAgMTA0IEltIE05SVYgTTBEICAgICAgICAgICAgDQpEYXJuaWkgS2ltaSAgICAgICAgICAgICAgIDAyMTggRDg3ODc3Qi04IFMgQWcgUmkgICAgICAgICAgICAgICAgICAgICAgIDkxNCBJbSBNMFYgICAgICAgICAgICAgICAgIA0KSW5pciAgICAgICAgICAgICAgICAgICAgICAwMjIwIEQ4OEE0NDgtOCAgIExvIE5pIFdhICAgICAgICAgICAgICAgICAgICA1MDMgSW0gRzJWICAgICAgICAgICAgICAgICANCkthbiAgICAgICAgICAgICAgICAgICAgICAgMDIyMSBBNzg5NTY3LUQgTiBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgODA1IEltIEcxViAgICAgICAgICAgICAgICAgDQpBa21pciBBc2ggICAgICAgICAgICAgICAgIDAyMjIgRTIxMDY2OS04ICAgTmEgTmkgICAgICAgICAgICAgICAgICAgICAgIDcwNSBJbSBHMVYgICAgICAgICAgICAgICAgIA0KTGluZGJhciAgICAgICAgICAgICAgICAgICAwMjI0IEUyMzQxNDctNiAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICAxMDMgSW0gTThWICAgICAgICAgICAgICAgICANCkhla3RhbHVzICAgICAgICAgICAgICAgICAgMDIyOCBCNTY1MzAxLUEgTiBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgOTIwIEltIE01ViAgICAgICAgICAgICAgICAgDQpSdXNodWdpbSAgICAgICAgICAgICAgICAgIDAyMzEgRTg2OTM3Mi02ICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDcxMSBJbSBHMVYgTThEICAgICAgICAgICAgIA0KU2lzaGFyICAgICAgICAgICAgICAgICAgICAwMjM0IEI2Njc0MjAtQyAgIE5pICAgICAgICAgICAgICAgICAgICAgICAgICAyMDQgSW0gTTRWIE04RCAgICAgICAgICAgICANClR1dXJxYSBHYWFzaCAgICAgICAgICAgICAgMDIzNiBENjcxNDQzLTkgICBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgMTAzIEltIEc5SVYgICAgICAgICAgICAgICAgDQpCcmVraW4gICAgICAgICAgICAgICAgICAgIDAyNDAgQjU4NzQ4Qy1BICAgTmkgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMCBJbSBNMlYgTTdEICAgICAgICAgICAgIA0KS2hhYW0gICAgICAgICAgICAgICAgICAgICAwMzAyIEI1OTc0ODgtOSBOIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA3MDEgSW0gTTFWICAgICAgICAgICAgICAgICANCkt1dW5hYSAgICAgICAgICAgICAgICAgICAgMDMwNCBCOEI1MzY0LUIgTiBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgODIzIEltIE02ViAgICAgICAgICAgICAgICAgDQpNdXVkZXNoaSAgICAgICAgICAgICAgICAgIDAzMDUgQTEwMDhBOC1EICAgTmEgVmEgICAgICAgICAgICAgICAgICAgICAgIDYwMSBJbSBHMVYgICAgICAgICAgICAgICAgIA0KS2lpZCAgICAgICAgICAgICAgICAgICAgICAwMzA2IEM3ODY1ODctQiBTIEFnIE5pICAgICAgICAgICAgICAgICAgICAgICA0MjIgSW0gTTFWICAgICAgICAgICAgICAgICANClBhc2xpaXIgICAgICAgICAgICAgICAgICAgMDMwNyBCMjc0NjYzLTkgICBBZyBOaSBSaSAgICAgICAgICAgICAgICAgICAgMTAwIEltIEswViAgICAgICAgICAgICAgICAgDQpTaGFyICAgICAgICAgICAgICAgICAgICAgIDAzMDggQjY4ODEyNi1BIE4gTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDkxNCBJbSBNNlYgICAgICAgICAgICAgICAgIA0KTWFnICAgICAgICAgICAgICAgICAgICAgICAwMzEwIEU4ODgyNDEtNSAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA4MDIgSW0gTTdWIEs4RCAgICAgICAgICAgICANCk1haXNoIEFrdXNoICAgICAgICAgICAgICAgMDMxMyBCMzMyNDU0LUIgQSBMbyBOaSBQbyAgICAgICAgICAgICAgICAgICAgNTAzIEltIE00ViAgICAgICAgICAgICAgICAgDQpNYWFyc2hpZ2VydmxpZyAgICAgICAgICAgIDAzMTQgQjhBNTg4QS05ICAgRmwgICAgICAgICAgICAgICAgICAgICAgICAgIDMxNCBJbSBLNklJSSBNNUQgICAgICAgICAgIA0KRGFua2FobGFzICAgICAgICAgICAgICAgICAwMzE1IEI2ODU1NDEtQyAgIEFnIE5pICAgICAgICAgICAgICAgICAgICAgICA5MDQgSW0gTTNWIE0xRCAgICAgICAgICAgICANCkR1ZGluICAgICAgICAgICAgICAgICAgICAgMDMxNiBENTI4QTg5LUQgUyBIaSBJbiAgICAgICAgICAgICAgICAgICAgICAgNjI0IEltIE05ViAgICAgICAgICAgICAgICAgDQpVdXJ6ZSAgICAgICAgICAgICAgICAgICAgIDAzMTkgQjIzNDIyMC1GICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDQxNCBJbSBNMklWIEs3RCAgICAgICAgICAgIA0KQmVubHVyICAgICAgICAgICAgICAgICAgICAwMzIyIEIyNDIyNzUtRSBXIExvIE5pIFBvICAgICAgICAgICAgICAgICAgICAyMDQgSW0gTTFWICAgICAgICAgICAgICAgICANClZsaWdhICAgICAgICAgICAgICAgICAgICAgMDMyNCBCNDEzNzc3LUIgTiBOYSBJYyAgICAgICAgICAgICAgICAgICAgICAgMTAxIEltIE0zViAgICAgICAgICAgICAgICAgDQpJa2FydXMgICAgICAgICAgICAgICAgICAgIDAzMjUgQjIxMDc1Ny1DIFMgTmEgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMyBJbSBNMklWICAgICAgICAgICAgICAgIA0KQmVsbHVtICAgICAgICAgICAgICAgICAgICAwMzI2IEIzNDA0MDEtQiBOIE5pIFBvIERlICAgICAgICAgICAgICAgICAgICA3MDQgSW0gTTRWIE03RCAgICAgICAgICAgICANCkZlcm90ICAgICAgICAgICAgICAgICAgICAgMDMyOCBCMjUzNDMyLUQgICBOaSBQbyAgICAgICAgICAgICAgICAgICAgICAgMzExIEltIE0zRCAgICAgICAgICAgICAgICAgDQpLaWlyaXMgICAgICAgICAgICAgICAgICAgIDAzMzEgRTEwMDU5Qy03ICAgTmkgVmEgICAgICAgICAgICAgICAgICAgICAgIDcyNCBJbSBLNFYgTTBEICAgICAgICAgICAgIA0KUXVuZ3d5bGQgICAgICAgICAgICAgICAgICAwMzMyIEE2NTU1NjEtQSAgIEFnIE5pICAgICAgICAgICAgICAgICAgICAgICAyMDMgSW0gTTRWIE05RCAgICAgICAgICAgICANClNpcmtpaW4gICAgICAgICAgICAgICAgICAgMDMzNCBBOTk5MzEwLUMgUyBMbyBOaSBGbCAgICAgICAgICAgICAgICAgICAgNTIzIEltIE0xViBNOUQgTTJEICAgICAgICAgDQpNYXJrdW4gICAgICAgICAgICAgICAgICAgIDAzMzggQjg4NzEzNi05IEEgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDcwMCBJbSBLMFYgTTJEICAgICAgICAgICAgIA0KQXBnZSAgICAgICAgICAgICAgICAgICAgICAwNDAyIEE3NzI5OTctRiBXIEhpIEluIENwICAgICAgICAgICAgICAgICAgICA3MTAgSW0gTTJWICAgICAgICAgICAgICAgICANCklybGkgVW4gICAgICAgICAgICAgICAgICAgMDQwMyBCMDAwMjAwLUQgICBMbyBOaSBBcyAgICAgICAgICAgICAgICAgICAgNzA0IEltIE0xViAgICAgICAgICAgICAgICAgDQpEYWtlIEFnICAgICAgICAgICAgICAgICAgIDA0MDUgQzY3NDQ2Ny1CICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDcxNCBJbSBLMVYgTTVEICAgICAgICAgICAgIA0KQXJrYWcgS2EgICAgICAgICAgICAgICAgICAwNDA4IEI0NTM4NzUtRCAgIFBvICAgICAgICAgICAgICAgICAgICAgICAgICA0MDIgSW0gTTRWIE00RCAgICAgICAgICAgICANCkdpbiAgICAgICAgICAgICAgICAgICAgICAgMDQwOSBCOTk0NDQzLUMgTiBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgNDAyIEltIE0zViAgICAgICAgICAgICAgICAgDQpEYWFzYW1vayAgICAgICAgICAgICAgICAgIDA0MTAgQjc3OTVBRi1DIE4gTmkgICAgICAgICAgICAgICAgICAgICAgICAgIDMwMiBJbSBHNFYgTTZEICAgICAgICAgICAgIA0KS2FzaCAgICAgICAgICAgICAgICAgICAgICAwNDExIEQ1ODQzMDAtNyAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA0MDMgSW0gTTZWICAgICAgICAgICAgICAgICANClNoaWluYXVhICAgICAgICAgICAgICAgICAgMDQxNCBENDYxNTIwLTUgUyBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgNDEzIEltIE0xViAgICAgICAgICAgICAgICAgDQpTYW5jaGVzICAgICAgICAgICAgICAgICAgIDA0MTYgQTY1NDlDOS1GIEEgSGkgQ3AgICAgICAgICAgICAgICAgICAgICAgIDExMyBJbSBNMFYgICAgICAgICAgICAgICAgIA0KU2hhcmRpICAgICAgICAgICAgICAgICAgICAwNDE4IEUzMzM5OEEtQiAgIEhpIE5hIFBvICAgICAgICAgICAgICAgICAgICA2MDMgSW0gTTRWICAgICAgICAgICAgICAgICANCk5pcmdlbSAgICAgICAgICAgICAgICAgICAgMDQyMCBCNkE3NDIyLTkgTiBMbyBOaSBGbCAgICAgICAgICAgICAgICAgICAgMTA0IEltIEszViBNNUQgICAgICAgICAgICAgDQpHaXNoYWxlbSAgICAgICAgICAgICAgICAgIDA0MjEgQTg4NzMyNS1EICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDgyMiBJbSBHOFYgICAgICAgICAgICAgICAgIA0KQmFncmFhbiAgICAgICAgICAgICAgICAgICAwNDIzIEI0MDA1NTUtRiBTIE5pIFZhICAgICAgICAgICAgICAgICAgICAgICAyMDAgSW0gSzRWICAgICAgICAgICAgICAgICANCklybHUgICAgICAgICAgICAgICAgICAgICAgMDQyOCBCNTM1OThDLUYgTiBIaSAgICAgICAgICAgICAgICAgICAgICAgICAgNjEzIEltIEsyViBNNEQgICAgICAgICAgICAgDQpSZWxsZSAgICAgICAgICAgICAgICAgICAgIDA0MjkgQzlCOTY2NS1BICAgTmkgRmwgICAgICAgICAgICAgICAgICAgICAgIDcwNCBJbSBHNFYgICAgICAgICAgICAgICAgIA0KQmV0cmFzICAgICAgICAgICAgICAgICAgICAwNDMxIEI2MzQzMjAtQiBTIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA4MDQgSW0gSzVWICAgICAgICAgICAgICAgICANClJlbGVpcyAgICAgICAgICAgICAgICAgICAgMDQzMiBCMTUwNzc5LUUgUyBQbyBEZSAgICAgICAgICAgICAgICAgICAgICAgODA1IEltIEsySUlJIE00ViAgICAgICAgICAgDQpMeXRyYXMgICAgICAgICAgICAgICAgICAgIDA0MzcgQjQwMDY0My1BICAgTmEgTmkgVmEgICAgICAgICAgICAgICAgICAgIDQwNSBJbSBNNFYgICAgICAgICAgICAgICAgIA0KSW5kYXMgRGFraXIgICAgICAgICAgICAgICAwNDM5IEIxMTAxMDAtQyAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA2MDMgSW0gTTFWIE00RCAgICAgICAgICAgICANCkdhbnNoYXMgICAgICAgICAgICAgICAgICAgMDQ0MCBBNTNBNzc3LUUgICBXYSAgICAgICAgICAgICAgICAgICAgICAgICAgNTAzIEltIEcxViBNMkQgICAgICAgICAgICAgDQpOaWlyICAgICAgICAgICAgICAgICAgICAgIDA1MDIgQjc2QTIwNC1CIE4gTG8gTmkgV2EgICAgICAgICAgICAgICAgICAgIDgyMCBJbSBNMVYgTTNEICAgICAgICAgICAgIA0KRW1paWdhYXAgICAgICAgICAgICAgICAgICAwNTA1IEIxMzA2QUUtQSAgIE5hIE5pIFBvIERlICAgICAgICAgICAgICAgICA0MjQgSW0gTTFWICAgICAgICAgICAgICAgICANCkdhYWRpciAgICAgICAgICAgICAgICAgICAgMDUxMSBENDg2NzM2LTcgUyBBZyAgICAgICAgICAgICAgICAgICAgICAgICAgNDEyIEltIEYxSVYgICAgICAgICAgICAgICAgDQpBcmxhIFVuICAgICAgICAgICAgICAgICAgIDA1MTIgQjUxMzczMy1CIE4gTmEgSWMgICAgICAgICAgICAgICAgICAgICAgIDIwMiBJbSBBNUlWIEs5RCAgICAgICAgICAgIA0KS2FtYW4gICAgICAgICAgICAgICAgICAgICAwNTEzIEQ3NzIzMTItNSBTIExvIE5pICAgICAgICAgICAgICAgICAgICAgICAyMDMgSW0gSzBWICAgICAgICAgICAgICAgICANClJ1bmRhbiAgICAgICAgICAgICAgICAgICAgMDUxNiBCNzZBODQ1LTggTiBSaSBXYSAgICAgICAgICAgICAgICAgICAgICAgNTA0IEltIEswViAgICAgICAgICAgICAgICAgDQpTaGlnYSBTaGEgICAgICAgICAgICAgICAgIDA1MTcgRTcyNjAwMC0wICAgQmEgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMiBJbSBNMlYgICAgICAgICAgICAgICAgIA0KWmFuICAgICAgICAgICAgICAgICAgICAgICAwNTE5IEIxMDAxMDMtRSBOIExvIE5pIFZhICAgICAgICAgICAgICAgICAgICAyMTQgSW0gTTVJSUkgICAgICAgICAgICAgICANCkFtaWtoYWFrICAgICAgICAgICAgICAgICAgMDUyMiBFMzYyNTU0LTggICBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgNTI0IEltIEYyViAgICAgICAgICAgICAgICAgDQpEaW5oZSAgICAgICAgICAgICAgICAgICAgIDA1MjMgQjU5MDQ0NC1EICAgTmkgRGUgICAgICAgICAgICAgICAgICAgICAgIDIwMyBJbSBLMUlWICAgICAgICAgICAgICAgIA0KQXNhbGFtICAgICAgICAgICAgICAgICAgICAwNTI2IEIyMDAzNDYtRCAgIExvIE5pIFZhICAgICAgICAgICAgICAgICAgICAxMjEgSW0gTTJWICAgICAgICAgICAgICAgICANClJheCAgICAgICAgICAgICAgICAgICAgICAgMDUyNyBBMzU3MTEwLUIgTiBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgMTE1IEltIEc5ViBNM0QgICAgICAgICAgICAgDQpJcmR1ICAgICAgICAgICAgICAgICAgICAgIDA1MjkgQjM4NjUyMS1DIE4gQWcgTmkgICAgICAgICAgICAgICAgICAgICAgIDUxMiBJbSBNNFYgTTVEICAgICAgICAgICAgIA0KVGFyc2hpaSAgICAgICAgICAgICAgICAgICAwNTMwIEQ0MzM1NjUtNyBTIE5pIFBvICAgICAgICAgICAgICAgICAgICAgICA1MDQgSW0gTTRWIE00RCAgICAgICAgICAgICANCkNhZGlvbiAgICAgICAgICAgICAgICAgICAgMDUzMSBCNjU1ODY0LUEgTiBDcCAgICAgICAgICAgICAgICAgICAgICAgICAgNDAwIEltIEsyViBNOEQgICAgICAgICAgICAgDQpMaWEgICAgICAgICAgICAgICAgICAgICAgIDA1MzcgRTY1NDk4OC1BICAgSGkgICAgICAgICAgICAgICAgICAgICAgICAgIDcwMiBJbSBGNFYgICAgICAgICAgICAgICAgIA0KRGFzaGdhZCAgICAgICAgICAgICAgICAgICAwNjAzIEIxNDAxMDMtRiAgIExvIE5pIFBvIERlICAgICAgICAgICAgICAgICA4MDEgSW0gRzFWICAgICAgICAgICAgICAgICANCktodXVtaWFtICAgICAgICAgICAgICAgICAgMDYwNiBDNzM2NzU3LUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjExIEltIE0wViAgICAgICAgICAgICAgICAgDQpLaHVraGkgICAgICAgICAgICAgICAgICAgIDA2MTIgQjY2Nzg5OC05ICAgUmkgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMCBJbSBGM1YgTTdEICAgICAgICAgICAgIA0KSWdnYWFyICAgICAgICAgICAgICAgICAgICAwNjE5IEI3NTg4QTgtQSBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MTUgSW0gSzNWICAgICAgICAgICAgICAgICANClRvbGFzZWsgICAgICAgICAgICAgICAgICAgMDYyMiBBNjQ3Nzg5LUUgUyBBZyAgICAgICAgICAgICAgICAgICAgICAgICAgMzA0IEltIE0xViAgICAgICAgICAgICAgICAgDQpPbnRhciAgICAgICAgICAgICAgICAgICAgIDA2MjQgQjEwMDIxMy1FIEEgTG8gTmkgVmEgICAgICAgICAgICAgICAgICAgIDgwNCBJbSBNMVYgICAgICAgICAgICAgICAgIA0KU2VyaW1hYyAgICAgICAgICAgICAgICAgICAwNjM1IEI2NDI2NTItQSBOIE5pIFBvICAgICAgICAgICAgICAgICAgICAgICA5MDIgSW0gTTdWICAgICAgICAgICAgICAgICANClBhdHUgICAgICAgICAgICAgICAgICAgICAgMDYzNyBCNzk2Njc2LTcgUyBBZyBOaSAgICAgICAgICAgICAgICAgICAgICAgMjAzIEltIE00SUlJICAgICAgICAgICAgICAgDQpNYWFydXVyICAgICAgICAgICAgICAgICAgIDA3MDcgRTY5MjExMC1BICAgTG8gTmkgRmwgICAgICAgICAgICAgICAgICAgIDQyMCBJbSBLOFYgTTFEICAgICAgICAgICAgIA0KUnV1bmkgICAgICAgICAgICAgICAgICAgICAwNzEzIEIzMzM1NTctQyAgIE5pIFBvICAgICAgICAgICAgICAgICAgICAgICAyMDMgSW0gTThWICAgICAgICAgICAgICAgICANCktpaXNoYWQgICAgICAgICAgICAgICAgICAgMDcxNCBCNkE3OEJELUIgICBGbCAgICAgICAgICAgICAgICAgICAgICAgICAgMjIxIEltIEszViBNMUQgICAgICAgICAgICAgDQpVdXBpZyAgICAgICAgICAgICAgICAgICAgIDA3MTggRDc5NzExNC03ICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDQwNSBJbSBLNFYgICAgICAgICAgICAgICAgIA0KU2hpa2EgICAgICAgICAgICAgICAgICAgICAwNzIxIEQyNTE1NzktOSAgIE5pIFBvICAgICAgICAgICAgICAgICAgICAgICA2MDEgSW0gTTBWIE0wRCAgICAgICAgICAgICANCkt1dWRha2kgICAgICAgICAgICAgICAgICAgMDcyMiBCMzYxNTc2LUEgICBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgMzAyIEltIE0wViAgICAgICAgICAgICAgICAgDQpBbnRhciAgICAgICAgICAgICAgICAgICAgIDA3MjUgQjQxMTExMS1EIE4gTG8gTmkgSWMgICAgICAgICAgICAgICAgICAgIDIwMyBJbSBNOElJICAgICAgICAgICAgICAgIA0KRHJhbCAgICAgICAgICAgICAgICAgICAgICAwNzI3IEI3Mjg5NjctRiBTIEhpIEluIENwICAgICAgICAgICAgICAgICAgICA5MTIgSW0gRzNWIE0zRCAgICAgICAgICAgICANClp6dWdlcCAgICAgICAgICAgICAgICAgICAgMDczMSBCNDUzOUNELUMgICBIaSBQbyAgICAgICAgICAgICAgICAgICAgICAgMzAwIEltIE0xViAgICAgICAgICAgICAgICAgDQpGZXJyw6kgICAgICAgICAgICAgICAgICAgICAwNzM0IEM3OTc3NzgtNSBTIEFnICAgICAgICAgICAgICAgICAgICAgICAgICAzMDAgSW0gTTNWIE0zRCAgICAgICAgICAgICANClBhc2kgTWV0YWEgICAgICAgICAgICAgICAgMDczNSBENTg0NDc1LTQgUyBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgOTA0IEltIE0xViAgICAgICAgICAgICAgICAgDQpTaGFyYXNoICAgICAgICAgICAgICAgICAgIDA3MzcgQjg5ODY3NC04ICAgQWcgTmkgICAgICAgICAgICAgICAgICAgICAgIDgyMyBJbSBHMVYgTTNEICAgICAgICAgICAgIA0KR2FhZ2VuICAgICAgICAgICAgICAgICAgICAwODA2IEEyMTI1MzEtRiBOIE5pIEljICAgICAgICAgICAgICAgICAgICAgICAxMDAgSW0gTTJWICAgICAgICAgICAgICAgICANCktpa2ltICAgICAgICAgICAgICAgICAgICAgMDgwOCBENTc1MzM0LTQgUyBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgNzE0IEltIE0wSUkgTTZWICAgICAgICAgICAgDQpBbGVrdmFkaW4gICAgICAgICAgICAgICAgIDA4MTEgQjY3NTlBQi1FICAgSGkgSW4gICAgICAgICAgICAgICAgICAgICAgIDgwMiBJbSBNM1YgICAgICAgICAgICAgICAgIA0KS2FraHUgR2FzaCAgICAgICAgICAgICAgICAwODEyIEE4NDU4ODctOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MTQgSW0gRzRWIE00RCAgICAgICAgICAgICANCktlc2hpICAgICAgICAgICAgICAgICAgICAgMDgxNiBCNzkyNTY2LUMgICBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgNjEyIEltIEs0SUlJIE00RCAgICAgICAgICAgDQpJcnV1a3ppICAgICAgICAgICAgICAgICAgIDA4MjAgQjc3NjUxMC04ICAgQWcgTmkgICAgICAgICAgICAgICAgICAgICAgIDkwMCBJbSBLM1YgTTVEICAgICAgICAgICAgIA0KTGFsYW5kYXIgICAgICAgICAgICAgICAgICAwODIxIEEwMDAzMjItRiBTIExvIE5pIEFzICAgICAgICAgICAgICAgICAgICA5MDQgSW0gRzZWICAgICAgICAgICAgICAgICANCkR1bmxlayAgICAgICAgICAgICAgICAgICAgMDgyMiBCMTQwMDAwLUQgTiBMbyBOaSBQbyBEZSBCYSAgICAgICAgICAgICAgMTE0IEltIEc5ViBNOUQgICAgICAgICAgICAgDQpFc3MgTnV1ciAgICAgICAgICAgICAgICAgIDA4MjcgQjM1MDQwMC1DICAgTmkgUG8gRGUgICAgICAgICAgICAgICAgICAgIDYxMyBJbSBNMlYgICAgICAgICAgICAgICAgIA0KS3VyIExpbW11ICAgICAgICAgICAgICAgICAwODMxIEM1NDk0NDktQiAgIE5pICAgICAgICAgICAgICAgICAgICAgICAgICA2MTQgSW0gSzFWIE0xRCAgICAgICAgICAgICANCkJhaWxhYXplICAgICAgICAgICAgICAgICAgMDgzNSBENDM4MTEwLTYgUyBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgNTAzIEltIE02ViAgICAgICAgICAgICAgICAgDQpOaWdodCAgICAgICAgICAgICAgICAgICAgIDA4MzkgQTU3NDlDOS1GIE4gSGkgSW4gICAgICAgICAgICAgICAgICAgICAgIDMyMCBJbSBLOFZJIE00RCAgICAgICAgICAgIA0KS2FybmlrYSAgICAgICAgICAgICAgICAgICAwOTAxIEE3NTU4NzYtQiBOICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MDIgSW0gRzBWICAgICAgICAgICAgICAgICANCkRpc2FsICAgICAgICAgICAgICAgICAgICAgMDkwMyBFMDAwMzAwLTggICBMbyBOaSBBcyAgICAgICAgICAgICAgICAgICAgNjEzIEltIEs1ViAgICAgICAgICAgICAgICAgDQpTaGF6ZWt1ICAgICAgICAgICAgICAgICAgIDA5MDUgQjU1M0E4OC1GIE4gSGkgUG8gICAgICAgICAgICAgICAgICAgICAgIDEwMCBJbSBNMlYgTTdEICAgICAgICAgICAgIA0KTXV1bXV1ICAgICAgICAgICAgICAgICAgICAwOTA2IEI3NzY1OUQtRCBTIEFnIE5pICAgICAgICAgICAgICAgICAgICAgICA5MDIgSW0gTTNWIEs3RCAgICAgICAgICAgICANCkdpc2ggICAgICAgICAgICAgICAgICAgICAgMDkwNyBCNzc4Njg3LTkgUyBBZyBOaSBSaSAgICAgICAgICAgICAgICAgICAgOTMwIEltIEcwViBNN0QgICAgICAgICAgICAgDQpHaXNpZCAgICAgICAgICAgICAgICAgICAgIDA5MTAgRDU2NzEyNS00ICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDUwNSBJbSBLM1YgTTFEICAgICAgICAgICAgIA0KS2lrZWQgSWlnICAgICAgICAgICAgICAgICAwOTExIEM1NDU0NDgtQSAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA3MDMgSW0gTTNWICAgICAgICAgICAgICAgICANCk11c2tveGFoICAgICAgICAgICAgICAgICAgMDkxNSBBNTc3MjAwLUYgTiBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgNjEzIEltIE0zViAgICAgICAgICAgICAgICAgDQpJcnNoaWlzaCAgICAgICAgICAgICAgICAgIDA5MTYgQjk1QTU2Ny1CICAgTmkgV2EgICAgICAgICAgICAgICAgICAgICAgIDIwMSBJbSBHM1YgICAgICAgICAgICAgICAgIA0KTWFyaXhlIEthICAgICAgICAgICAgICAgICAwOTE5IEU1NTAwMDAtMCAgIEJhIERlICAgICAgICAgICAgICAgICAgICAgICAxMDQgSW0gTTFWICAgICAgICAgICAgICAgICANCldhc3RhbSAgICAgICAgICAgICAgICAgICAgMDkyMSBFNkE3Nzc3LTggICBGbCAgICAgICAgICAgICAgICAgICAgICAgICAgMzEwIEltIE00ViAgICAgICAgICAgICAgICAgDQpDZWxlbiAgICAgICAgICAgICAgICAgICAgIDA5MjIgQTM3NTAwMC1GIE4gTG8gTmkgQmEgICAgICAgICAgICAgICAgICAgIDMwMiBJbSBNMVYgICAgICAgICAgICAgICAgIA0KU2hlZHV1ICAgICAgICAgICAgICAgICAgICAwOTI5IEQ2NDk1NzctQSBTIE5pICAgICAgICAgICAgICAgICAgICAgICAgICA1MDAgSW0gTTNWIE02RCAgICAgICAgICAgICANClNpbmlpciBTYSAgICAgICAgICAgICAgICAgMDkzMSBBNTk5MzY3LUMgICBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgODE0IEltIEcwViAgICAgICAgICAgICAgICAgDQpLYXNpbWlyICAgICAgICAgICAgICAgICAgIDA5MzMgQjg4QTEwNC1CIEEgTG8gTmkgV2EgICAgICAgICAgICAgICAgICAgIDMxMSBJbSBLMklWICAgICAgICAgICAgICAgIA0KTWlzaGFhciAgICAgICAgICAgICAgICAgICAxMDAyIEIxNDBBQTgtRiBOIEhpIEluIFBvIERlICAgICAgICAgICAgICAgICA2MjAgSW0gQTJWICAgICAgICAgICAgICAgICANClV1c2xhICAgICAgICAgICAgICAgICAgICAgMTAwOCBCMzAyMzAxLUUgICBMbyBOaSBWYSBJYyAgICAgICAgICAgICAgICAgNDA0IEltIEszViAgICAgICAgICAgICAgICAgDQpMdXVtaWlsaWlwbGVuICAgICAgICAgICAgIDEwMDkgQjUzNjQ4OC1DIE4gTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDExMyBJbSBLNElWICAgICAgICAgICAgICAgIA0KVXVybXUgS3V1ICAgICAgICAgICAgICAgICAxMDEyIEI0MjQ0MDAtRiBOIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA1MjQgSW0gTTRWIE0wRCAgICAgICAgICAgICANClVzaHJhICAgICAgICAgICAgICAgICAgICAgMTAxNiBCMzYxOTY2LUQgVyBIaSBDcCAgICAgICAgICAgICAgICAgICAgICAgNzAzIEltIE0zViAgICAgICAgICAgICAgICAgDQpMaWdhIEthICAgICAgICAgICAgICAgICAgIDEwMTkgQjc4MzIwMC1DICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDkwMyBJbSBNMVYgTTFEICAgICAgICAgICAgIA0KS2FwbGlyICAgICAgICAgICAgICAgICAgICAxMDIyIEQ0NzMzMjItNiBTIExvIE5pICAgICAgICAgICAgICAgICAgICAgICAzMTMgSW0gRzBWICAgICAgICAgICAgICAgICANCklya2toYSAgICAgICAgICAgICAgICAgICAgMTAyMyBCMzIzNTU1LUIgICBOaSBQbyAgICAgICAgICAgICAgICAgICAgIEEgNTAwIEltIE0zViAgICAgICAgICAgICAgICAgDQpTaGFsYW0gICAgICAgICAgICAgICAgICAgIDEwMjggQzI1MDY0NC1BICAgTmkgUG8gRGUgICAgICAgICAgICAgICAgICAgIDQwMSBJbSBHM1YgICAgICAgICAgICAgICAgIA0KR2F2aW4gICAgICAgICAgICAgICAgICAgICAxMDMzIEI1NTYyMTUtRCBXIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA2MDQgSW0gTTRWIE04RCAgICAgICAgICAgICANCkdpa3VyICAgICAgICAgICAgICAgICAgICAgMTAzNCBDNTMzNzYyLTYgICBOYSBQbyAgICAgICAgICAgICAgICAgICAgICAgMjAwIEltIE00ViBNOUQgICAgICAgICAgICAgDQpNYWRhbGFnYWEgICAgICAgICAgICAgICAgIDEwMzUgQjU4MTY2Ni1BIFMgTmkgUmkgICAgICAgICAgICAgICAgICAgICAgIDUwMyBJbSBHMlYgTTFWICAgICAgICAgICAgIA0KS2h1dW5pc2ggICAgICAgICAgICAgICAgICAxMDM3IEQ1NDIyMDEtOSBTIExvIE5pIFBvICAgICAgICAgICAgICAgICAgICA2MjQgSW0gTTVWICAgICAgICAgICAgICAgICANCk1hdXIgTmEgICAgICAgICAgICAgICAgICAgMTAzOCBCMzU4Njk3LUMgICBBZyBOaSAgICAgICAgICAgICAgICAgICAgICAgOTE0IEltIE0zViAgICAgICAgICAgICAgICAgDQpEYXZsYSAgICAgICAgICAgICAgICAgICAgIDEwNDAgQjUyODIwMC1FICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDMyNSBJbSBNNVYgTTdEICAgICAgICAgICAgIA0KS2lpbWkgRGkgICAgICAgICAgICAgICAgICAxMTAxIEQxMjAyMzMtQiAgIExvIE5pIFBvIERlICAgICAgICAgICAgICAgICAyMDIgSW0gTTRWICAgICAgICAgICAgICAgICANCkdpcmlrYXNoICAgICAgICAgICAgICAgICAgMTEwMiBCNTk0MzQ0LUIgQSBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgNzI0IEltIE03ViAgICAgICAgICAgICAgICAgDQpSYWUgICAgICAgICAgICAgICAgICAgICAgIDExMDQgRTU4MDg1OS02ICAgUmkgRGUgICAgICAgICAgICAgICAgICAgICAgIDMyMyBJbSBHMVYgTTlEICAgICAgICAgICAgIA0KVXVtZWF4YW4gICAgICAgICAgICAgICAgICAxMTA4IEI3NjU4OTUtQiBBIFJpICAgICAgICAgICAgICAgICAgICAgICAgICA0MTQgSW0gTTRWICAgICAgICAgICAgICAgICANClV1cnV1biBLdXUgICAgICAgICAgICAgICAgMTEwOSBDOTg3MjQ2LTcgICBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgMTE0IEltIE02ViAgICAgICAgICAgICAgICAgDQpLaXNoICAgICAgICAgICAgICAgICAgICAgIDExMTIgQzMxMDQwMy05ICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDQyMiBJbSBNNFZJIE0zRCAgICAgICAgICAgIA0KQWRndXUgVXVuICAgICAgICAgICAgICAgICAxMTE0IEE1MjA4MzQtQiAgIE5hIFBvIERlICAgICAgICAgICAgICAgICAgICA1MDMgSW0gTTFWIE0zRCAgICAgICAgICAgICANClZsYWFnZXNoIElpcmtpICAgICAgICAgICAgMTExNiBCNzgzNTExLTggICBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgODAwIEltIEsxViBNNEQgICAgICAgICAgICAgDQpTaHV1bmtoYSAgICAgICAgICAgICAgICAgIDExMjAgQjM0MDdBNi1DIE4gUG8gRGUgICAgICAgICAgICAgICAgICAgICAgIDgwMyBJbSBNNFYgTTJEICAgICAgICAgICAgIA0KR3V1aXJrICAgICAgICAgICAgICAgICAgICAxMTIzIEExMDAxMzQtRiBOIExvIE5pIFZhICAgICAgICAgICAgICAgICAgICA4MjUgSW0gTTJWICAgICAgICAgICAgICAgICANClBpeHRvbWUgICAgICAgICAgICAgICAgICAgMTEyNCBBOEFBNDUzLUYgQSBOaSBGbCBXYSAgICAgICAgICAgICAgICAgICAgMTEyIEltIE0xViBNNEQgICAgICAgICAgICAgDQpJc2hpaXJhICAgICAgICAgICAgICAgICAgIDExMjUgRDY1MjU1Mi05IFMgTmkgUG8gICAgICAgICAgICAgICAgICAgICAgIDIxMCBJbSBNMVYgTTNEIE05RCAgICAgICAgIA0KR2FzaGlsICAgICAgICAgICAgICAgICAgICAxMTI5IEM2QTQ1MTEtOCAgIE5pIEZsICAgICAgICAgICAgICAgICAgICAgICA1MDQgSW0gSzNWIE0yRCAgICAgICAgICAgICANCk1lcmthYWtodSAgICAgICAgICAgICAgICAgMTEzMCBDNzlBNDY4LUMgUyBOaSBXYSAgICAgICAgICAgICAgICAgICAgICAgNTAxIEltIE05RCAgICAgICAgICAgICAgICAgDQpBdXJzaXMgICAgICAgICAgICAgICAgICAgIDExMzQgQTU0NTlCRC1GIEEgSGkgSW4gQ3AgICAgICAgICAgICAgICAgICAgIDUwMCBJbSBLMVYgICAgICAgICAgICAgICAgIA0KS2FhbWluZCAgICAgICAgICAgICAgICAgICAxMTQwIEJBRjM1NzktQSAgIE5pIEZsICAgICAgICAgICAgICAgICAgICAgICA4MDAgSW0gSzBWICAgICAgICAgICAgICAgICANCkthcmdpICAgICAgICAgICAgICAgICAgICAgMTIwMiBCNTY5NjUxLUQgICBOaSBSaSAgICAgICAgICAgICAgICAgICAgICAgMzA1IEltIE0zViBHOEQgICAgICAgICAgICAgDQpMaW1hc2hpbWlpICAgICAgICAgICAgICAgIDEyMDQgRTQ0NzAwMC0wICAgQmEgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMiBJbSBNNEQgICAgICAgICAgICAgICAgIA0KTWlpbGFwIEthcyAgICAgICAgICAgICAgICAxMjA1IEI1OTA4ODYtQiBBIERlICAgICAgICAgICAgICAgICAgICAgICAgICA0MDQgSW0gSzNWICAgICAgICAgICAgICAgICANCkd1dW4gICAgICAgICAgICAgICAgICAgICAgMTIxNCBFNTg1NTU1LTggICBBZyBOaSAgICAgICAgICAgICAgICAgICAgICAgNDEyIEltIEs0ViAgICAgICAgICAgICAgICAgDQpBbWVkICAgICAgICAgICAgICAgICAgICAgIDEyMTkgQjIxMDZCOS1DIE4gTmEgTmkgICAgICAgICAgICAgICAgICAgICAgIDcyMCBJbSBHMFYgTThEICAgICAgICAgICAgIA0KUmh1YW4gICAgICAgICAgICAgICAgICAgICAxMjIwIEIxMDAxMjItQyAgIExvIE5pIFZhICAgICAgICAgICAgICAgICAgICA2MDQgSW0gTTJWICAgICAgICAgICAgICAgICANClNodXVraGEgWnV1c2ggICAgICAgICAgICAgMTIyMSBCQUQ1NDQ2LTkgUyBOaSBGbCAgICAgICAgICAgICAgICAgICAgICAgMTEzIEltIEs2VkkgICAgICAgICAgICAgICAgDQpBcm1pICAgICAgICAgICAgICAgICAgICAgIDEyMjIgQjU3Nzg3NS04ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYxMyBJbSBHNFYgICAgICAgICAgICAgICAgIA0KTXVndXUgICAgICAgICAgICAgICAgICAgICAxMjIzIEQ1NTY0NDQtOSBTIE5pICAgICAgICAgICAgICAgICAgICAgICAgQSA5MzAgSW0gSzlJSUkgTTBEICAgICAgICAgICANCkVzaG9uICAgICAgICAgICAgICAgICAgICAgMTIyNSBFMzQxNzY2LTcgICBQbyAgICAgICAgICAgICAgICAgICAgICAgICAgNTEwIEltIE0wViAgICAgICAgICAgICAgICAgDQpTaGFuaWkgQXJkdXUgICAgICAgICAgICAgIDEyMjYgQTQ4NTMzNC1EICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDIyMiBJbSBNMFYgICAgICAgICAgICAgICAgIA0KTGlzaGlydXVkICAgICAgICAgICAgICAgICAxMjI4IEI2OTc5QUEtNyAgIEhpIEluICAgICAgICAgICAgICAgICAgICAgICAzMTMgSW0gTTdJViAgICAgICAgICAgICAgICANCkJhaXNpICAgICAgICAgICAgICAgICAgICAgMTIyOSBEMzU0NjlBLTUgICBBZyBOaSAgICAgICAgICAgICAgICAgICAgICAgNjEzIEltIE0zViBNNUQgICAgICAgICAgICAgDQpEaWFtIEthbmkgICAgICAgICAgICAgICAgIDEyMzIgQjEzMDU2My1EICAgTmkgUG8gRGUgICAgICAgICAgICAgICAgICAgIDcyMiBJbSBLMlYgICAgICAgICAgICAgICAgIA0KSWxsYXBwdSAgICAgICAgICAgICAgICAgICAxMjMzIEEzNzUwMjUtQiAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA0MjQgSW0gTTRWIE0wRCAgICAgICAgICAgICANCklzaG1hbCAgICAgICAgICAgICAgICAgICAgMTIzNiBCNDkxMzg0LUUgICBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgMzAzIEltIE01ViBNNEQgICAgICAgICAgICAgDQpNaWlrdXUgQXIgICAgICAgICAgICAgICAgIDEyMzcgRTZBNzc2MS03ICAgRmwgICAgICAgICAgICAgICAgICAgICAgICAgIDkwMyBJbSBLMFYgICAgICAgICAgICAgICAgIA0KS2lyYmFydXMgICAgICAgICAgICAgICAgICAxMjM5IEI1NDc3NTktRCBOIEFnICAgICAgICAgICAgICAgICAgICAgICAgICAzMDIgSW0gTTBWICAgICAgICAgICAgICAgICANCkFsbGFtdSAgICAgICAgICAgICAgICAgICAgMTI0MCBDMjIzMzA0LTkgUyBMbyBOaSBQbyAgICAgICAgICAgICAgICAgICAgMjE0IEltIEsySVYgTTdEICAgICAgICAgICAgDQpVdW1hYWQgTnVyaXIgICAgICAgICAgICAgIDEzMDIgQjc3ODQ3Ny1CICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDIwNCBJbSBLMFYgICAgICAgICAgICAgICAgIA0KQXNoZHV1bWEgICAgICAgICAgICAgICAgICAxMzA3IEM4OEE1NTMtQSAgIE5pIFdhICAgICAgICAgICAgICAgICAgICAgICAzMTAgSW0gTTBJSUkgTTREICAgICAgICAgICANCkFrdXNzYW5qYSAgICAgICAgICAgICAgICAgMTMwOCBFNTU3MDAwLTAgUyBCYSAgICAgICAgICAgICAgICAgICAgICAgICAgMTA0IEltIE00SUkgTThEICAgICAgICAgICAgDQpVdW5pbHV1ICAgICAgICAgICAgICAgICAgIDEzMDkgQjk0QTQzMi1CIE4gTG8gTmkgV2EgICAgICAgICAgICAgICAgICAgIDcwMSBJbSBNMlYgTTdEIE04RCAgICAgICAgIA0KTXVraWlkICAgICAgICAgICAgICAgICAgICAxMzE0IEI4NTkzMjMtQiBOIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA1MDIgSW0gSzJWICAgICAgICAgICAgICAgICANClNoaWlyYW5kICAgICAgICAgICAgICAgICAgMTMxNiBEODVBODY5LTYgICBXYSAgICAgICAgICAgICAgICAgICAgICAgICAgMjAyIEltIEs3ViBNNUQgICAgICAgICAgICAgDQpHaXBraWtoYXIgICAgICAgICAgICAgICAgIDEzMTcgQjIwMzQ2Mi1FIEEgTG8gTmkgVmEgSWMgICAgICAgICAgICAgICAgIDMxMiBJbSBLNFYgTTdEICAgICAgICAgICAgIA0KQWRrYWFzaCAgICAgICAgICAgICAgICAgICAxMzIwIEIyMjIyMDEtQiBOIExvIE5pIFBvICAgICAgICAgICAgICAgICAgICA5MDIgSW0gTTVWICAgICAgICAgICAgICAgICANClJlbnUgICAgICAgICAgICAgICAgICAgICAgMTMyMSBCNjY0NjhCLTcgICBBZyBOaSBSaSAgICAgICAgICAgICAgICAgICAgNjAwIEltIE00ViAgICAgICAgICAgICAgICAgDQpLZXBsbyAgICAgICAgICAgICAgICAgICAgIDEzMjIgQjY3NTg5OC1CIE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMyBJbSBNNFYgICAgICAgICAgICAgICAgIA0KQm9ndWV0aW4gICAgICAgICAgICAgICAgICAxMzIzIEEzMTA1QUMtRiBTIE5pICAgICAgICAgICAgICAgICAgICAgICAgICAxMDMgSW0gRzNWIE04RCAgICAgICAgICAgICANClVzaHRhciAgICAgICAgICAgICAgICAgICAgMTMyOCBCNjQ3NTU0LUQgTiBBZyBOaSAgICAgICAgICAgICAgICAgICAgICAgMzAyIEltIE00ViBNMEQgICAgICAgICAgICAgDQpDYWxlc3NvbiAgICAgICAgICAgICAgICAgIDEzMzAgQjY4NTY0My04ICAgQWcgTmkgUmkgICAgICAgICAgICAgICAgICAgIDIwMCBJbSBGM1YgTTdEICAgICAgICAgICAgIA0KQW5zaGFyICAgICAgICAgICAgICAgICAgICAxMzM0IEJBQ0EzN0ItQyAgIExvIE5pIEZsIFdhICAgICAgICAgICAgICAgICAxMTIgSW0gRzVWIE0wRCAgICAgICAgICAgICANClVta2FzaHV1ICAgICAgICAgICAgICAgICAgMTMzNSBCMzU0OUM5LUMgICBIaSAgICAgICAgICAgICAgICAgICAgICAgICAgMzIyIEltIE0yViAgICAgICAgICAgICAgICAgDQpLcmFpbiAgICAgICAgICAgICAgICAgICAgIDEzMzYgRUE5NzU5Ni00ICAgQWcgTmkgICAgICAgICAgICAgICAgICAgICAgIDUwMyBJbSBNM1YgTTBEICAgICAgICAgICAgIA0KUHJpbiAgICAgICAgICAgICAgICAgICAgICAxMzM4IEI2OTUzMDAtQyBOIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA5MDIgSW0gTTJWICAgICAgICAgICAgICAgICANCkdha3hhYWwgICAgICAgICAgICAgICAgICAgMTQwMyBFODk2MjAwLTYgICBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgNjIxIEltIEcxViAgICAgICAgICAgICAgICAgDQpJbWd1dSAgICAgICAgICAgICAgICAgICAgIDE0MDcgQjIwMDMyMC1CIFMgTG8gTmkgVmEgICAgICAgICAgICAgICAgICAgIDUyMCBJbSBNNVYgICAgICAgICAgICAgICAgIA0KVXVyZ2luICAgICAgICAgICAgICAgICAgICAxNDEwIEIyMTA2OUMtOSBBIE5hIE5pICAgICAgICAgICAgICAgICAgICAgICA4MDMgSW0gTTNWICAgICAgICAgICAgICAgICANCkltZGkgTWkgICAgICAgICAgICAgICAgICAgMTQxNiBCNjhBNDMwLTkgICBMbyBOaSBXYSAgICAgICAgICAgICAgICAgICAgMjA0IEltIE0yViBNOEQgICAgICAgICAgICAgDQpLaXNoZHVzaCAgICAgICAgICAgICAgICAgIDE0MTggQzY0NjQ4QS04IFMgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDgwMyBJbSBNM1YgTTFEICAgICAgICAgICAgIA0KQWVuZ2FyICAgICAgICAgICAgICAgICAgICAxNDIxIEI0MzY4NjgtQiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MjIgSW0gTTBWIE0wRCAgICAgICAgICAgICANCkNob3RhdWsgICAgICAgICAgICAgICAgICAgMTQyMiBDN0MyMDQ4LUIgICBMbyBOaSBGbCAgICAgICAgICAgICAgICAgICAgOTExIEltIEc3ViBNMUQgTThEICAgICAgICAgDQpLaHVzZ3VybHUgICAgICAgICAgICAgICAgIDE0MjQgQjY1MjlFRy1EIE4gSGkgUG8gICAgICAgICAgICAgICAgICAgICAgIDIxNCBJbSBNMUlWICAgICAgICAgICAgICAgIA0KVmFsYWFyIEFraGFsICAgICAgICAgICAgICAxNDI4IEE2NTY1NDEtQyAgIEFnIE5pICAgICAgICAgICAgICAgICAgICAgICA2MDAgSW0gSzZJSSBNOUQgTTJEICAgICAgICANCkFsdG9uICAgICAgICAgICAgICAgICAgICAgMTQzMCBCMTAwNTQyLUYgTiBOaSBWYSAgICAgICAgICAgICAgICAgICAgICAgNDAzIEltIEYxViBNMUQgICAgICAgICAgICAgDQpTYWFyICAgICAgICAgICAgICAgICAgICAgIDE0MzEgQzQ5NDA0Ni05IFMgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDkwMyBJbSBNN1YgICAgICAgICAgICAgICAgIA0KRGlpcm11dSAgICAgICAgICAgICAgICAgICAxNDM0IEM3NTUyMDMtQyAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA1MDMgSW0gTTJWICAgICAgICAgICAgICAgICANCkFydmxlc3NhaXNoICAgICAgICAgICAgICAgMTQzNiBFNkIwNzhCLTkgICBEZSAgICAgICAgICAgICAgICAgICAgICAgICAgNDAxIEltIEczViAgICAgICAgICAgICAgICAgDQpNaXNoYWEgICAgICAgICAgICAgICAgICAgIDE0MzcgQjlBODMxMS05IFMgTG8gTmkgRmwgICAgICAgICAgICAgICAgICAgIDkxMyBJbSBNNklJSSAgICAgICAgICAgICAgIA0KTWluZHV1biBTYW1tYWQgICAgICAgICAgICAxNDQwIEE1OEE2OUMtRiAgIE5pIFJpIFdhICAgICAgICAgICAgICAgICAgICAzMDMgSW0gTTRWICAgICAgICAgICAgICAgICANClpla3RpbmQgSXIgICAgICAgICAgICAgICAgMTUwMyBDNTM2ODMxLTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzA0IEltIE0wViAgICAgICAgICAgICAgICAgDQpLdXVtICAgICAgICAgICAgICAgICAgICAgIDE1MDUgQjY2NzU0Ni04IFMgQWcgTmkgICAgICAgICAgICAgICAgICAgICAgIDUxNCBJbSBLOUlJSSAgICAgICAgICAgICAgIA0KS2FrYWFndXVyICAgICAgICAgICAgICAgICAxNTA2IEM0ODY3OTYtOCAgIEFnIFJpICAgICAgICAgICAgICAgICAgICAgICA0MDQgSW0gSzNWICAgICAgICAgICAgICAgICANCkFzbWkgICAgICAgICAgICAgICAgICAgICAgMTUwOCBENjk3MjI2LTQgICBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgNTAwIEltIEc1ViAgICAgICAgICAgICAgICAgDQpLaW51dSAgICAgICAgICAgICAgICAgICAgIDE1MTAgRTExMDIzMi1CICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDIwMyBJbSBNMklJICAgICAgICAgICAgICAgIA0KQW1hbiBVcmsgICAgICAgICAgICAgICAgICAxNTExIEU0NDUyNzktNyAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICAyMjMgSW0gTThWIE02RCAgICAgICAgICAgICANCkFuc2hhbSAgICAgICAgICAgICAgICAgICAgMTUxMiBCOEMyNzQ3LTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODA0IEltIE01ViAgICAgICAgICAgICAgICAgDQpEZXBvdCAgICAgICAgICAgICAgICAgICAgIDE1MTggQTg2QTQyMi1GIEQgTG8gTmkgV2EgICAgICAgICAgICAgICAgICAgIDQyMCBJbSBNNElJSSAgICAgICAgICAgICAgIA0KU2hlciAgICAgICAgICAgICAgICAgICAgICAxNTE5IEQ5RDI2NjUtOCAgIE5pICAgICAgICAgICAgICAgICAgICAgICAgICA2MDMgSW0gTTJWIE03RCAgICAgICAgICAgICANClN1aHRsYW0gICAgICAgICAgICAgICAgICAgMTUyMiBCN0MwMDAwLUEgICBMbyBOaSBEZSBCYSAgICAgICAgICAgICAgICAgNjAwIEltIE03ViBNMEQgICAgICAgICAgICAgDQpCZWxpY29zZSAgICAgICAgICAgICAgICAgIDE1MjMgQTU5NjIzNi1DICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDcxMyBJbSBNM1YgTTREICAgICAgICAgICAgIA0KU2hpYmFzaGxpaW0gICAgICAgICAgICAgICAxNTI0IEI2MjZBOEMtRiBOIEhpIEluIENwICAgICAgICAgICAgICAgICAgICA0MTIgSW0gSzRWICAgICAgICAgICAgICAgICANCk5hZ2Flc2ggICAgICAgICAgICAgICAgICAgMTUyNiBFNDAzNDcyLTggICBOaSBWYSBJYyAgICAgICAgICAgICAgICAgICAgNjIzIEltIE0xViAgICAgICAgICAgICAgICAgDQpCaWlya2UgICAgICAgICAgICAgICAgICAgIDE1MjkgRDIxMDEwMS05ICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDUyNCBJbSBGOFYgTTVEICAgICAgICAgICAgIA0KU2FudGFnICAgICAgICAgICAgICAgICAgICAxNTMwIEI1NjMxMDEtRSBOIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA4MDIgSW0gTTVJViBNNkQgICAgICAgICAgICANCkVtc2hhIExhICAgICAgICAgICAgICAgICAgMTUzMSBDMzMzODlDLUIgICBOYSBQbyAgICAgICAgICAgICAgICAgICAgICAgODEzIEltIEszViBNM0QgICAgICAgICAgICAgDQpaYWdpIFV1biAgICAgICAgICAgICAgICAgIDE1MzMgQjY0Nzg4Ni04IE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwMiBJbSBNM1YgTTBEICAgICAgICAgICAgIA0KR2lkZWtpcyAgICAgICAgICAgICAgICAgICAxNTM0IEE3NkE1NTEtRCBOIE5pIFdhICAgICAgICAgICAgICAgICAgICAgICA2MDMgSW0gSzFWIE02RCAgICAgICAgICAgICANClNodWVzaGxhciAgICAgICAgICAgICAgICAgMTUzNiBDNDM1OTk4LTkgUyBIaSAgICAgICAgICAgICAgICAgICAgICAgICAgNTAyIEltIE0zSUlJIE0zRCAgICAgICAgICAgDQpFa2h1dXJtZSAgICAgICAgICAgICAgICAgIDE1MzggQTM0MzdCQi1BIE4gUG8gICAgICAgICAgICAgICAgICAgICAgICAgIDIwMSBJbSBLMFYgICAgICAgICAgICAgICAgIA0KRGltYW5hYW0gICAgICAgICAgICAgICAgICAxNTM5IEE1ODMyMjAtRiBOIExvIE5pICAgICAgICAgICAgICAgICAgICAgICAxMDQgSW0gSzZWIE0xRCAgICAgICAgICAgICANCkdpaWFraWlzIEUgICAgICAgICAgICAgICAgMTYwNSBBNDQ2NDQ1LUMgTiBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgNDAwIEltIEsxViAgICAgICAgICAgICAgICAgDQpTaXJtYSAgICAgICAgICAgICAgICAgICAgIDE2MDkgQzIyNDk4QS1FICAgSGkgSW4gQ3AgICAgICAgICAgICAgICAgICAgIDUwMiBJbSBLNFYgTTNEICAgICAgICAgICAgIA0KTmFnYW4gICAgICAgICAgICAgICAgICAgICAxNjEwIEI2NDU2MjMtQyAgIEFnIE5pICAgICAgICAgICAgICAgICAgICAgICA0MDMgSW0gTTFWICAgICAgICAgICAgICAgICANClNoYXV1ZyAgICAgICAgICAgICAgICAgICAgMTYxMSBCOTY0NDQyLUQgICBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgOTE0IEltIEswViAgICAgICAgICAgICAgICAgDQpNYXJsYWthc2kgICAgICAgICAgICAgICAgIDE2MTUgQjc3OTQwMC1CICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDQwNCBJbSBNMFYgICAgICAgICAgICAgICAgIA0KVmx1dXJ2bGFzaCAgICAgICAgICAgICAgICAxNjE2IEU5QjQ2ODMtOCAgIE5pICAgICAgICAgICAgICAgICAgICAgICAgICA2MTQgSW0gTTRWICAgICAgICAgICAgICAgICANCkhlcmFjbGVhICAgICAgICAgICAgICAgICAgMTYyMiBDMTIwNTc2LUQgICBOaSBQbyBEZSAgICAgICAgICAgICAgICAgICAgNDAxIEltIE0ySUkgTThWIE03RCAgICAgICAgDQpWZWxwYXJlICAgICAgICAgICAgICAgICAgIDE2MjMgQTU2NzYzNC05IFMgQWcgTmkgICAgICAgICAgICAgICAgICAgICAgIDQyNCBJbSBNM1YgRzJEICAgICAgICAgICAgIA0KS2lya3VzICAgICAgICAgICAgICAgICAgICAxNjI1IEI4ODU2NDAtQiBOIEFnIE5pIFJpICAgICAgICAgICAgICAgICAgICA3MTQgSW0gSzRJViAgICAgICAgICAgICAgICANCkFtc2hha2UgICAgICAgICAgICAgICAgICAgMTYyOCBCNjMzN0M5LUIgUyBOYSBQbyAgICAgICAgICAgICAgICAgICAgICAgMjA0IEltIEYzSVYgICAgICAgICAgICAgICAgDQpSYXNoaXVvbiAgICAgICAgICAgICAgICAgIDE2MzAgQjEzMDIyMS1FICAgTG8gTmkgUG8gRGUgICAgICAgICAgICAgICAgIDQwMyBJbSBNN0lWICAgICAgICAgICAgICAgIA0KUmVzaGkgVXVuICAgICAgICAgICAgICAgICAxNjMzIEIzMDA2NjYtRCAgIE5hIE5pIFZhICAgICAgICAgICAgICAgICAgICA4MDEgSW0gSzRJSUkgICAgICAgICAgICAgICANCktoYXNoaWd1biAgICAgICAgICAgICAgICAgMTYzNSBDNjI3NTdCLUEgICBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgMzE0IEltIEswViAgICAgICAgICAgICAgICAgDQpNYWxhYXNoICAgICAgICAgICAgICAgICAgIDE2MzggRTc1OTg3Ny01ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYxMiBJbSBLMklWIE0yRCAgICAgICAgICAgIA0KS2FtYSAgICAgICAgICAgICAgICAgICAgICAxNzAxIEU5OUE0ODktOCAgIE5pIFdhICAgICAgICAgICAgICAgICAgICAgICAyMjQgSW0gTTFWICAgICAgICAgICAgICAgICANCklza2kgS3V1ICAgICAgICAgICAgICAgICAgMTcwMiBDNDYzN0I2LTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODAyIEltIE00ViAgICAgICAgICAgICAgICAgDQpJcmtoZWRpICAgICAgICAgICAgICAgICAgIDE3MDMgQjY0NTM2Ny1EIE4gTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDcwMCBJbSBNNlYgICAgICAgICAgICAgICAgIA0KRXJkaSAgICAgICAgICAgICAgICAgICAgICAxNzA3IEI2ODY3NDUtOSBOIEFnIFJpICAgICAgICAgICAgICAgICAgICAgICA4MDAgSW0gTTFWICAgICAgICAgICAgICAgICANClVubmFnaWx1ICAgICAgICAgICAgICAgICAgMTcwOCBCMDAwODY4LUIgUyBOYSBBcyAgICAgICAgICAgICAgICAgICAgICAgOTA0IEltIEcyViAgICAgICAgICAgICAgICAgDQpLaGVyaXAgQWcgICAgICAgICAgICAgICAgIDE3MTAgRTAwMDIzMC04ICAgTG8gTmkgQXMgICAgICAgICAgICAgICAgICAgIDMxMSBJbSBNOVYgTTJEICAgICAgICAgICAgIA0KS2Fha2hlIE1pcmlyICAgICAgICAgICAgICAxNzExIEQxMDA3QjgtOSBTIE5hIFZhICAgICAgICAgICAgICAgICAgICAgICA4MTIgSW0gSzBWICAgICAgICAgICAgICAgICANClJpc29uICAgICAgICAgICAgICAgICAgICAgMTcxMyBCOUQzNjk1LUEgTiBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgNzE0IEltIEswViAgICAgICAgICAgICAgICAgDQpGb3Jub2wgICAgICAgICAgICAgICAgICAgIDE3MTUgQjU4MTlDQS1BIE4gSGkgICAgICAgICAgICAgICAgICAgICAgICAgIDcxMiBJbSBLMFYgICAgICAgICAgICAgICAgIA0KS2FzZGFnYSAgICAgICAgICAgICAgICAgICAxNzE3IEQ5QjczNjItQSBTIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA3MjQgSW0gSzBWICAgICAgICAgICAgICAgICANClRlbXJhICAgICAgICAgICAgICAgICAgICAgMTcyMSBCNTY1Nzg2LUIgTiBBZyBSaSAgICAgICAgICAgICAgICAgICAgICAgNDA0IEltIEcwViBNNEQgICAgICAgICAgICAgDQpBa2V5b2xhcml4ICAgICAgICAgICAgICAgIDE3MjQgQTY3NTQ0Ni1FIE4gTmkgICAgICAgICAgICAgICAgICAgICAgICAgIDQyNCBJbSBNMklJSSAgICAgICAgICAgICAgIA0KQydyZSAgICAgICAgICAgICAgICAgICAgICAxNzI1IEI0NDU4ODUtQyBBICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MDMgSW0gTTBWICAgICAgICAgICAgICAgICANCkRlbWxhICAgICAgICAgICAgICAgICAgICAgMTcyNiBCMDAwOEFGLUMgUyBOYSBBcyAgICAgICAgICAgICAgICAgICAgICAgNTA0IEltIE0xViBNMkQgICAgICAgICAgICAgDQpCcmFuZWQgICAgICAgICAgICAgICAgICAgIDE3MjcgQjhCMTQxMS1DIE4gTmkgRmwgICAgICAgICAgICAgICAgICAgICAgIDUwNSBJbSBNMElJICAgICAgICAgICAgICAgIA0KV2FkdXVrYSAgICAgICAgICAgICAgICAgICAxNzMwIEJBQjQ0MzUtQiAgIE5pIEZsICAgICAgICAgICAgICAgICAgICAgICAxMDQgSW0gTThWSSBNMEQgICAgICAgICAgICANCk1hYXNhYW5pbiAgICAgICAgICAgICAgICAgMTczMiBCNzU4NDU0LUIgICBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgNTA0IEltIE00ViBNN0QgICAgICAgICAgICAgDQpSaWlkICAgICAgICAgICAgICAgICAgICAgIDE3MzMgQjg2NTQwMC1CICAgTmkgICAgICAgICAgICAgICAgICAgICAgICAgIDMxNCBJbSBLM1YgICAgICAgICAgICAgICAgIA0KU2FudHJ5ICAgICAgICAgICAgICAgICAgICAxNzM2IEI0MjA4NTMtRiBOIE5hIFBvIERlICAgICAgICAgICAgICAgICAgICA2MDAgSW0gTTFWIE02RCAgICAgICAgICAgICANCk1pbmFtdWxhbSBLaXJhayAgICAgICAgICAgMTczNyBCMzc0NDc2LUEgICBOaSAgICAgICAgICAgICAgICAgICAgICAgIEEgNjAwIEltIE00ViAgICAgICAgICAgICAgICAgDQpHaW5uYSAgICAgICAgICAgICAgICAgICAgIDE3MzggQzhBNjIwMy1BICAgTG8gTmkgRmwgICAgICAgICAgICAgICAgICAgIDIxMyBJbSBNNVYgTTZEICAgICAgICAgICAgIA0KRW5zaHV1a2thciAgICAgICAgICAgICAgICAxNzM5IEI2QTY3NjQtQyAgIEZsICAgICAgICAgICAgICAgICAgICAgICAgICA2MTIgSW0gTTRWICAgICAgICAgICAgICAgICANCktpbm5lZCAgICAgICAgICAgICAgICAgICAgMTgwMSBENDUxNTg4LTUgUyBOaSBQbyAgICAgICAgICAgICAgICAgICAgICAgNzI1IEltIEsyViBNNEQgICAgICAgICAgICAgDQpHYW1paWdlbGEgICAgICAgICAgICAgICAgIDE4MDggQjEwMDU0NC1EICAgTmkgVmEgICAgICAgICAgICAgICAgICAgICAgIDIyMyBJbSBLMlYgICAgICAgICAgICAgICAgIA0KS2hpaWRrYXIgICAgICAgICAgICAgICAgICAxODEyIEIzODM2NTctQyBBIE5pIFJpICAgICAgICAgICAgICAgICAgICAgICA3MDUgSW0gSzBWICAgICAgICAgICAgICAgICANCkxlY3RvcnNlbiAgICAgICAgICAgICAgICAgMTgxMyBEMzU0NjU1LTUgICBBZyBOaSAgICAgICAgICAgICAgICAgICAgICAgNTAwIEltIEswViAgICAgICAgICAgICAgICAgDQpUaGFzcyAgICAgICAgICAgICAgICAgICAgIDE4MTUgQjUxMDQyMC05ICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDcxMyBJbSBLMFYgICAgICAgICAgICAgICAgIA0KQmFscGFuICAgICAgICAgICAgICAgICAgICAxODE5IEI1MDUzNDUtOSBBIExvIE5pIFZhIEljICAgICAgICAgICAgICAgICA2MDAgSW0gSzBWICAgICAgICAgICAgICAgICANClRlbGwgICAgICAgICAgICAgICAgICAgICAgMTgyMSBBNzhBMzcyLUYgTiBMbyBOaSBXYSAgICAgICAgICAgICAgICAgICAgNTAyIEltIE00ViBNNUQgICAgICAgICAgICAgDQpBbmdhIEtlICAgICAgICAgICAgICAgICAgIDE4MjIgQTIwMDM1My1GIE4gTG8gTmkgVmEgICAgICAgICAgICAgICAgICAgIDkxMiBJbSBNM1YgSzJEICAgICAgICAgICAgIA0KR2VyYXIgS2hhc2hpaSAgICAgICAgICAgICAxODIzIEU4QjczMzMtNyAgIExvIE5pIEZsICAgICAgICAgICAgICAgICAgICA2MDQgSW0gTTNWICAgICAgICAgICAgICAgICANCk1hbmRoZW0gICAgICAgICAgICAgICAgICAgMTgyNCBFNTU0MTAwLTYgICBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgODA0IEltIE00ViAgICAgICAgICAgICAgICAgDQpSYXJrYW4gICAgICAgICAgICAgICAgICAgIDE4MjUgQjVBMjIwMC1EIFMgTG8gTmkgRmwgICAgICAgICAgICAgICAgICAgIDUwMSBJbSBNOUQgTTlEICAgICAgICAgICAgIA0KU2hpcyAgICAgICAgICAgICAgICAgICAgICAxODI5IEIyMTE3NzktRSAgIE5hIEljICAgICAgICAgICAgICAgICAgICAgICA3MTMgSW0gRzBWICAgICAgICAgICAgICAgICANCkdpcnJpayAgICAgICAgICAgICAgICAgICAgMTgzMSBDNjYzNDEwLTYgUyBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgMjI1IEltIE0yViBNOEQgICAgICAgICAgICAgDQpTaGFhcmFtICAgICAgICAgICAgICAgICAgIDE4MzMgRDQ2NDg3NC05ICAgUmkgICAgICAgICAgICAgICAgICAgICAgICAgIDIwNCBJbSBNMklJICAgICAgICAgICAgICAgIA0KS2hlYSAgICAgICAgICAgICAgICAgICAgICAxODM2IEIzNDA5NTUtRiAgIEhpIEluIFBvIERlICAgICAgICAgICAgICAgICAzMDMgSW0gSzFWIE0wRCAgICAgICAgICAgICANCkFubHVtaXIgICAgICAgICAgICAgICAgICAgMTgzNyBCQTlBMjAxLUYgTiBMbyBOaSBXYSAgICAgICAgICAgICAgICAgICAgNzAwIEltIEc2ViAgICAgICAgICAgICAgICAgDQpJcmFkZGlpICAgICAgICAgICAgICAgICAgIDE4MzggRDk4OTYyMC03IFMgTmkgICAgICAgICAgICAgICAgICAgICAgICAgIDYwMyBJbSBNNFYgICAgICAgICAgICAgICAgIA0KUmlsaWsgQWFzaCAgICAgICAgICAgICAgICAxODM5IEI3ODI0NTUtQSBTIE5pICAgICAgICAgICAgICAgICAgICAgICAgICAzMDEgSW0gRzVWSSAgICAgICAgICAgICAgICANClNhcnV1bWRpaXVzaCAgICAgICAgICAgICAgMTg0MCBFNzQzN0JDLTUgICBQbyAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwIEltIE0xViAgICAgICAgICAgICAgICAgDQpaYW5paW4gICAgICAgICAgICAgICAgICAgIDE5MDEgQjY5NDVBQi1DICAgQWcgTmkgICAgICAgICAgICAgICAgICAgICAgIDMwMCBJbSBBM1YgTTdEICAgICAgICAgICAgIA0KSXJiaSAgICAgICAgICAgICAgICAgICAgICAxOTAyIEI4ODk0OEEtQiAgIE5pICAgICAgICAgICAgICAgICAgICAgICAgICA1MDMgSW0gTThWIE05RCAgICAgICAgICAgICANCklpc2thIEFzaGdpICAgICAgICAgICAgICAgMTkwOSBENDMzNTQxLTYgUyBOaSBQbyAgICAgICAgICAgICAgICAgICAgICAgODAwIEltIEs1ViBNNEQgTTNEICAgICAgICAgDQpLaGFtaWlsYSAgICAgICAgICAgICAgICAgIDE5MTIgQjQzMDU1MS1GIEEgTmkgUG8gRGUgICAgICAgICAgICAgICAgICAgIDYxMiBJbSBLMFYgICAgICAgICAgICAgICAgIA0KSXJ1cmsgICAgICAgICAgICAgICAgICAgICAxOTE2IEEzNDQ4ODktQiBOICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MTQgSW0gSzBWICAgICAgICAgICAgICAgICANCkFnZ2lpIEdhbmFhbiAgICAgICAgICAgICAgMTkxNyBEMjIyNzQ3LTYgUyBOYSBQbyAgICAgICAgICAgICAgICAgICAgICAgMTA0IEltIEswViAgICAgICAgICAgICAgICAgDQpUcmFhayAgICAgICAgICAgICAgICAgICAgIDE5MTggQjYyNDg4Qy1BIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwNCBJbSBLMFYgICAgICAgICAgICAgICAgIA0KQ3JvbXB0b24gICAgICAgICAgICAgICAgICAxOTE5IEU3NzYwMDAtMCAgIEJhICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAgSW0gSzBWICAgICAgICAgICAgICAgICANClNoaW9uICAgICAgICAgICAgICAgICAgICAgMTkyMCBENDEwMzQ0LTcgICBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgMTAzIEltIEswViAgICAgICAgICAgICAgICAgDQpTb3JjZXQgICAgICAgICAgICAgICAgICAgIDE5MjEgQjI0NTc0MC05ICAgQWcgICAgICAgICAgICAgICAgICAgICAgICAgIDUyNCBJbSBHNFYgICAgICAgICAgICAgICAgIA0KTWFyb3RhICAgICAgICAgICAgICAgICAgICAxOTI0IEU0NTUzMzUtNSAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICAxMDAgSW0gQTRWIE0zVkkgICAgICAgICAgICANCk5hYXJ1cCBFbXJpbSAgICAgICAgICAgICAgMTkyNSBBNDg1Njk5LUMgTiBBZyBOaSBSaSAgICAgICAgICAgICAgICAgICAgMzAwIEltIE0wViBNNUQgICAgICAgICAgICAgDQpLaGlyaSAgICAgICAgICAgICAgICAgICAgIDE5MjcgQjk0QTc3NS03ICAgV2EgICAgICAgICAgICAgICAgICAgICAgICAgIDMwNCBJbSBLMlYgTTVEICAgICAgICAgICAgIA0KRmFyaG9tZSAgICAgICAgICAgICAgICAgICAxOTI5IEU2Mjg1NDQtNiAgIE5pICAgICAgICAgICAgICAgICAgICAgICAgICA5MjQgSW0gTTJWICAgICAgICAgICAgICAgICANCktlZ2kgQWF0cmEgICAgICAgICAgICAgICAgMTkzMCBBMDAwNzg0LUUgICBBcyBOYSAgICAgICAgICAgICAgICAgICAgICAgNjA0IEltIEExViAgICAgICAgICAgICAgICAgDQpLdXVzaHJ1dSAgICAgICAgICAgICAgICAgIDE5MzMgQjU5OTc3NS1EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYwNCBJbSBNMVYgTTVEICAgICAgICAgICAgIA0KWmlzaG1hIEtoYSAgICAgICAgICAgICAgICAxOTM0IEI4ODY4NzktNyBOIFJpIENwICAgICAgICAgICAgICAgICAgICAgICAzMDAgSW0gTTJWICAgICAgICAgICAgICAgICANCktlc2hpICAgICAgICAgICAgICAgICAgICAgMTkzOCBCNTY2OUQ4LTggICBIaSAgICAgICAgICAgICAgICAgICAgICAgICAgMzE0IEltIEszViBNMUQgTTBEICAgICAgICAgDQpOYWRpciAgICAgICAgICAgICAgICAgICAgIDE5NDAgQjU0ODg0NC1DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgyMCBJbSBNNklJSSAgICAgICAgICAgICAgIA0KQW11ciBJc2FyayAgICAgICAgICAgICAgICAyMDA2IEIyMTA4NjctOSBOIE5hICAgICAgICAgICAgICAgICAgICAgICAgICA0MTIgSW0gTTJWICAgICAgICAgICAgICAgICANCkFtZXJvcyAgICAgICAgICAgICAgICAgICAgMjAwOCBCMTEwNTQyLUYgTiBOaSBDcCAgICAgICAgICAgICAgICAgICAgICAgNjA1IEltIE0xViBNN0QgICAgICAgICAgICAgDQpNYXNoYWEgICAgICAgICAgICAgICAgICAgIDIwMTAgQjhCNzQ5Ni1EIFMgTmkgRmwgICAgICAgICAgICAgICAgICAgICAgIDkwNSBJbSBHM1YgICAgICAgICAgICAgICAgIA0KRHVkYWthICAgICAgICAgICAgICAgICAgICAyMDExIEU1NDQwMDAtMCAgIEJhICAgICAgICAgICAgICAgICAgICAgICAgICAxMDMgSW0gSzBWICAgICAgICAgICAgICAgICANClRpd2F0aCAgICAgICAgICAgICAgICAgICAgMjAxMiBFNjUxNTc1LTggICBOaSBQbyAgICAgICAgICAgICAgICAgICAgICAgNjMzIEltIEswViAgICAgICAgICAgICAgICAgDQpNb3JpaSAgICAgICAgICAgICAgICAgICAgIDIwMTQgQjYyQTY0NC05ICAgTmkgV2EgICAgICAgICAgICAgICAgICAgICAgIDIxNCBJbSBLMFYgICAgICAgICAgICAgICAgIA0KWnVhcmtyaSAgICAgICAgICAgICAgICAgICAyMDE2IEI4Nzc2NTUtQyBXIEFnIE5pIFJpICAgICAgICAgICAgICAgICAgICA2MDQgSW0gSzBWICAgICAgICAgICAgICAgICANCkthaW4gICAgICAgICAgICAgICAgICAgICAgMjAxNyBFNTc2MDAwLTAgICBCYSAgICAgICAgICAgICAgICAgICAgICAgICAgMTIxIEltIEswViAgICAgICAgICAgICAgICAgDQpUZXJ0aGEgICAgICAgICAgICAgICAgICAgIDIwMjAgQzIwMDM0Mi1BICAgTG8gTmkgVmEgICAgICAgICAgICAgICAgICAgIDUxMyBJbSBLMFYgICAgICAgICAgICAgICAgIA0KQW50aGVyICAgICAgICAgICAgICAgICAgICAyMDIxIEEzMDA2OTctRSBOIE5hIE5pIFZhICAgICAgICAgICAgICAgICAgICA2MTUgSW0gSzlJViAgICAgICAgICAgICAgICANClByaW5vc2t1ICAgICAgICAgICAgICAgICAgMjAyNyBCOUE1NjlBLUIgTiBGbCBOaSAgICAgICAgICAgICAgICAgICAgICAgMTAwIEltIEs1VkkgICAgICAgICAgICAgICAgDQpCYXNpbGl1biAgICAgICAgICAgICAgICAgIDIwMjggQTQ0MzEwNC1EIE4gTG8gTmkgUG8gICAgICAgICAgICAgICAgICAgIDkwNCBJbSBHMVYgTTJEICAgICAgICAgICAgIA0KUmVnbmkgRGluICAgICAgICAgICAgICAgICAyMDMwIEQ2M0E1NjYtOCAgIE5pIFdhICAgICAgICAgICAgICAgICAgICAgICAyMTQgSW0gTTRWICAgICAgICAgICAgICAgICANCkRpbmRha2hhcmEgICAgICAgICAgICAgICAgMjAzNCBCMzI0NTc5LUUgICBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgNTAzIEltIE0xSUlJICAgICAgICAgICAgICAgDQpVdW5kaXppICAgICAgICAgICAgICAgICAgIDIwMzYgQTQxMDg1Ni1GIE4gTmEgICAgICAgICAgICAgICAgICAgICAgICAgIDMwNCBJbSBHOElJSSBNOEQgICAgICAgICAgIA0KRGFhdWQgVXJsZSAgICAgICAgICAgICAgICAyMDM3IEIzMzMyMTEtQyBBIExvIE5pIFBvICAgICAgICAgICAgICAgICAgICA2MjAgSW0gTTFWICAgICAgICAgICAgICAgICANCkdpbW1pIFV1c3NoYWEgICAgICAgICAgICAgMjAzOCBCNDc2NDUwLUMgTiBOaSAgICAgICAgICAgICAgICAgICAgICAgIEEgNTAyIEltIEswViAgICAgICAgICAgICAgICAgDQpLaGlpIElzaXMgICAgICAgICAgICAgICAgIDIwNDAgQTI0MDc0NS1BICAgUG8gRGUgICAgICAgICAgICAgICAgICAgICAgIDIwMiBJbSBNM1YgTTJEICAgICAgICAgICAgIA0KS2hpenV1biAgICAgICAgICAgICAgICAgICAyMTAxIEE4NUE2OUQtRSAgIE5pIFdhICAgICAgICAgICAgICAgICAgICAgICA1MDMgSW0gTTRWICAgICAgICAgICAgICAgICANClJhdmxhICAgICAgICAgICAgICAgICAgICAgMjEwMiBCNTU0MjQwLTggICBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgOTEwIEltIEc1SVYgICAgICAgICAgICAgICAgDQpJbmx1biBSYSAgICAgICAgICAgICAgICAgIDIxMDMgRTAwMDEyNy05ICAgTG8gTmkgQXMgICAgICAgICAgICAgICAgICAgIDgwNSBJbSBLMlYgICAgICAgICAgICAgICAgIA0KTnV1ZGxlICAgICAgICAgICAgICAgICAgICAyMTA0IEI4ODQ4NjktQiAgIFJpICAgICAgICAgICAgICAgICAgICAgICAgICA5MDIgSW0gSzVEIE0wRCAgICAgICAgICAgICANClNoaXphICAgICAgICAgICAgICAgICAgICAgMjEwNSBCNDYxNTQyLUUgICBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgNjAzIEltIE00ViBNOUQgICAgICAgICAgICAgDQpTaWR1a2EgICAgICAgICAgICAgICAgICAgIDIxMTEgQjQ0NjY4OS1DIE4gQWcgTmkgICAgICAgICAgICAgICAgICAgICAgIDIwMCBJbSBLMFYgICAgICAgICAgICAgICAgIA0KTmFwcGFyICAgICAgICAgICAgICAgICAgICAyMTEyIEM0Mjg1NjctOCAgIE5pICAgICAgICAgICAgICAgICAgICAgICAgICA4MjAgSW0gSzBWICAgICAgICAgICAgICAgICANClppbWlpbiAgICAgICAgICAgICAgICAgICAgMjExNSBBMzMxNzU4LUYgTiBOYSBQbyAgICAgICAgICAgICAgICAgICAgICAgODA0IEltIEswViAgICAgICAgICAgICAgICAgDQpDYXBpdGFsICAgICAgICAgICAgICAgICAgIDIxMTggQTU4NkE5OC1GIEIgSGkgQ2EgQ3ggQ3AgICAgICAgICAgICAgICAgIDYwNSBTeSBLMFYgICAgICAgICAgICAgICAgIA0KQWZmaW5pdHkgICAgICAgICAgICAgICAgICAyMTIxIEI5OEE1NjEtQSAgIE5pIFdhICAgICAgICAgICAgICAgICAgICAgICAyMTMgSW0gRzFWICAgICAgICAgICAgICAgICANCklpcnVra2h1bnogICAgICAgICAgICAgICAgMjEyMiBCNDc2MDAwLUQgQSBMbyBOaSBCYSAgICAgICAgICAgICAgICAgICAgOTAwIEltIE05ViAgICAgICAgICAgICAgICAgDQpFbGlndXJhc2ggICAgICAgICAgICAgICAgIDIxMjUgQTUyNDU3NS1DICAgTmkgICAgICAgICAgICAgICAgICAgICAgICAgIDcwMyBJbSBLNFYgTTlEICAgICAgICAgICAgIA0KSXJ1aWUgS2FkbyAgICAgICAgICAgICAgICAyMTMwIEI1NjU1NTgtQiBOIEFnIE5pICAgICAgICAgICAgICAgICAgICAgICA4MDMgSW0gRzRWICAgICAgICAgICAgICAgICANCkRlZ2thayBVdW4gICAgICAgICAgICAgICAgMjEzMyBFODhBNjU0LTggICBOaSBSaSBXYSAgICAgICAgICAgICAgICAgICAgMjEwIEltIEs0SUlJICAgICAgICAgICAgICAgDQpEaWxpaWcgICAgICAgICAgICAgICAgICAgIDIxMzUgRDc0OTEyMS02ICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDUxMyBJbSBLNlYgICAgICAgICAgICAgICAgIA0KS2lpciAgICAgICAgICAgICAgICAgICAgICAyMTM2IEE3N0E1QUQtRiAgIE5pIFdhICAgICAgICAgICAgICAgICAgICAgICA1MDQgSW0gTTNWIE02RCAgICAgICAgICAgICANCkFka2hpICAgICAgICAgICAgICAgICAgICAgMjEzOCBFODg4NjZBLTUgICBBZyBOaSBSaSAgICAgICAgICAgICAgICAgICAgMTAwIEltIE0zViBNM0QgICAgICAgICAgICAgDQpHaW5uYWthciAgICAgICAgICAgICAgICAgIDIxMzkgQjU2NTIwMC1DIFcgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDUwMiBJbSBNOFYgTTVEICAgICAgICAgICAgIA0KU2lkemVyICAgICAgICAgICAgICAgICAgICAyMTQwIEMyMDA3OUQtQSAgIE5hIFZhICAgICAgICAgICAgICAgICAgICAgICA3MTAgSW0gTTJJSUkgTTFWSSAgICAgICAgICANCkFuZGthZyBQYSAgICAgICAgICAgICAgICAgMjIwMyBCMzM4NDQxLUMgICBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgODAwIEltIEsyViAgICAgICAgICAgICAgICAgDQpEYWFzaCAgICAgICAgICAgICAgICAgICAgIDIyMDUgQjUzODU0NS1DIEEgTmkgICAgICAgICAgICAgICAgICAgICAgICAgIDkyMyBJbSBHM1YgICAgICAgICAgICAgICAgIA0KRWRpcmtpc2RpaSAgICAgICAgICAgICAgICAyMjA2IEI0NDQzMTAtRSAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgQSAzMTMgSW0gQThWICAgICAgICAgICAgICAgICANCk5pbWx1aW4gICAgICAgICAgICAgICAgICAgMjIwOSBCNDc2OTY1LUYgQSBIaSBJbiBDcCAgICAgICAgICAgICAgICAgICAgNDEwIEltIE0xViBNOUQgICAgICAgICAgICAgDQpHaXMgICAgICAgICAgICAgICAgICAgICAgIDIyMTAgQzU2Mjc2Ny01IFMgUmkgICAgICAgICAgICAgICAgICAgICAgICAgIDMwNSBJbSBNMlYgTTFEICAgICAgICAgICAgIA0KU2h1c2hhbiAgICAgICAgICAgICAgICAgICAyMjExIEE2NTUzMzUtRSAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA5MjQgSW0gSzBWICAgICAgICAgICAgICAgICANCktpaXJyaSAgICAgICAgICAgICAgICAgICAgMjIxMyBCNTQxMjMxLTYgICBMbyBOaSBQbyAgICAgICAgICAgICAgICAgICAgODE0IFN5IEswViAgICAgICAgICAgICAgICAgDQpTaHVkdXNoYW0gICAgICAgICAgICAgICAgIDIyMTQgRTg0OTg1NS1BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwNCBTeSBLMFYgICAgICAgICAgICAgICAgIA0KUmh5bGVhICAgICAgICAgICAgICAgICAgICAyMjE2IEI4QTY1MzAtOCAgIE5pIEZsICAgICAgICAgICAgICAgICAgICAgICA2MjMgU3kgSzBWICAgICAgICAgICAgICAgICANClN5cm9lICAgICAgICAgICAgICAgICAgICAgMjIxOCBCNDM2ODU0LUQgQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODA0IEltIEswViAgICAgICAgICAgICAgICAgDQpBc2UgICAgICAgICAgICAgICAgICAgICAgIDIyMTkgQjIyMDk4Qi1GICAgSGkgTmEgSW4gUG8gRGUgICAgICAgICAgICAgIDExMCBJbSBLMFYgICAgICAgICAgICAgICAgIA0KS2hpc2huYXIgICAgICAgICAgICAgICAgICAyMjIwIEQ0NjI4Q0EtNCBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTMgSW0gSzBWICAgICAgICAgICAgICAgICANCkxhbWlyaXUgICAgICAgICAgICAgICAgICAgMjIyMSBCOTk4NjU2LTkgTiBBZyBOaSAgICAgICAgICAgICAgICAgICAgICAgODE1IEltIEsxViBNNUQgICAgICAgICAgICAgDQpNaXJlc2ggS2FhbiAgICAgICAgICAgICAgIDIyMjIgQjg1NTc0Ni1DICAgQWcgICAgICAgICAgICAgICAgICAgICAgICAgIDIxMyBJbSBNMFYgICAgICAgICAgICAgICAgIA0KQ2F1bG8gTXVuICAgICAgICAgICAgICAgICAyMjIzIEE4NjY2NDUtOSAgIEFnIE5pIFJpICAgICAgICAgICAgICAgICAgICA1MDIgSW0gTTJWICAgICAgICAgICAgICAgICANCkNoYW50ICAgICAgICAgICAgICAgICAgICAgMjIyNCBBMTYwNjg4LUYgVyBOaSBSaSBEZSBDcCAgICAgICAgICAgICAgICAgOTAzIEltIEsySUkgICAgICAgICAgICAgICAgDQpNZWl6aSAgICAgICAgICAgICAgICAgICAgIDIyMjUgQjUxMjg0Ny1CIFMgTmEgSWMgICAgICAgICAgICAgICAgICAgICAgIDExMSBJbSBLNFYgICAgICAgICAgICAgICAgIA0KU2tlZW4gICAgICAgICAgICAgICAgICAgICAyMjI2IEI0OTE5OUItRiAgIEhpIEluICAgICAgICAgICAgICAgICAgICAgICA0MjIgSW0gSzFWICAgICAgICAgICAgICAgICANCkxpZGVyICAgICAgICAgICAgICAgICAgICAgMjIyNyBDMzU3NzQ3LUEgICBBZyAgICAgICAgICAgICAgICAgICAgICAgICAgMjAzIEltIEszViBNNkQgICAgICAgICAgICAgDQpLdXVtYSAgICAgICAgICAgICAgICAgICAgIDIyMzIgQjUzODgzNi1CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwMiBJbSBNMVYgTTdWICAgICAgICAgICAgIA0KTWlyZXppICAgICAgICAgICAgICAgICAgICAyMjM3IEIyMDMyMTItQyBOIExvIE5pIFZhIEljICAgICAgICAgICAgICAgICAyMDAgSW0gRjlWICAgICAgICAgICAgICAgICANCkVyZW0gRGFzaCAgICAgICAgICAgICAgICAgMjMwNiBDNjQ1NDQxLUIgUyBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgMTAzIEltIE0wViBNOEQgICAgICAgICAgICAgDQpHaWlra2FsYSAgICAgICAgICAgICAgICAgIDIzMTIgQjc5QTU1Ny1GICAgTmkgV2EgICAgICAgICAgICAgICAgICAgICAgIDQwMyBJbSBLMFYgICAgICAgICAgICAgICAgIA0KTGFhaXJlciAgICAgICAgICAgICAgICAgICAyMzE0IEI1NTk2NjctQiAgIE5pICAgICAgICAgICAgICAgICAgICAgICAgICAyMDQgU3kgSzBWICAgICAgICAgICAgICAgICANCklkbXVtICAgICAgICAgICAgICAgICAgICAgMjMxNiBCNDQ0ODU0LTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAyIFN5IEswViAgICAgICAgICAgICAgICAgDQpDb2RzZW4gICAgICAgICAgICAgICAgICAgIDIzMTcgRTU3MTU2OC0yICAgTmkgICAgICAgICAgICAgICAgICAgICAgICAgIDIxMCBTeSBLMFYgICAgICAgICAgICAgICAgIA0KS3V1bmVuIElzaCAgICAgICAgICAgICAgICAyMzE4IEIyMTA1NzctQSBTIE5pICAgICAgICAgICAgICAgICAgICAgICAgICAxMTMgU3kgSzBWICAgICAgICAgICAgICAgICANCklwZHV1IEluICAgICAgICAgICAgICAgICAgMjMxOSBDOTc5Nzg4LUIgUyBSaSAgICAgICAgICAgICAgICAgICAgICAgICAgNDE0IEltIEswViAgICAgICAgICAgICAgICAgDQpVbWdhZGluICAgICAgICAgICAgICAgICAgIDIzMjAgQjZCNTk0Ni1CICAgSGkgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMiBJbSBLMFYgICAgICAgICAgICAgICAgIA0KU2h1c2EgICAgICAgICAgICAgICAgICAgICAyMzIyIEE1ODE2NTEtRiAgIE5pIFJpICAgICAgICAgICAgICAgICAgICAgICA5MDQgSW0gTTJWIE01RCAgICAgICAgICAgICANCk1lcmF0ICAgICAgICAgICAgICAgICAgICAgMjMyMyBCNDIzODY4LUEgTiBOYSBQbyAgICAgICAgICAgICAgICAgICAgICAgNDAzIEltIEs0ViAgICAgICAgICAgICAgICAgDQpMaW1lc2ggQWt1biAgICAgICAgICAgICAgIDIzMjYgRDQxMDY2Ni03IFMgTmEgTmkgICAgICAgICAgICAgICAgICAgICAgIDkxMCBJbSBLMVZJICAgICAgICAgICAgICAgIA0KUmlqYXMgVm9yZWEgICAgICAgICAgICAgICAyMzI3IEI3NTkzMDAtRCAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICAzMTMgSW0gTTNWICAgICAgICAgICAgICAgICANClJhYW1pICAgICAgICAgICAgICAgICAgICAgMjMzMCBCNTIyOTY2LUYgICBIaSBOYSBJbiBQbyAgICAgICAgICAgICAgICAgNjAzIEltIE0yViAgICAgICAgICAgICAgICAgDQpCdXNzaXJrYSAgICAgICAgICAgICAgICAgIDIzMzQgQjIzMzAwMC1FIE4gTG8gTmkgUG8gQmEgICAgICAgICAgICAgICAgIDYwMyBJbSBHN1YgICAgICAgICAgICAgICAgIA0KR2lzaCAgICAgICAgICAgICAgICAgICAgICAyMzM1IEI1NTUyMjItRCAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICAyMDMgSW0gTTFJSSAgICAgICAgICAgICAgICANCkFkYW4gICAgICAgICAgICAgICAgICAgICAgMjMzNiBENjYxNjk2LTYgICBOaSBSaSAgICAgICAgICAgICAgICAgICAgICAgNjAzIEltIEsxViBNMkQgICAgICAgICAgICAgDQpTaGluemFya2FuICAgICAgICAgICAgICAgIDIzMzggQjQ1NTYyMC1EICAgQWcgTmkgICAgICAgICAgICAgICAgICAgICBBIDYxNCBJbSBNOElWIE0wViAgICAgICAgICAgIA0KRXJraWltICAgICAgICAgICAgICAgICAgICAyNDAxIEE1MkEyMzEtQyBBIExvIE5pIFdhICAgICAgICAgICAgICAgICAgICAxMDMgSW0gTTlWIE0yRCAgICAgICAgICAgICANCkFhcnV1IFppICAgICAgICAgICAgICAgICAgMjQwMyBCNDY5OEM5LTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIzIEltIEsxViAgICAgICAgICAgICAgICAgDQpHZW1pICAgICAgICAgICAgICAgICAgICAgIDI0MDQgQjQwMDQ0Mi1EIFcgTmkgVmEgICAgICAgICAgICAgICAgICAgICAgIDUwNCBJbSBNNFYgICAgICAgICAgICAgICAgIA0KTHV1bm5pIE1pdSAgICAgICAgICAgICAgICAyNDA1IEM1NzYyNDItOCAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICAxMTMgSW0gTTBWIE0wRCAgICAgICAgICAgICANCkxhZ2Fhc2hpbiAgICAgICAgICAgICAgICAgMjQwNyBFNzY3NjY0LTUgICBBZyBOaSBSaSAgICAgICAgICAgICAgICAgICAgODEwIEltIEszViAgICAgICAgICAgICAgICAgDQpBcm5ha2kgICAgICAgICAgICAgICAgICAgIDI0MDggQTIwMDUyNC1GICAgTmkgVmEgICAgICAgICAgICAgICAgICAgICAgIDQxMyBJbSBNMVYgICAgICAgICAgICAgICAgIA0KVXVuZ2lwICAgICAgICAgICAgICAgICAgICAyNDEwIEIwMDA1MzEtQiBOIE5pIEFzICAgICAgICAgICAgICAgICAgICAgICA3MTIgSW0gTTdJSSBNOUQgICAgICAgICAgICANCkNhcGlvbiAgICAgICAgICAgICAgICAgICAgMjQxMyBCNjUxODY0LTYgICBQbyAgICAgICAgICAgICAgICAgICAgICAgICAgMjAxIFN5IEswViAgICAgICAgICAgICAgICAgDQpLaGFhc2h1dSAgICAgICAgICAgICAgICAgIDI0MTQgQUE3QTc4OC05ICAgUmkgV2EgICAgICAgICAgICAgICAgICAgICAgIDIwMCBTeSBLMFYgICAgICAgICAgICAgICAgIA0KQXJnYXNoICAgICAgICAgICAgICAgICAgICAyNDE2IEI3NTU0OTYtNyAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA0MDQgU3kgSzBWICAgICAgICAgICAgICAgICANCkdhc2ggICAgICAgICAgICAgICAgICAgICAgMjQxOSBBNTQ0NTc2LUEgUyBBZyBOaSAgICAgICAgICAgICAgICAgICAgICAgNTAwIEltIEczViBNN0QgICAgICAgICAgICAgDQpSbyBBbmlpICAgICAgICAgICAgICAgICAgIDI0MjIgQTQ3MzMyMC1FIE4gTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDcwNCBJbSBNMVYgTTlEICAgICAgICAgICAgIA0KQXZpa2ggVGhhdXMgICAgICAgICAgICAgICAyNDI1IEIyMDA4NzktRSAgIE5hIFZhICAgICAgICAgICAgICAgICAgICAgICA3MjMgSW0gRzFWSSBNNUQgICAgICAgICAgICANCkFya2F1bSAgICAgICAgICAgICAgICAgICAgMjQyOSBCNTUyNjI1LTggICBOaSBQbyAgICAgICAgICAgICAgICAgICAgICAgOTAyIEltIEYyViAgICAgICAgICAgICAgICAgDQpLaW0gICAgICAgICAgICAgICAgICAgICAgIDI0MzEgRDdBODY3OC02IFMgTmkgRmwgICAgICAgICAgICAgICAgICAgICAgIDgxMiBJbSBNMVYgTTFWSSAgICAgICAgICAgIA0KVXVyYW1hZyAgICAgICAgICAgICAgICAgICAyNDMzIEM3OTQ3OTgtOCBTIEFnICAgICAgICAgICAgICAgICAgICAgICAgICA5MTQgSW0gTTJWICAgICAgICAgICAgICAgICANCklpZGtlayAgICAgICAgICAgICAgICAgICAgMjQzNSBCQUI0NDIzLTkgTiBOaSBGbCAgICAgICAgICAgICAgICAgICAgICAgMzAwIEltIE01SVYgTTNEICAgICAgICAgICAgDQpMaWdlbXVtICAgICAgICAgICAgICAgICAgIDI0MzcgRDYzNjY1MC03IFMgTmkgICAgICAgICAgICAgICAgICAgICAgICAgIDgwMiBJbSBNNFYgSzdEICAgICAgICAgICAgIA0KSW5uYW1lZyAgICAgICAgICAgICAgICAgICAyNDM5IEIzODQwMDAtQiAgIExvIE5pIEJhICAgICAgICAgICAgICAgICAgICAxMjMgSW0gTTdWICAgICAgICAgICAgICAgICANCkVyYW5pICAgICAgICAgICAgICAgICAgICAgMjUwMSBCMDAwNTU2LUUgTiBOaSBBcyAgICAgICAgICAgICAgICAgICAgICAgMjAwIEltIE02SVYgICAgICAgICAgICAgICAgDQpHaWdpICAgICAgICAgICAgICAgICAgICAgIDI1MDMgQjAwMDEwMC1DIE4gTG8gTmkgQXMgICAgICAgICAgICAgICAgICAgIDcwNCBJbSBNMlYgSzFEICAgICAgICAgICAgIA0KTmludWEgICAgICAgICAgICAgICAgICAgICAyNTA3IEE5ODY3QkMtRCBOIEFnICAgICAgICAgICAgICAgICAgICAgICAgICA4MTAgSW0gTTFWIEszRCAgICAgICAgICAgICANCkt1dWlyIEFtICAgICAgICAgICAgICAgICAgMjUxMSBDNDc3NDk3LTggICBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgMjAyIEltIE05SUkgTTNEICAgICAgICAgICAgDQpLaHVpciAgICAgICAgICAgICAgICAgICAgIDI1MTMgQjg5QUFDQS1EICAgSGkgSW4gV2EgICAgICAgICAgICAgICAgICAgIDgwMiBTeSBLMVYgICAgICAgICAgICAgICAgIA0KSW1hYXIgUGEgICAgICAgICAgICAgICAgICAyNTE3IEU0NDQwMDAtMCAgIEJhICAgICAgICAgICAgICAgICAgICAgICAgICAxMDIgU3kgTTFWIE0wRCAgICAgICAgICAgICANClJpaWQgSXJtYW4gICAgICAgICAgICAgICAgMjUxOSBEMDAwMzMwLUEgUyBMbyBOaSBBcyAgICAgICAgICAgICAgICAgICAgNjA0IEltIEczViAgICAgICAgICAgICAgICAgDQpTaGFzaHV1YSAgICAgICAgICAgICAgICAgIDI1MjEgRTI2MDQ2My02ICAgTmkgRGUgICAgICAgICAgICAgICAgICAgICAgIDIwMSBJbSBLNFYgICAgICAgICAgICAgICAgIA0KR2xpbW1lciAgICAgICAgICAgICAgICAgICAyNTI0IEE1NzYzMjItQSBOIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA5MDMgSW0gTTlWICAgICAgICAgICAgICAgICANCktpc2EgICAgICAgICAgICAgICAgICAgICAgMjUyNiBBN0M2MzIwLUYgICBMbyBOaSBGbCAgICAgICAgICAgICAgICAgICAgNjAyIEltIEs2ViBNMUQgTTREICAgICAgICAgDQpVZGFhICAgICAgICAgICAgICAgICAgICAgIDI1MjkgRTU2NDhBOC02ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkxNCBJbSBNMFYgICAgICAgICAgICAgICAgIA0KTWllIER1dXIgICAgICAgICAgICAgICAgICAyNTMyIEIxMTAzMjAtQyBBIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA4MDMgSW0gSzZWICAgICAgICAgICAgICAgICANCk1pZGRlbmEgICAgICAgICAgICAgICAgICAgMjUzNCBCNjQ4Nzk3LTcgTiBBZyAgICAgICAgICAgICAgICAgICAgICAgICAgNDAyIEltIE0yViAgICAgICAgICAgICAgICAgDQpEdXVucGlnYW11dXIgICAgICAgICAgICAgIDI1MzYgQzUxMTYzNy05IFMgTmEgTmkgSWMgICAgICAgICAgICAgICAgICAgIDYyNCBJbSBNMklWIEs5RCAgICAgICAgICAgIA0KRHV1ZGluICAgICAgICAgICAgICAgICAgICAyNTM4IEI3Njg0MTAtQyAgIE5pICAgICAgICAgICAgICAgICAgICAgICAgICA3MDIgSW0gSzZJViAgICAgICAgICAgICAgICANCkJ1bWluYSAgICAgICAgICAgICAgICAgICAgMjU0MCBDNTUzMzE0LTggICBMbyBOaSBQbyAgICAgICAgICAgICAgICAgICAgNDIwIEltIEszViAgICAgICAgICAgICAgICAgDQpTYWdha3UgICAgICAgICAgICAgICAgICAgIDI2MDIgQjQ0NDdBQS1BICAgQWcgICAgICAgICAgICAgICAgICAgICAgICAgIDQwMSBJbSBNMVYgTTZEICAgICAgICAgICAgIA0KQXJ1bmRlICAgICAgICAgICAgICAgICAgICAyNjAzIEVBQUEzMDMtQiAgIExvIE5pIEZsIFdhICAgICAgICAgICAgICAgICAzMDMgSW0gSzRWICAgICAgICAgICAgICAgICANCk1hcmdpc2ggTGlpciAgICAgICAgICAgICAgMjYwNiBCMzQ3NDMxLUUgTiBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgOTA1IEltIEsySVYgICAgICAgICAgICAgICAgDQpEdXJlaWphICAgICAgICAgICAgICAgICAgIDI2MDggQjU1Nzg5OS04IEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcxMyBJbSBNM1YgTTdEICAgICAgICAgICAgIA0KRWJiYSAgICAgICAgICAgICAgICAgICAgICAyNjA5IEI1OTkzMTMtRSBOIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA3MTMgSW0gTTlWICAgICAgICAgICAgICAgICANCktlcmxpYXIgICAgICAgICAgICAgICAgICAgMjYxMCBCNTk0NzY5LUEgICBBZyAgICAgICAgICAgICAgICAgICAgICAgICAgMjA1IEltIE00ViAgICAgICAgICAgICAgICAgDQpLaXNoa2VpaW0gICAgICAgICAgICAgICAgIDI2MTEgQjIwMTg4NS1BICAgTmEgVmEgSWMgICAgICAgICAgICAgICAgICAgIDUwMyBJbSBNOElJIE01RCAgICAgICAgICAgIA0KSXNwdW1lciAgICAgICAgICAgICAgICAgICAyNjE1IEUzODE5N0ItNyAgIEhpICAgICAgICAgICAgICAgICAgICAgICAgICA5MDUgU3kgTTNWIE01RCBLNUQgICAgICAgICANCkxpa2hhbWlpICAgICAgICAgICAgICAgICAgMjYxNiBCNTM2OENELTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAzIFN5IE0xViBNMEQgICAgICAgICAgICAgDQpHdXJkYWFuICAgICAgICAgICAgICAgICAgIDI2MjMgQjMxMDlEQS1FIE4gSGkgTmEgSW4gICAgICAgICAgICAgICAgICAgIDExNCBJbSBNMVYgICAgICAgICAgICAgICAgIA0KSWRhcyAgICAgICAgICAgICAgICAgICAgICAyNjI0IEI0OTI5QUUtRiBOIEhpIEluICAgICAgICAgICAgICAgICAgICAgICAxMDEgSW0gRjJWIE01RCAgICAgICAgICAgICANCkltc2hhICAgICAgICAgICAgICAgICAgICAgMjYyNSBCMjI0MzM3LUQgTiBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgNzA0IEltIEsxViBNM0QgICAgICAgICAgICAgDQpHYXNoa2FuYW4gICAgICAgICAgICAgICAgIDI2MjggQjc0QTYyMi05IE4gTmkgV2EgICAgICAgICAgICAgICAgICAgICAgIDMxNCBJbSBBNFYgSzdEICAgICAgICAgICAgIA0KU2hlc2ggICAgICAgICAgICAgICAgICAgICAyNjMwIEMwMDAzMTQtRSAgIExvIE5pIEFzICAgICAgICAgICAgICAgICAgICA1MDQgSW0gTTFWICAgICAgICAgICAgICAgICANClV1cmt1dW1sdXUgICAgICAgICAgICAgICAgMjYzMSBCMjQ1NTI1LTkgQSBBZyBOaSAgICAgICAgICAgICAgICAgICAgICAgNTEzIEltIE0zViBNNUQgICAgICAgICAgICAgDQpBcnZsYWEgR2FtICAgICAgICAgICAgICAgIDI2MzUgRTg4OTY2Mi02ICAgTmkgUmkgICAgICAgICAgICAgICAgICAgICAgIDcwNCBJbSBNM1YgICAgICAgICAgICAgICAgIA0KVmFsZWQgICAgICAgICAgICAgICAgICAgICAyNjM2IEI5OTgyMTMtQSBTIExvIE5pICAgICAgICAgICAgICAgICAgICAgICAzMTQgSW0gSzdWICAgICAgICAgICAgICAgICANClN1dXJhc2h1dXIgICAgICAgICAgICAgICAgMjYzOSBCMTAwNDAzLUQgUyBOaSBWYSAgICAgICAgICAgICAgICAgICAgICAgMjAzIEltIEc5RCAgICAgICAgICAgICAgICAgDQpEaXNoYWRzaGlpICAgICAgICAgICAgICAgIDI2NDAgQjYxNEFDRy1GIE4gSGkgSW4gSWMgICAgICAgICAgICAgICAgICAgIDIwNCBJbSBNMVYgICAgICAgICAgICAgICAgIA0KRGVya3UgICAgICAgICAgICAgICAgICAgICAyNzAzIEM2MTA5ODktRCAgIEhpIE5hIEluIENwICAgICAgICAgICAgICAgICA2MDMgSW0gTTRWIE00RCAgICAgICAgICAgICANClJvc2thICAgICAgICAgICAgICAgICAgICAgMjcwNSBFMzU2MTAwLTggICBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgMzAxIEltIE03ViAgICAgICAgICAgICAgICAgDQpTZWt3b24gICAgICAgICAgICAgICAgICAgIDI3MDYgQjM2NDUwMC1EIEEgQWcgTmkgICAgICAgICAgICAgICAgICAgICAgIDUxNCBJbSBLMVYgICAgICAgICAgICAgICAgIA0KS2FsZW5kYWUgICAgICAgICAgICAgICAgICAyNzA3IEM1MjUzNDAtOCBTIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA4MDAgSW0gTTFWICAgICAgICAgICAgICAgICANCktpbXZsZSAgICAgICAgICAgICAgICAgICAgMjcwOSBCMDAwMjAzLUYgTiBMbyBOaSBBcyAgICAgICAgICAgICAgICAgICAgNTAzIEltIE0wViAgICAgICAgICAgICAgICAgDQpMaXIgICAgICAgICAgICAgICAgICAgICAgIDI3MjAgQjQyNjQ3Qy1BICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDcwMyBJbSBLOElWIE03RCAgICAgICAgICAgIA0KS2lydSB1ZGEgICAgICAgICAgICAgICAgICAyNzIxIEI1NTE2ODYtOCAgIE5pIFBvICAgICAgICAgICAgICAgICAgICAgICA5MzQgSW0gTTFWICAgICAgICAgICAgICAgICANCkdhYXIgICAgICAgICAgICAgICAgICAgICAgMjcyOSBCMzYwMjI0LUUgICBMbyBOaSBEZSAgICAgICAgICAgICAgICAgICAgMzIwIEltIE05ViAgICAgICAgICAgICAgICAgDQpNYWFuICAgICAgICAgICAgICAgICAgICAgIDI3MzAgQTI0MTYzMi1GICAgTmkgUG8gICAgICAgICAgICAgICAgICAgICAgIDQwMyBJbSBLM1YgICAgICAgICAgICAgICAgIA0KTWlscGEgICAgICAgICAgICAgICAgICAgICAyNzMxIEI2MzE1QUYtQSBOIE5pIFBvICAgICAgICAgICAgICAgICAgICAgICA0MDQgSW0gRzBWICAgICAgICAgICAgICAgICANClNoaW1hcmFhayAgICAgICAgICAgICAgICAgMjczMiBCOUU3NDI1LUUgICBOaSBGbCAgICAgICAgICAgICAgICAgICAgICAgODAyIEltIEc0ViAgICAgICAgICAgICAgICAgDQpHYWVuIEx1dW0gICAgICAgICAgICAgICAgIDI3MzYgQjMyNDc1Ny1CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMyBJbSBLMlYgICAgICAgICAgICAgICAgIA0KR2VraHV1ICAgICAgICAgICAgICAgICAgICAyODAyIEI2Nzg4OTYtQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MjUgSW0gRzJWICAgICAgICAgICAgICAgICANCktlcnNpIEFtICAgICAgICAgICAgICAgICAgMjgwMyBBNDI3NDU2LUQgICBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgNTA0IEltIE00ViAgICAgICAgICAgICAgICAgDQpLaHV1bWEgICAgICAgICAgICAgICAgICAgIDI4MTQgQzIyMzY2OS04ICAgTmEgTmkgUG8gICAgICAgICAgICAgICAgICAgIDUwNCBTeSBLNFYgTTREICAgICAgICAgICAgIA0KSW5kc2hpaW0gR2FubWUgICAgICAgICAgICAyODE2IEI4NjkzMjMtQyAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICAxMDMgU3kgRzRWICAgICAgICAgICAgICAgICANCkt1Z2dhciAgICAgICAgICAgICAgICAgICAgMjgyMSBCNTUyODk3LTggICBQbyAgICAgICAgICAgICAgICAgICAgICAgICAgMzA0IEltIEEyViAgICAgICAgICAgICAgICAgDQpCZXJ1bWkgICAgICAgICAgICAgICAgICAgIDI4MjMgQzU1MzEwMC1DICAgTG8gTmkgUG8gICAgICAgICAgICAgICAgICAgIDMwMyBJbSBNMFYgICAgICAgICAgICAgICAgIA0KQmlzaGFha3V1a2EgICAgICAgICAgICAgICAyODI1IEI2ODM4QkEtNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjMgSW0gTTFWICAgICAgICAgICAgICAgICANCkdpc2hhc2h1bSAgICAgICAgICAgICAgICAgMjgyOSBFMTAwODk1LUIgICBOYSBWYSAgICAgICAgICAgICAgICAgICAgICAgNDI0IEltIE0wViBNNUQgICAgICAgICAgICAgDQpOYXZsYSBTaGEgICAgICAgICAgICAgICAgIDI4MzAgRUFDNzQ1Ny04ICAgTmkgRmwgICAgICAgICAgICAgICAgICAgICAgIDIxNCBJbSBNM1YgTTNEICAgICAgICAgICAgIA0KU2luYWQgICAgICAgICAgICAgICAgICAgICAyODMyIEI0NTg5QUQtRCBOIEhpICAgICAgICAgICAgICAgICAgICAgICAgICA0MDIgSW0gTTRWIE01RCAgICAgICAgICAgICANCktodWlyICAgICAgICAgICAgICAgICAgICAgMjgzNiBCNDc4ODYxLUQgUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTA0IEltIE0zViAgICAgICAgICAgICAgICAgDQpJZ2xhICAgICAgICAgICAgICAgICAgICAgIDI4MzcgQjQxNEFERy1GICAgSGkgSW4gSWMgICAgICAgICAgICAgICAgICAgIDgwNCBJbSBNMlYgTTlEICAgICAgICAgICAgIA0KR2Flc2htZSAgICAgICAgICAgICAgICAgICAyODM5IEM3ODMzNTQtOSAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA3MDMgSW0gTTFWIE0xRCAgICAgICAgICAgICANCkd1bWlyIEdhZWcgICAgICAgICAgICAgICAgMjg0MCBCOEMwODg1LUIgICBEZSAgICAgICAgICAgICAgICAgICAgICAgICAgODE0IEltIE04SUlJIE00RCAgICAgICAgICAgDQpJc2hudXVuYXIgICAgICAgICAgICAgICAgIDI5MDQgRDU3MjgzNC02IFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyMCBJbSBNNElWIE02RCAgICAgICAgICAgIA0KRGFta2kgSW0gICAgICAgICAgICAgICAgICAyOTA2IEIyMDA4NzgtRCAgIE5hIFZhICAgICAgICAgICAgICAgICAgICAgICA2MDMgSW0gRzRWIE05RCAgICAgICAgICAgICANClNodXNhIExpaXNobGkgICAgICAgICAgICAgMjkxMCBCMjExMTEyLUYgTiBMbyBOaSBJYyAgICAgICAgICAgICAgICAgICAgMzIzIEltIEsyViBNMEQgICAgICAgICAgICAgDQpMZWVyICAgICAgICAgICAgICAgICAgICAgIDI5MTIgQTdCMzY5OS1EICAgTmkgICAgICAgICAgICAgICAgICAgICAgICAgIDcyNSBJbSBHMlYgICAgICAgICAgICAgICAgIA0KS2hpdXVyIExhICAgICAgICAgICAgICAgICAyOTEzIEM4QjM3NjMtNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MDMgU3kgTTNWIE0yRCAgICAgICAgICAgICANCk1pa2hhZyBLdXUgICAgICAgICAgICAgICAgMjkxNCBBNjY4ODczLTggICBSaSAgICAgICAgICAgICAgICAgICAgICAgICAgMjEzIFN5IEYwViAgICAgICAgICAgICAgICAgDQpLaGlpbnJhIEFzaCAgICAgICAgICAgICAgIDI5MTYgQkFFNjM2Mi03ICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDcwNCBTeSBNMklWIE0xRCAgICAgICAgICAgIA0KRWt1Z3VzaCAgICAgICAgICAgICAgICAgICAyOTIyIEI2NTI5NjgtOSAgIEhpIFBvICAgICAgICAgICAgICAgICAgICAgICA5MDQgSW0gTTFWIE05RCAgICAgICAgICAgICANClVzaGJhIFNpbmQgICAgICAgICAgICAgICAgMjkyNCBENTY0Nzc5LTMgUyBBZyBSaSAgICAgICAgICAgICAgICAgICAgICAgNDA1IEltIEY0ViBNMEQgICAgICAgICAgICAgDQpWaWxha2h1ICAgICAgICAgICAgICAgICAgIDI5MjggQTQ5NDMwMC1GICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDIxNCBJbSBNOFYgICAgICAgICAgICAgICAgIA0KRGFudXV2bGFuICAgICAgICAgICAgICAgICAyOTI5IEIwMDA1NzgtQiAgIE5pIEFzICAgICAgICAgICAgICAgICAgICAgICA5MTMgSW0gTTFWICAgICAgICAgICAgICAgICANCkRpbmVucnV1bSAgICAgICAgICAgICAgICAgMjkzMSBFMzMyNjc5LTUgICBOYSBOaSBQbyAgICAgICAgICAgICAgICAgICAgMTIyIEltIEsxSVYgTTNEIE00RCAgICAgICAgDQpHYW5hZCAgICAgICAgICAgICAgICAgICAgIDI5MzMgQTY1NjlCQS1GIE4gSGkgICAgICAgICAgICAgICAgICAgICAgICAgIDUwNCBJbSBNMFYgICAgICAgICAgICAgICAgIA0KRGlzaGUgICAgICAgICAgICAgICAgICAgICAyOTM0IEE3NzgyMzItRCAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICAzMTUgSW0gSzlWICAgICAgICAgICAgICAgICANCkFtdXVyIEtlaWlyICAgICAgICAgICAgICAgMjkzNSBDNDcyMjU1LUEgICBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgOTEzIEltIEExViAgICAgICAgICAgICAgICAgDQpTYXJlZ29uICAgICAgICAgICAgICAgICAgIDI5MzYgQTU4NDk3Ni1FICAgSGkgICAgICAgICAgICAgICAgICAgICAgICAgIDExNCBJbSBNM1YgTTZEICAgICAgICAgICAgIA0KVXVyaWdnZXIgICAgICAgICAgICAgICAgICAyOTM3IEI0MzQ3NzktQSBBICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MDMgSW0gTTFJSUkgTTlWICAgICAgICAgICANClNoYWtpaWdhICAgICAgICAgICAgICAgICAgMjkzOCBCODY3QUNBLUIgICBIaSAgICAgICAgICAgICAgICAgICAgICAgICAgNzEwIEltIEs0ViAgICAgICAgICAgICAgICAgDQpJc3V1ciAgICAgICAgICAgICAgICAgICAgIDMwMDIgQzM0NDg4Ni05ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMCBJbSBLMFZJICAgICAgICAgICAgICAgIA0KSWlkc2hhICAgICAgICAgICAgICAgICAgICAzMDAzIEI2NjUzNTUtQSBOIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA0MTAgSW0gTTZWICAgICAgICAgICAgICAgICANCkFhcnphIEthbmQgICAgICAgICAgICAgICAgMzAwNSBCMzA0ODQyLUIgICBWYSBJYyAgICAgICAgICAgICAgICAgICAgICAgNDIyIEltIEsxViBNNEQgICAgICAgICAgICAgDQpNaW5vcyAgICAgICAgICAgICAgICAgICAgIDMwMDggQTQwMDdCOS1GIE4gTmEgVmEgICAgICAgICAgICAgICAgICAgICAgIDQwMSBJbSBHMlYgICAgICAgICAgICAgICAgIA0KTGF1ZHVtICAgICAgICAgICAgICAgICAgICAzMDExIEIzNTI5ODYtRCBOIEhpIFBvICAgICAgICAgICAgICAgICAgICAgICAxMDEgSW0gTThWIE0xRCAgICAgICAgICAgICANCkFudXVnICAgICAgICAgICAgICAgICAgICAgMzAxNSBCNzgzMzUxLTggICBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgMjAwIFN5IEs2ViAgICAgICAgICAgICAgICAgDQpLaW5la2VzaCAgICAgICAgICAgICAgICAgIDMwMTkgQjIyMjU1Mi1GIE4gTmkgUG8gICAgICAgICAgICAgICAgICAgICAgIDczMCBJbSBNM1YgTTdEICAgICAgICAgICAgIA0KS2Ftc2lpICAgICAgICAgICAgICAgICAgICAzMDIxIEE0NTc3OEMtQSAgIEFnICAgICAgICAgICAgICAgICAgICAgICAgICA2MjQgSW0gSzFWIE03RCAgICAgICAgICAgICANCkd1cmlzaGkgICAgICAgICAgICAgICAgICAgMzAyMiBCNzU2OTk5LUIgTiBIaSAgICAgICAgICAgICAgICAgICAgICAgICAgODA0IEltIEcwViBNM0QgICAgICAgICAgICAgDQpNYW5sdXVzaGFnaSAgICAgICAgICAgICAgIDMwMjUgQzIwMDM1My1DIFMgTG8gTmkgVmEgICAgICAgICAgICAgICAgICAgIDYyMSBJbSBNN1YgICAgICAgICAgICAgICAgIA0KVXVtZXNoYWwgICAgICAgICAgICAgICAgICAzMDI2IEMzNjM0NDUtOCAgIE5pICAgICAgICAgICAgICAgICAgICAgICAgICAxMDIgSW0gSzBWICAgICAgICAgICAgICAgICANCkd1dXphIEJlbSAgICAgICAgICAgICAgICAgMzAyNyBCOUQ1NzY5LTggTiBGbCAgICAgICAgICAgICAgICAgICAgICAgIEEgMzIzIEltIE0zViBNNUQgTTFEICAgICAgICAgDQpEdXJndXUgICAgICAgICAgICAgICAgICAgIDMwMjggQTM3MzQ2Qi1GICAgTmkgICAgICAgICAgICAgICAgICAgICAgICAgIDMwMSBJbSBNMlYgICAgICAgICAgICAgICAgIA0KQXNobWVsYW0gICAgICAgICAgICAgICAgICAzMDMzIEE0MjQ1ODgtRiBOIE5pIENwICAgICAgICAgICAgICAgICAgICAgICAxMDMgSW0gSzJWICAgICAgICAgICAgICAgICANCklpc2hhYW5rYSAgICAgICAgICAgICAgICAgMzAzNCBBNTU0NzU1LUQgVyBBZyAgICAgICAgICAgICAgICAgICAgICAgICAgOTAzIEltIEszViBNM0QgICAgICAgICAgICAgDQpMYXNodXBpaSAgICAgICAgICAgICAgICAgIDMwMzcgRTY2NTY1NS02ICAgQWcgTmkgUmkgICAgICAgICAgICAgICAgICAgIDkyMiBJbSBNM1YgICAgICAgICAgICAgICAgIA0KS2lpZ2d1cmEgICAgICAgICAgICAgICAgICAzMDM5IEI4QjQ0NDItRCBTIE5pIEZsICAgICAgICAgICAgICAgICAgICAgICA2MDEgSW0gRzBWICAgICAgICAgICAgICAgICANClVubGFraGFyICAgICAgICAgICAgICAgICAgMzA0MCBCNjI5OTk3LUYgTiBIaSBJbiAgICAgICAgICAgICAgICAgICAgICAgNjAzIEltIEszViAgICAgICAgICAgICAgICAgDQpFZHphICAgICAgICAgICAgICAgICAgICAgIDMxMDEgQjczQTE0Ni1DIFMgTG8gTmkgV2EgICAgICAgICAgICAgICAgICAgIDEwNCBJbSBHMlYgTThEICAgICAgICAgICAgIA0KR2FyZW4gICAgICAgICAgICAgICAgICAgICAzMTAzIEI0Mzk1NjgtRSAgIE5pICAgICAgICAgICAgICAgICAgICAgICAgICAyMTQgSW0gSzRWIE00ViAgICAgICAgICAgICANCkFhZGtoYSBOYSAgICAgICAgICAgICAgICAgMzEwNCBFMjAwNzc2LUEgICBOYSBWYSAgICAgICAgICAgICAgICAgICAgICAgOTMxIEltIEcwViBNNkQgICAgICAgICAgICAgDQpLaXIgICAgICAgICAgICAgICAgICAgICAgIDMxMDUgQjMwMDczMi1FIE4gTmEgVmEgICAgICAgICAgICAgICAgICAgICAgIDIxMCBJbSBNM1YgICAgICAgICAgICAgICAgIA0KSHJlb3dhbiAgICAgICAgICAgICAgICAgICAzMTA2IEI0MjUyNzgtQSAgIExvIE5pICAgICAgICAgICAgICAgICAgICAgICA0MDMgSW0gSzhWICAgICAgICAgICAgICAgICANClJ1aWdpdXIgICAgICAgICAgICAgICAgICAgMzExMyBFMzQyNjQ3LTUgICBOaSBQbyAgICAgICAgICAgICAgICAgICAgICAgMjA0IFN5IE0yRCBNNEQgICAgICAgICAgICAgDQpNYXJrYXNoZXIgICAgICAgICAgICAgICAgIDMxMTUgQzU1NDlDQy04ICAgSGkgTmEgICAgICAgICAgICAgICAgICAgICAgIDQyMCBTeSBLOElWICAgICAgICAgICAgICAgIA0KS2hpaXJpICAgICAgICAgICAgICAgICAgICAzMTE3IEIyMDA0NTYtQiAgIExvIE5pIFZhICAgICAgICAgICAgICAgICAgICAyMTQgU3kgTTVJViAgICAgICAgICAgICAgICANCkxlbWlraSAgICAgICAgICAgICAgICAgICAgMzExOCBDNTZBOThCLUMgICBIaSBXYSAgICAgICAgICAgICAgICAgICAgICAgNzExIEltIEsxViAgICAgICAgICAgICAgICAgDQpLYWdhc2ggICAgICAgICAgICAgICAgICAgIDMxMjEgQzU1NDhBQS02ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwMiBJbSBNMlYgTTlEICAgICAgICAgICAgIA0KS2Fua3V1cCBJciAgICAgICAgICAgICAgICAzMTIzIEI0MjQ3QTgtQSBBICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MTQgSW0gTTNWICAgICAgICAgICAgICAgICANCkthZHVzaGlpICAgICAgICAgICAgICAgICAgMzEyNSBENjk1OTczLUEgUyBIaSBJbiAgICAgICAgICAgICAgICAgICAgICAgNzEzIEltIE0yViAgICAgICAgICAgICAgICAgDQpBcmthZGtoaSAgICAgICAgICAgICAgICAgIDMxMjcgQjc3OTMzMy1EIEEgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDMwNCBJbSBLMklWICAgICAgICAgICAgICAgIA0KTWlzaCAgICAgICAgICAgICAgICAgICAgICAzMTI4IEI2Nzk4ODUtRCBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MDMgSW0gTTZWSSAgICAgICAgICAgICAgICANCktlcmFzIFZsYSAgICAgICAgICAgICAgICAgMzEyOSBCODY3NDMwLUEgQSBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgMzAzIEltIEswViAgICAgICAgICAgICAgICAgDQpBZ2RhbSBHaWkgICAgICAgICAgICAgICAgIDMxMzAgQjU1Nzc3NC1DICAgQWcgICAgICAgICAgICAgICAgICAgICAgICAgIDQyMCBJbSBNOUlJSSBLOEQgICAgICAgICAgIA0KQXNoZ2EgICAgICAgICAgICAgICAgICAgICAzMTMxIEE3QzM4NzQtQyAgIEZsICAgICAgICAgICAgICAgICAgICAgICAgICA1MTMgSW0gSzJWIE02RCAgICAgICAgICAgICANCktpbnVyaSAgICAgICAgICAgICAgICAgICAgMzEzMiBCNDYyNUFDLUEgTiBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwIEltIEcwViBNNUQgICAgICAgICAgICAgDQpOaW5kYWtpciAgICAgICAgICAgICAgICAgIDMxMzMgQzM2MjY3Qi04ICAgTmkgUmkgICAgICAgICAgICAgICAgICAgICAgIDMwMiBJbSBNNUlWIE0zRCAgICAgICAgICAgIA0KQXJsYSAgICAgICAgICAgICAgICAgICAgICAzMTM1IEI1OEE3NjMtQSBOIFJpIFdhICAgICAgICAgICAgICAgICAgICAgICA0MDAgSW0gSzJWICAgICAgICAgICAgICAgICANCklpbWRpaSAgICAgICAgICAgICAgICAgICAgMzEzNyBCNDkzNjY2LTggTiBOaSAgICAgICAgICAgICAgICAgICAgICAgICAgNjAzIEltIE0xViAgICAgICAgICAgICAgICAgDQpLZXJndW1pciAgICAgICAgICAgICAgICAgIDMxNDAgQTU2Mjg5OC1CIFMgUmkgICAgICAgICAgICAgICAgICAgICAgICAgIDIxMCBJbSBHMElWICAgICAgICAgICAgICAgIA0KTWFlZ2hlbiAgICAgICAgICAgICAgICAgICAzMjAzIEM2Njg3NjktNSBTIEFnIFJpICAgICAgICAgICAgICAgICAgICAgICA5MTEgSW0gRzNWICAgICAgICAgICAgICAgICANCkZsdWVyZSAgICAgICAgICAgICAgICAgICAgMzIwNSBCNzY1NjYyLTcgTiBBZyBOaSBSaSAgICAgICAgICAgICAgICAgICAgNzEzIEltIEs5SVYgTTZEICAgICAgICAgICAgDQpEaW0gICAgICAgICAgICAgICAgICAgICAgIDMyMDYgQzY0NjQ0NC04ICAgTmkgICAgICAgICAgICAgICAgICAgICAgICAgIDMwNCBJbSBNNlZJICAgICAgICAgICAgICAgIA0KSW1raGFnIEd1dSAgICAgICAgICAgICAgICAzMjA3IEM1Njc3ODktNiAgIEFnIFJpICAgICAgICAgICAgICAgICAgICAgICA2MDAgSW0gRzJWIE00RCAgICAgICAgICAgICANCkFnZHV1ICAgICAgICAgICAgICAgICAgICAgMzIwOCBFNDAwMTAyLUIgICBMbyBOaSBWYSAgICAgICAgICAgICAgICAgICAgOTA0IEltIE0xViBNN0QgICAgICAgICAgICAgDQpFbmthaWVpbiAgICAgICAgICAgICAgICAgIDMyMTAgQTk2NTMxMi1DICAgTG8gTmkgICAgICAgICAgICAgICAgICAgICAgIDUwNSBJbSBLNlYgICAgICAgICAgICAgICAgIA0KWmlraGkgICAgICAgICAgICAgICAgICAgICAzMjExIEM0Mjc1MzUtRCAgIE5pICAgICAgICAgICAgICAgICAgICAgICAgICAxMDIgSW0gTTBWIE03RCBNNkQgICAgICAgICANClNoYW5kICAgICAgICAgICAgICAgICAgICAgMzIxNiBCOTY0NDQzLTggICBMbyBOaSAgICAgICAgICAgICAgICAgICAgICAgOTEzIFN5IEs0ViBNMEQgICAgICAgICAgICAgDQpLYXNraWkgICAgICAgICAgICAgICAgICAgIDMyMTggQTMwMEE5OC1GIE4gSGkgTmEgSW4gVmEgQ3AgICAgICAgICAgICAgIDUwNCBJbSBHNFYgICAgICAgICAgICAgICAgIA0KRHV1a2EgICAgICAgICAgICAgICAgICAgICAzMjI2IEI2ODY1NzYtQyBOIEFnIE5pICAgICAgICAgICAgICAgICAgICAgICA2MDAgSW0gRjJWICAgICAgICAgICAgICAgICANCkFzaGFzaCBBcyAgICAgICAgICAgICAgICAgMzIyNyBCNzU4NTc3LTkgICBBZyBOaSAgICAgICAgICAgICAgICAgICAgICAgOTAzIEltIE0yViBNNkQgICAgICAgICAgICAgDQpHYXUgICAgICAgICAgICAgICAgICAgICAgIDMyMzQgQjQzMzc2NC1FICAgTmEgUG8gICAgICAgICAgICAgICAgICAgICAgIDUyMCBJbSBNNUlJSSBNMkQgICAgICAgICAgIA0KVGFsaXlhbiAgICAgICAgICAgICAgICAgICAzMjM1IEI3NUE0MzEtOSAgIE5pIFdhICAgICAgICAgICAgICAgICAgICAgICA2MTMgSW0gTTFWICAgICAgICAgICAgICAgICANCkxpc2hpZGUgICAgICAgICAgICAgICAgICAgMzIzOCBFNTYwNjcyLTYgICBOaSBSaSBEZSAgICAgICAgICAgICAgICAgICAgNTAzIEltIE0yViBNNEQgICAgICAgICAgICAg -------------------------------------------------------------------------------- /travGen.js: -------------------------------------------------------------------------------- 1 | // Constants for sector size 2 | var SEC_COLS = 32; 3 | var SEC_ROWS = 40; 4 | // Constant for jump distance 5 | var JUMP_DIST = 2; 6 | 7 | /** 8 | * Creates an instance of a Sector 9 | * 10 | * @constructor 11 | * @param {string} name of the Sector 12 | */ 13 | function Sector(name){ 14 | this.metadata = {}; 15 | this.worlds = []; 16 | this.secMap = {}; 17 | this.subsectors = []; 18 | this.tradeRoutes = []; // TODO: change this to generic routes? i think so 19 | 20 | this.metadata.name = name; 21 | this.metadata.density = 0; 22 | this.metadata.maturity = 3; 23 | 24 | this.generate = function(density,maturity){ 25 | var name = "Unnamed"; // TODO: Name generator 26 | this.metadata.density = density; 27 | this.metadata.maturity = maturity; 28 | for (var x=1; x <= SEC_COLS; ++x) { 29 | for (var y=1; y <= SEC_ROWS; ++y) { 30 | // Determine if world should be generated 31 | if (roll(100,1,0) > this.metadata.density) { 32 | continue; 33 | } 34 | var system = new World(x,y,name,this.metadata.maturity); 35 | system.generate(); 36 | this.worlds.push(system); 37 | } 38 | } 39 | 40 | // Partition worlds into subsectors 41 | this.createSubsectors(); 42 | this.splitSector(); 43 | this.createMap(); 44 | } 45 | 46 | /* Converts a sector file (text) into a sector object */ 47 | this.parseSector = function(text){ 48 | 49 | this.createSubsectors(); 50 | /* 51 | for (var i = 0; i < 16; i += 1) { 52 | // Creates 16 subsectors each with its own world array 53 | this.subsectors[i] = {worlds: []}; 54 | } 55 | */ 56 | var lineArr = []; 57 | var count = 0; 58 | 59 | text.split(/\r?\n/).forEach(function(line) { 60 | lineArr[count] = line; 61 | count++; 62 | }); 63 | 64 | var len = lineArr.length; 65 | 66 | for(var x=0; x < len; x++){ 67 | var ss; 68 | 69 | if (lineArr[x].match(/^(.{10,}) (\d\d\d\d) (\w\w\w\w\w\w\w-\w) (\w| ) (.{10,}) +(\w| ) (\w\w\w) (\w\w)/)) { 70 | // Matches data lines for systems 71 | var w = new World(0,0,"Unnamed",3); 72 | var u = new UWP(); 73 | 74 | w.name = RegExp.$1; 75 | w.x = hexCol(RegExp.$2); 76 | w.y = hexRow(RegExp.$2); 77 | w.hex = RegExp.$2; 78 | u.parseUWP(RegExp.$3); 79 | w.uwp = u; 80 | w.base = RegExp.$4; 81 | w.trade.parseTradeCodes(RegExp.$5); 82 | if(RegExp.$6 == "A") { w.zone = 1; } 83 | if(RegExp.$6 == "R") { w.zone = 2; } 84 | w.pmod = hexToNum(RegExp.$7.charAt(0)); 85 | w.belt = hexToNum(RegExp.$7.charAt(1)); 86 | w.gas = hexToNum(RegExp.$7.charAt(2)); 87 | w.alg = RegExp.$8; 88 | 89 | w.name = w.name.trim(); 90 | 91 | // Calculate WTN per GURPS Far Trader rules 92 | w.genUWTN(); 93 | w.genWTN(); 94 | w.population = Math.pow(10, w.uwp.pop) * w.pmod; 95 | 96 | this.worlds.push(w); 97 | }else if (lineArr[x].match(/^#\s+Subsector\s+([A-P]):\s+(.*)/i)) { 98 | // Match comments for Subsector names, eg. # Subsector A: Orion 99 | ss = RegExp.$1.charCodeAt(0) - "A".charCodeAt(0); 100 | ss = this.subsectors[ss]; 101 | ss.name = RegExp.$2; 102 | ss.index = RegExp.$1; 103 | ss.name = ss.name.trim(); 104 | }else if (lineArr[x].match(/^#\s+Name:\s+(.*?)( \(.*\))?$/i)) { 105 | // Match comments for sector names, eg. # Name: Orion (vi) 106 | this.metadata.name = this.metadata.name || RegExp.$1.trim(); 107 | }else if (lineArr[x].match(/^#\s+Alleg:\s+(.*?)( \(.*\))?$/i)) { 108 | // TODO: Create an allegiance object for the sector?? 109 | //console.log("Alleg 1: " + RegExp.$1); 110 | //console.log("Alleg 2: " + RegExp.$2); 111 | }else if (lineArr[x].match(/^#\s+(.*):\s+(.*)/i)) { 112 | // More generically matches comments for sec name, author, source, ref, subsec, and allegiance 113 | this.metadata[RegExp.$1.toLowerCase()] = RegExp.$2.trim(); 114 | } 115 | } 116 | 117 | this.splitSector(); 118 | this.createMap(); 119 | } 120 | 121 | /* Converts a sector object into text (in .sec file format) */ 122 | this.writeSector = function(){ 123 | var array = []; 124 | // Grab each world, create a world string, and add it to the array 125 | this.worlds.forEach(function(world) { 126 | array.push(world.writeWorld()); 127 | }); 128 | // Create text, one world string per line 129 | return array.join("\n"); 130 | } 131 | 132 | this.writeSectorHTML = function(){ 133 | var array = []; 134 | array.push("
");
135 | 		// Grab each world, create a world string, and add it to the array
136 | 		this.worlds.forEach(function(world) {
137 | 			array.push(world.writeWorld());
138 | 		});
139 | 		array.push("
"); 140 | // Create text, one world string per line 141 | return array.join("
"); 142 | } 143 | 144 | this.splitSector = function(){ 145 | var wlen = this.worlds.length; 146 | // Partition worlds into subsectors 147 | for(var w=0; w < wlen; w++){ 148 | var ss = this.worlds[w].getSubsec(); 149 | //console.log("ss: " + ss); 150 | this.subsectors[ss].worlds.push(this.worlds[w]); 151 | } 152 | } 153 | 154 | this.createSubsectors = function(){ 155 | for (var i = 0; i < 16; i += 1) { 156 | // Creates 16 subsectors each with its own world array 157 | this.subsectors[i] = {worlds: []}; 158 | } 159 | } 160 | 161 | /* Creates a sectorMap object from a world array */ 162 | // TODO: Make this private, create removeWorld and addWorld methods that will do a map update 163 | this.createMap = function(){ 164 | for(var x in this.worlds){ 165 | this.secMap[this.worlds[x].hex] = 1; 166 | } 167 | } 168 | 169 | /* Generates trade routes for the sector */ 170 | this.generateTradeRoutes = function(){ 171 | // Create routes array containing all route objects 172 | var type = "trade"; 173 | var len = this.worlds.length; 174 | 175 | for(var i=0; i < len; i++){ 176 | var start = this.worlds[i]; 177 | for(var x=i+1; x < len; x++){ 178 | //console.log(x); 179 | var end = this.worlds[x]; 180 | var rt = new Route(start.hex,end.hex,type); 181 | //console.log("rt: " + rt); 182 | // Calculate best route for jump length 183 | rt.calculatePath(JUMP_DIST,this.secMap); 184 | console.log("Path: " + rt.path); 185 | // If there is no route, go to the next pair 186 | if (rt.path == undefined){ continue; } 187 | // If there is a route, calculate the BTN 188 | rt.genBTN(start,end); 189 | console.log("BTN: " + rt.btn); 190 | // If BTN is high enough, add to tradeRoutes object 191 | if (rt.btn >= MIN_BTN){ 192 | this.tradeRoutes.push(route); 193 | } 194 | } 195 | } 196 | } 197 | 198 | this.addWorld = function(world){ 199 | // Add to world array 200 | this.worlds.push(world); 201 | // Update map object 202 | this.secMap[world.hex] = 1; 203 | // Add to subsector array 204 | var ss = world.getSubsec(); 205 | this.subsectors[ss].addWorld(world); 206 | 207 | } 208 | 209 | this.delWorld = function(hex){ 210 | // TODO: Delete a world 211 | // Update map object 212 | // Update subsector and world arrays 213 | } 214 | 215 | }; 216 | 217 | 218 | /** 219 | * Creates an instance of a Subsector 220 | * 221 | * @constructor 222 | * @param {string} letter of the Subsector 223 | */ 224 | function Subsector(letter){ 225 | this.name = ""; 226 | this.index = hexToNum(letter); 227 | this.letter = letter; 228 | this.worlds = []; 229 | 230 | this.generate = function(){ 231 | // TODO 232 | } 233 | 234 | this.parseSubsec = function(letter){ 235 | // Takes text and puts it into subsec object 236 | } 237 | 238 | this.writeSubsec = function(letter){ 239 | // Writes the subsector to text? 240 | } 241 | 242 | this.addWorld = function(world){ 243 | 244 | } 245 | }; 246 | 247 | 248 | /** 249 | * Creates an instance of a World 250 | * 251 | * @constructor 252 | * @param {string} x coordinate in the Sector 253 | * @param {string} y coordinate in the Sector 254 | * @param {string} name of the World 255 | * @param {string} maturity of the World 256 | */ 257 | function World(x,y,name,maturity){ 258 | this.name = name; 259 | this.x = x; 260 | this.y = y; 261 | this.hex = rjust(this.x.toString(), 2, "0") + rjust(this.y.toString(), 2, "0"); 262 | this.mat = maturity; 263 | this.uwp = new UWP(); 264 | this.base = " "; 265 | this.trade = new TradeCodes(); 266 | this.pmod = 0; 267 | this.gas = 0; 268 | this.belt = 0; 269 | this.zone = 0; 270 | this.alg = "Un"; 271 | 272 | this.uwtn = 0; 273 | this.wtn = 0; 274 | 275 | // TODO should a world keep track of its subsector and sector? probably. 276 | // TODO create a setHex method for x and y, remove x and y from constructor 277 | // TODO generate should take maturity 278 | 279 | this.generate = function(){ 280 | this.genUwp(); 281 | this.genExt(); 282 | this.genTradeNumber(); 283 | } 284 | 285 | this.parseWorld = function(){ 286 | // TODO Takes a world string and parses it into a World object 287 | } 288 | 289 | /* Concatenates a World object into a world string */ 290 | this.writeWorld = function(){ 291 | var line = ljust(this.name,25," "); 292 | line += this.hex; 293 | line += " "; 294 | line += this.uwp.writeUWP(); 295 | line += this.base + " "; 296 | line += ljust(this.trade.writeTradeCodes(),15," "); 297 | line += rjust(" AR".charAt(this.zone),11," ") + " "; 298 | line += this.pmod; 299 | line += this.belt; 300 | line += this.gas + " "; 301 | line += this.alg; 302 | return line; 303 | } 304 | 305 | /* Generates UWP for a world */ 306 | this.genUwp = function(){ 307 | this.uwp.generate(this.mat) 308 | } 309 | 310 | /* Generates extended stats for a world */ 311 | this.genExt = function(){ 312 | this.genBase(this.uwp); 313 | this.trade.generate(this.uwp); 314 | this.genPopMod(); 315 | this.genGasGiant(); 316 | this.genPlanBelt(); 317 | this.genTravelZone(this.uwp); 318 | this.genAllegiance(); 319 | } 320 | 321 | /* Generates a trade number for a world */ 322 | this.genTradeNumber = function(){ 323 | this.genUWTN(); 324 | this.genWTN(); 325 | } 326 | 327 | /* Generates what bases, if any, for a world */ 328 | this.genBase = function(uwp){ 329 | var nav,sct,mil = 0; 330 | 331 | if (uwp.stp == 10){ // A 332 | if (roll(6,2,0) > 7) { nav = 1; } 333 | if (roll(6,2,0) > 9) { sct = 1; } 334 | if (roll(6,2,0) > 9) { mil = 1; } 335 | } 336 | 337 | if (uwp.stp == 11){ // B 338 | if (roll(6,2,0) > 7) { nav = 1; } 339 | if (roll(6,2,0) > 8) { sct = 1; } 340 | if (roll(6,2,0) > 8) { mil = 1; } 341 | } 342 | 343 | if (uwp.stp == 12){ // C 344 | if (roll(6,2,0) > 7) { sct = 1; } 345 | if (roll(6,2,0) > 7) { mil = 1; } 346 | } 347 | 348 | if (uwp.stp == 13){ // D 349 | if (roll(6,2,0) > 6) { sct = 1; } 350 | } 351 | 352 | if (nav && !sct) { this.base = "N"; } 353 | if (!nav && sct) { this.base = "S"; } 354 | if (nav && sct) { this.base = "A"; } 355 | if (!nav && !sct && mil) { this.base = "M"; } 356 | } 357 | 358 | /* Generates population multiplier for the mainworld */ 359 | this.genPopMod = function(){ 360 | if (roll(6,1,0) % 2){ 361 | this.pmod = reroll(6,1,-1,5); 362 | }else{ 363 | this.pmod = reroll(6,1,4,10); 364 | } 365 | } 366 | 367 | /* Generates gas giants for a system */ 368 | this.genGasGiant = function(){ 369 | if (roll(6,2,0) > 4){ 370 | var res = roll2D(); 371 | if (res < 10){ 372 | this.gas = Math.floor(res / 2); 373 | }else{ 374 | this.gas = Math.ceil(res / 2 - 1); 375 | } 376 | }else{ this.gas = 0; } 377 | } 378 | 379 | /* Generates planetoid belts for a system */ 380 | this.genPlanBelt = function(){ 381 | var res = roll(6,2,this.gas); 382 | if (res < 8){ plb = 1 } 383 | if (res == 12){ 384 | this.belt = 3; 385 | }else{ 386 | this.belt = 2; 387 | } 388 | } 389 | 390 | /* Generates the Travel Zone designation, if any, for a world */ 391 | this.genTravelZone = function(uwp){ 392 | if (uwp.stp == 33) { this.zone = 2; } 393 | if (uwp.gov == 10 && uwp.law == 20) { this.zone = 1; } 394 | if (uwp.gov == 11 && uwp.law > 18) { this.zone = 1; } 395 | if (uwp.gov == 12 && uwp.law > 17) { this.zone = 1; } 396 | if (uwp.gov == 13 && uwp.law > 16) { this.zone = 1; } 397 | if (uwp.gov == 13 && uwp.law == 20) { this.zone = 2; } 398 | if (uwp.gov == 14 && uwp.law > 16 && uwp.law < 19) { this.zone = 1; } 399 | if (uwp.gov == 14 && uwp.law > 18) { this.zone = 2; } 400 | if (uwp.gov == 15 && uwp.law > 15) { this.zone = 1; } 401 | if (uwp.gov == 15 && uwp.law > 17) { this.zone = 2; } 402 | } 403 | 404 | /* Generates the Allegiance for a world */ 405 | this.genAllegiance = function(){ 406 | // TODO: Allegiance list config 407 | this.alg = "Rg"; 408 | } 409 | 410 | /* Generates UWTN for a world */ 411 | this.genUWTN = function(){ 412 | 413 | var tlConvert = [13,12,11,10,10,9,9,9,8,7,6,6,5,5,5,4,3]; // GURPS to Traveller TL conversion array 414 | // 1. Determine Unmodified World Trade Number (UWTN) 415 | 416 | // TL Modifier 417 | var tl = tlConvert[this.uwp.tl]; 418 | var tlMod = 1.5; 419 | if (tl < 12) { tlMod -= .5; } 420 | if (tl < 9) { tlMod -= .5; } 421 | if (tl < 6) { tlMod -= .5; } 422 | if (tl < 3) { tlMod -= .5; } 423 | 424 | // Determine Population Modifier 425 | var popMod = this.uwp.pop / 2; 426 | 427 | this.uwtn = popMod + tlMod; 428 | } 429 | 430 | /* Generates WTN for a world */ 431 | this.genWTN = function(){ 432 | 433 | // 2. Determine Port Modifier 434 | // Set up arrays of modifiers for the "chart", one list per Starport Class 435 | var pmA = [1.5,1,1,.5,.5,0,0,0]; 436 | var pmB = [1,1,.5,.5,0,0,-.5,-1]; 437 | var pmC = [1,.5,.5,0,0,-.5,-1,-1.5]; 438 | var pmD = [.5,.5,0,0,-0.5,-1,-1.5,-2]; 439 | var pmE = [.5,0,0,-.5,-1,-1.5,-2,-2.5]; 440 | var pmX = [0,0,-2.5,-3,-3.5,-4,-4.5,-5]; 441 | 442 | // Add each Starport Class modifier list to the master array to create the "chart", at its base_36 location 443 | var pmArr = []; 444 | pmArr[10] = pmA; 445 | pmArr[11] = pmB; 446 | pmArr[12] = pmC; 447 | pmArr[13] = pmD; 448 | pmArr[14] = pmE; 449 | pmArr[33] = pmX; 450 | 451 | // Round UWTN down to use in lookup of Port Modifier 452 | var ruwtn = Math.floor(this.uwtn); 453 | if (ruwtn > 7) { ruwtn = 7; } 454 | if (ruwtn < 1) { ruwtn = 0; } 455 | 456 | // Use UWTN and converted Starport number to lookup the Port Modifier from the "chart" 457 | var portMod = pmArr[this.uwp.stp][ruwtn]; 458 | 459 | // 3. Determine World Trade Number 460 | this.wtn = this.uwtn + portMod; 461 | } 462 | 463 | this.getSubsec = function(){ 464 | var ss = Math.floor((this.x - 1) / (SEC_COLS / 4)) + Math.floor((this.y - 1) / (SEC_ROWS / 4)) * 4; 465 | return ss; 466 | } 467 | }; 468 | 469 | 470 | /** 471 | * Creates an instance of a UWP 472 | * 473 | * @constructor 474 | */ 475 | function UWP(){ 476 | this.stp = 35; 477 | this.size = 0; 478 | this.atm = 0; 479 | this.hyd = 0; 480 | this.pop = 0; 481 | this.gov = 0; 482 | this.law = 0; 483 | this.tl = 0; 484 | 485 | /* Generates the entire UWP */ 486 | this.generate = function(maturity){ 487 | console.log("Generate"); 488 | this.genStarport(maturity); 489 | this.genSize(); 490 | this.genAtmo(this.size); 491 | this.genHydro(this.size,this.atm); 492 | this.genPop(); 493 | this.genGov(this.pop); 494 | this.genLaw(this.gov); 495 | this.genTL(this.stp,this.size,this.atm,this.hyd,this.pop,this.gov); 496 | } 497 | 498 | this.parseUWP = function(text){ 499 | this.stp = hexToNum(text.charAt(0)); 500 | this.siz = hexToNum(text.charAt(1)); 501 | this.atm = hexToNum(text.charAt(2)); 502 | this.hyd = hexToNum(text.charAt(3)); 503 | this.pop = hexToNum(text.charAt(4)); 504 | this.gov = hexToNum(text.charAt(5)); 505 | this.law = hexToNum(text.charAt(6)); 506 | this.tl = hexToNum(text.charAt(8)); 507 | } 508 | 509 | this.writeUWP = function(){ 510 | var upp = this.stp; 511 | upp += numToHex(this.siz); 512 | upp += numToHex(this.atm); 513 | upp += numToHex(this.hyd); 514 | upp += numToHex(this.pop); 515 | upp += numToHex(this.gov); 516 | upp += numToHex(this.law); 517 | upp += "-"; 518 | upp += numToHex(this.tl); 519 | upp += " "; 520 | return upp; 521 | } 522 | 523 | /* Generates the Starport */ 524 | this.genStarport = function(maturity){ 525 | // Starport quality 526 | var stp = "X"; 527 | switch(maturity){ 528 | case 1: // backwater 529 | stp = "NAABBCCCDEEX".charAt(roll(6,2,-1)); 530 | break; 531 | case 2: // frontier 532 | stp = "NAAABBCCDEEX".charAt(roll(6,2,-1)); 533 | break; 534 | case 4: //cluster 535 | stp = "NAAAABBCCDEX".charAt(roll(6,2,-1)); 536 | break; 537 | default: // mature 538 | stp = "NAAABBCCDEEE".charAt(roll(6,2,-1)); 539 | break; 540 | } 541 | this.stp = parseInt(stp,36); 542 | } 543 | 544 | /* Generates the Size of a world */ 545 | this.genSize = function(){ 546 | this.size = roll(6,2,-2); 547 | } 548 | 549 | /* Generates the Atmosphere type for a world */ 550 | this.genAtmo = function(size){ 551 | this.atm = roll(6,2,-7) + size; 552 | if (size < 0 || this.atm < 0) { this.atm = 0; } 553 | } 554 | 555 | /* Generates the Hydrographic percentage for a world */ 556 | this.genHydro = function(size,atmo){ 557 | this.hyd = roll(6,2,-7) + size; 558 | if (size < 2) { this.hyd = 0; } 559 | if (atmo < 2 || atmo > 9) { this.hyd -= 4; } 560 | if (this.hyd < 0) { this.hyd = 0; } 561 | if (this.hyd > 10) { this.hyd = 10; } 562 | } 563 | 564 | /* Generates the Population of a world */ 565 | this.genPop = function(){ 566 | this.pop = roll(6,2,-2); 567 | } 568 | 569 | /* Generates the Government type for a world */ 570 | this.genGov = function(pop){ 571 | this.gov = roll(6,2,-7) + pop; 572 | if (this.gov < 0) { this.gov = 0; } 573 | } 574 | 575 | /* Generates the Law Level for a world */ 576 | this.genLaw = function(gov){ 577 | this.law = roll(6,2,-7) + gov; 578 | if (this.law < 0) { this.law = 0; } 579 | } 580 | 581 | /* Generates the Tech level for a world */ 582 | this.genTL = function(stp,size,atmo,hydro,pop,gov){ 583 | this.tl = roll(6,1,0); 584 | if (stp == 10) { this.tl += 6; } 585 | if (stp == 11) { this.tl += 4; } 586 | if (stp == 12) { this.tl += 2; } 587 | //if (stp == 15) { this.tl += 1; } // Errata, but there is no starport F 588 | if (stp == 33) { this.tl -= 4; } 589 | if (size < 5) { this.tl += 1; if (size < 2) { this.tl += 1; } } 590 | if (atmo < 4) { this.tl += 1; } 591 | if (atmo > 9) { this.tl += 1; } 592 | if (hydro > 8) { this.tl += 1; if (hydro > 9) { this.tl += 1; } } 593 | if (pop > 0 && pop < 6) { this.tl += 1; } 594 | if (pop > 8) { this.tl += 2; if (pop > 9) { this.tl += 2; } } 595 | if (gov == 0 || gov == 5) { this.tl += 1; } 596 | if (gov == 13) { this.tl -= 2; } 597 | if (gov > 13) { this.tl -= 1; } // Errata 598 | if (this.tl < 0) { this.tl = 0; } 599 | } 600 | 601 | }; 602 | 603 | 604 | /** 605 | * Creates an instance of a Route 606 | * 607 | * @constructor 608 | * @param {string} start hex of the Route 609 | * @param {string} end hex of the Route 610 | * @param {string} type of Route (trade, xboat, gate, wormhole, etc.) 611 | */ 612 | function Route(start,end,type){ 613 | this.type = type; // trade, xboat, gate, wormhole, etc. 614 | this.start = start; // start hex 615 | this.end = end; // end hex 616 | this.distance = dist(start,end); 617 | this.path = []; // array of full path of all hexes, in order 618 | this.btn = 0; // BTN for start-end pair 619 | this.secx = 0; // x coord of sector, relative to start 620 | this.secy = 0; // y coord of sector, relative to start 621 | 622 | /* Determines whether there is a route between two world given a specific jump distance and returns the path */ 623 | this.calculatePath = function(jump,map){ 624 | var opened = new List(); 625 | var closed = new List(); 626 | 627 | // add the starting node to the open list 628 | opened.add(new Node(this.start, 0, 0, undefined)); 629 | // while the open list is not empty 630 | while(!opened.isEmpty()){ 631 | // current node = node from open list with the lowest cost 632 | var currentNode = opened.getLowestCostNode(); 633 | //alert(currentNode); 634 | // if current node = goal node then path complete 635 | if(currentNode.id == this.end){ 636 | var path = []; 637 | var node = currentNode; 638 | path.unshift(node.id); 639 | while(node.parent){ 640 | node = node.parent; 641 | path.unshift(node.id); 642 | } 643 | this.path = path; 644 | }else{ 645 | // Move current node to the closed list 646 | opened.remove(currentNode); 647 | closed.add(currentNode); 648 | // Examine each node adjacent to the current node 649 | var adjacentHexes = reachableHexes(currentNode.id, jump); 650 | // For each adjacent node 651 | var length = adjacentHexes.length; 652 | for(var i = 0; i < length; i++){ 653 | var adjacentHex = adjacentHexes[i]; 654 | var adjacentNode = new Node(adjacentHex, -1, currentNode.steps+1, currentNode); 655 | // if it isn't on the open list 656 | if(!opened.contains(adjacentNode)){ 657 | // and it isn't on the closed list 658 | if(!closed.contains(adjacentNode)){ 659 | // and it isn't an obstacle then 660 | if(map[adjacentHex] !== undefined){ 661 | // move it to open list and calculate cost 662 | opened.add(adjacentNode); 663 | var cost = adjacentNode.steps + dist(adjacentHex, this.end); 664 | // NOTE: Can tweak cost, e.g. 665 | // if RedZone then cost += 2, if AmberZone then cost += 1 666 | // if NoWater then cost += 1, if !Imperial then cost += 1 667 | adjacentNode.cost = cost; 668 | } 669 | } 670 | } 671 | } 672 | } 673 | } 674 | this.path = undefined; 675 | } 676 | 677 | 678 | /* Generate a BTN for a world pair */ 679 | this.genBTN = function(world1, world2){ 680 | 681 | var mods = {}; 682 | var modDist, modWCTM = 0; 683 | 684 | // 1. Determine World Trade Classification Modifier 685 | 686 | mods.wctm = 0; 687 | // Check to see if one world is Ag and the other is either Ex or Na 688 | if (world1.codes.ag) { 689 | if (world2.codes.ex || world2.codes.na){ mods.wctm += .5; } 690 | }else if (world2.codes.ag){ 691 | if (world1.codes.ex || world1.codes.na) { mods.wctm += .5; } 692 | } 693 | 694 | // Check to see if one world is In and the other is Ni 695 | if (world1.codes.in) { 696 | if (world2.codes.ni) { mods.wctm += .5; } 697 | }else if (world2.codes.in) { 698 | if (world1.codes.ni) { mods.wctm += .5; } 699 | } 700 | 701 | // Check to see if worlds share allegiences 702 | if (world1.alg != world2.alg) { mods.wctm -= .5; } 703 | 704 | // 2. Determine Distance Modifier 705 | var parsecs = routeLength(this.path); 706 | mods.dist = 0; 707 | if (parsecs > 1) { mods.dist += .5; } 708 | if (parsecs > 2) { mods.dist += .5; } 709 | if (parsecs > 5) { mods.dist += .5; } 710 | if (parsecs > 9) { mods.dist += .5; } 711 | if (parsecs > 19) { mods.dist += .5; } 712 | if (parsecs > 29) { mods.dist += .5; } 713 | if (parsecs > 59) { mods.dist += .5; } 714 | if (parsecs > 99) { mods.dist += .5; } 715 | if (parsecs > 199) { mods.dist += .5; } 716 | if (parsecs > 299) { mods.dist += .5; } 717 | if (parsecs > 599) { mods.dist += .5; } 718 | if (parsecs > 999) { mods.dist += .5; } 719 | 720 | // 3. Calculate Bilateral Trade Number (BTN) 721 | // BTN = WTN1 + WTN2 + WTCM - Distance Modifier 722 | this.btn = world1.wtn + world2.wtn + mods.wctm - mods.dist; 723 | if (world1.wtn < world2.wtn){ 724 | if (this.btn > world1.wtn + 5) { this.btn = world1.wtn + 5; } 725 | }else{ 726 | if (this.btn > world2.wtn + 5) { this.btn = world2.wtn + 5; } 727 | } 728 | } 729 | 730 | 731 | /* Returns the length of a route path in parsecs */ 732 | this.length = function(){ 733 | var len = this.path.length; 734 | var hops = 0; 735 | for(var x; x < len - 1; x++){ 736 | hops += dist(this.path[x],this.path[x-1]); 737 | } 738 | return hops; 739 | } 740 | }; 741 | 742 | 743 | /** 744 | * Creates an instnace of a Trade code 745 | * 746 | * @constructor 747 | */ 748 | function TradeCodes(){ 749 | this.ag = false; 750 | this.as = false; 751 | this.ba = false; 752 | this.de = false; 753 | this.fl = false; 754 | this.hi = false; 755 | this.ic = false; 756 | this.ind = false; 757 | this.lo = false; 758 | this.na = false; 759 | this.ni = false; 760 | this.po = false; 761 | this.ri = false; 762 | this.wa = false; 763 | this.cp = false; 764 | this.cx = false; 765 | 766 | /* Generates trade codes for a world */ 767 | this.generate = function(uwp){ 768 | if ((uwp.atm > 3 && uwp.atm < 10) && (uwp.hyd > 3 && uwp.hyd < 9) && (uwp.pop > 4 && uwp.pop < 8)){ this.ag = true; } 769 | if (uwp.size == 0 && uwp.atm == 0 && uwp.hyd == 0){ this.as = true; } else if (uwp.atm == 0){ this.va = true; } 770 | if (uwp.pop == 0 && uwp.gov == 0 && uwp.law == 0) { this.ba = true; } 771 | if (uwp.hyd == 0 && uwp.atm > 1) { this.de = true; } 772 | if (uwp.size > 9 && uwp.atm > 0) { this.fl = true; } 773 | if (uwp.pop > 8) { this.hi = true; } 774 | if (uwp.atm < 2 && uwp.hyd > 0) { this.ic = true; } 775 | if ((uwp.atm < 5 || uwp.atm == 7 || uwp.atm == 9) && uwp.pop > 8) { this.ind = true; } 776 | if (uwp.pop < 4) { this.lo = true; } 777 | if (uwp.atm < 4 && uwp.hyd < 4 && uwp.pop > 5) { this.na = true; } 778 | if (uwp.pop < 7) { this.ni = true; } 779 | if ((uwp.atm > 1 && uwp.atm < 6) && uwp.hyd < 4) { this.po = true; } 780 | if ((uwp.atm == 6 || uwp.atm == 8) && (uwp.pop > 5 && uwp.pop < 9) && (uwp.gov > 3 && uwp.gov < 10)){ this.ri = true; } 781 | if (uwp.hyd == 10) { this.wa = true; } 782 | } 783 | 784 | /* Parse a string of trade codes and set the world object properties */ 785 | this.parseTradeCodes = function(text){ 786 | var array = text.split(" "); 787 | var len = array.length; 788 | for(var x=0; x < len; x++){ 789 | switch(array[x]){ 790 | case "Ag": 791 | this.ag = true; 792 | break; 793 | case "As": 794 | this.as = true; 795 | break; 796 | case "Ba": 797 | this.ba = true; 798 | break; 799 | case "Cp": 800 | this.cp = true; 801 | break; 802 | case "Cx": 803 | this.cx = true; 804 | break; 805 | case "De": 806 | this.de = true; 807 | break; 808 | case "Fl": 809 | this.fl = true; 810 | break; 811 | case "Hi": 812 | this.hi = true; 813 | break; 814 | case "Ic": 815 | this.ic = true; 816 | break; 817 | case "In": 818 | this.ind = true; 819 | break; 820 | case "Lo": 821 | this.lo = true; 822 | break; 823 | case "Na": 824 | this.na = true; 825 | break; 826 | case "Ni": 827 | this.ni = true; 828 | break; 829 | case "Po": 830 | this.po = true; 831 | break; 832 | case "Ri": 833 | this.ri = true; 834 | break; 835 | case "Va": 836 | this.va = true; 837 | break; 838 | case "Wa": 839 | this.wa = true; 840 | break; 841 | case " ": 842 | break; 843 | case " ": 844 | break; 845 | case "": 846 | break; 847 | default: 848 | this[array[x].toLowerCase()] = true; 849 | break; 850 | } 851 | } 852 | } 853 | 854 | /* Create string from world trade code properties */ 855 | this.writeTradeCodes = function(){ 856 | var codes = ""; 857 | if (this.ag){ codes += "Ag "; } 858 | if (this.as){ codes += "As "; } 859 | if (this.ba){ codes += "Ba "; } 860 | if (this.cp){ codes += "Cp "; } 861 | if (this.cx){ codes += "Cx "; } 862 | if (this.de){ codes += "De "; } 863 | if (this.fl){ codes += "Fl "; } 864 | if (this.hi){ codes += "Hi "; } 865 | if (this.ic){ codes += "Ic "; } 866 | if (this.ind){ codes += "In "; } 867 | if (this.lo){ codes += "Lo "; } 868 | if (this.na){ codes += "Na "; } 869 | if (this.ni){ codes += "Ni "; } 870 | if (this.po){ codes += "Po "; } 871 | if (this.ri){ codes += "Ri "; } 872 | if (this.va){ codes += "Va "; } 873 | if (this.wa){ codes += "Wa"; } 874 | return codes; 875 | } 876 | }; 877 | -------------------------------------------------------------------------------- /travGenUtils.js: -------------------------------------------------------------------------------- 1 | /* Astrometric Constants */ 2 | Astrometrics = { 3 | ParsecScaleX: Math.cos(Math.PI / 6), // cos(30) 4 | ParsecScaleY: 1.0, 5 | SectorWidth: 32, 6 | SectorHeight: 40, 7 | ReferenceHexX: 1, // Reference is at Core 0140 8 | ReferenceHexY: 40, 9 | MinScale: 0.0078125, 10 | MaxScale: 512 11 | }; 12 | 13 | 14 | function roll(die,num,mod){ 15 | var result = 0; 16 | var count = 1; 17 | while(count <= num){ 18 | result = result + (Math.floor(Math.random() * die) + 1); 19 | count++; 20 | } 21 | result = result + mod; 22 | return result; 23 | } 24 | 25 | 26 | function reroll(die,num,mod,non){ 27 | var result = roll(die,num,mod); 28 | if (result == non){ 29 | result = reroll(die,num,mod,non); 30 | } 31 | return result; 32 | } 33 | 34 | 35 | function roll1D() { 36 | return roll(6,1,0); 37 | } 38 | 39 | 40 | function roll2D() { 41 | return roll(6,2,0); 42 | } 43 | 44 | 45 | function numToHex(n) { 46 | return "0123456789ABCDEFGHJKLMNOPQRSTUVWXYZ".charAt(n); 47 | } 48 | 49 | 50 | function hexToNum(n) { 51 | return "0123456789ABCDEFGHJKLMNOPQRSTUVWXYZ".indexOf(n.toUpperCase()); 52 | } 53 | 54 | 55 | function hexString(x,y){ 56 | var str = rjust(x.toString(),2,"0"); 57 | str += rjust(y.toString(),2,"0"); 58 | return str; 59 | } 60 | 61 | /* Gets 2 digit column number from hex location string */ 62 | function hexCol(hexnum){ 63 | return hexnum.substr(0,2); 64 | } 65 | 66 | /* Gets 2 digit row number from hex location string */ 67 | function hexRow(hexnum){ 68 | return hexnum.substr(2,2); 69 | } 70 | 71 | 72 | function ljust(str, size, fill) { 73 | while (str.length < size) { 74 | str = str + fill; 75 | } 76 | return str; 77 | } 78 | 79 | 80 | function rjust(str, size, fill) { 81 | while (str.length < size) { 82 | str = fill + str; 83 | } 84 | return str; 85 | } 86 | 87 | /* Returns the index of an object in a given array 88 | 89 | var index = arrayIndexOf(array, function(obj) { 90 | return obj.property == value; 91 | }); 92 | */ 93 | function arrayIndexOf(array, func) { 94 | if (!func || typeof (func) != 'function'){ return -1; } 95 | if (!array || !array.length || array.length < 1) { return -1; } 96 | for (var i = 0; i < array.length; i++){ 97 | if (func(array[i])) { return i; } 98 | } 99 | return -1; 100 | } 101 | 102 | // Miscellaneous functions 103 | function even(x) { return ( x % 2 ) == 0; } 104 | function odd (x) { return ( x % 2 ) != 0; } 105 | function div(a, b) { return Math.floor(a / b); } 106 | function mod(a, b) { return Math.floor(a % b); } 107 | function max(a, b, c) { return (a >= b && a >= c) ? a : (b >= a && b >= c) ? b : c; } 108 | 109 | // Gets the length of an object 110 | Object.size = function(obj) { 111 | var size = 0, key; 112 | for (key in obj) { 113 | if (obj.hasOwnProperty(key)) size++; 114 | } 115 | return size; 116 | }; 117 | 118 | 119 | function rand(){ 120 | rand.seed = (rand.seed * rand.a + rand.c) % rand.m; 121 | return rand.seed / rand.m; 122 | } 123 | 124 | rand.m = 714025; 125 | rand.a = 4096; 126 | rand.c = 150889; 127 | rand.seed = (new Date()).getTime() % rand.m; 128 | 129 | function srand(seed) { rand.seed = seed; } 130 | 131 | /* 132 | /* Distance functions for hexes 133 | */ 134 | 135 | /* Returns the distance between two hexes */ 136 | function dist(a, b){ 137 | var a_x = div(a,100); 138 | var a_y = mod(a,100); 139 | var b_x = div(b,100); 140 | var b_y = mod(b,100); 141 | var dx = b_x - a_x; 142 | var dy = b_y - a_y; 143 | var adx = Math.abs(dx); 144 | var ody = dy + div( adx, 2 ); 145 | if( odd(a_x) && even(b_x) ) { ody += 1; } 146 | return max(adx - ody, ody, adx); 147 | } 148 | 149 | /* Returns the distance between two hexes */ 150 | function distance(world1, world2){ 151 | var a1 = world1.row + Math.floor(world1.col / 2, 10); 152 | var a2 = world2.row + Math.floor(world2.col / 2, 10); 153 | 154 | var d1 = Math.abs(a1 - a2); 155 | var d2 = Math.abs(world1.col - world2.col); 156 | var d3 = Math.abs((a1 - world1.col) - (a2 - world2.col)); 157 | 158 | if ((d1 > d2) && (d1 > d3)){ return d1; } 159 | if ((d2 > d1) && (d2 > d3)){ return d2; } 160 | return d3; 161 | } 162 | 163 | /* Returns list of hexes within specified jump range */ 164 | function reachableHexes(hex, jump){ 165 | 166 | var results = []; 167 | var x = div(hex, 100); 168 | var y = mod(hex, 100); 169 | 170 | for(var rx = x - jump; rx <= x + jump; rx++){ 171 | for(var ry = y - jump; ry <= y + jump; ry++){ 172 | if(rx >= 1 && rx <= SEC_COLS && ry >= 1 && ry <= SEC_ROWS){ 173 | var candidate = hexString(rx, ry); 174 | var distance = dist( hex, candidate); 175 | if(distance > 0 && distance <= jump){ 176 | results.push(candidate); 177 | } 178 | } 179 | } 180 | } 181 | return results; 182 | } 183 | 184 | // 185 | // These functions are used for helping to determine trade routes 186 | // 187 | 188 | // A* Algorithm 189 | // Based on notes in _AI for Game Developers_, Bourg & Seemann, O'Reilly Media, Inc., July 2004. 190 | // Code by Joshua Bell 191 | function Node(id, cost, steps, parent){ 192 | this.id = id; 193 | this.cost = cost; 194 | this.steps = steps; 195 | this.parent = parent; 196 | } 197 | 198 | 199 | function List(){ 200 | this.list = new Object(); 201 | this.count = 0; 202 | } 203 | 204 | List.prototype.isEmpty = function(){ 205 | return (this.count == 0); 206 | } 207 | 208 | List.prototype.contains = function(node){ 209 | return (this.list[node.id] !== undefined); 210 | } 211 | 212 | List.prototype.add = function(node){ 213 | if(!this.contains(node)){ 214 | this.list[node.id] = node; 215 | this.count++; 216 | } 217 | var str = ""; 218 | for(var key in this.list) { str += " " + key + ": " + this.list[key] + " "; } 219 | } 220 | 221 | List.prototype.remove = function(node){ 222 | if(this.contains(node)){ 223 | delete this.list[node.id]; 224 | this.count--; 225 | } 226 | var str = ""; 227 | for(var key in this.list) { str += " " + key + ": " + this.list[key] + " "; } 228 | } 229 | 230 | List.prototype.getLowestCostNode = function(){ 231 | var cost = undefined; 232 | var node = undefined; 233 | 234 | for(var key in this.list){ 235 | var currentNode = this.list[key]; 236 | if(cost === undefined || currentNode.cost < cost){ 237 | node = currentNode; 238 | cost = currentNode.cost; 239 | } 240 | } 241 | return node; 242 | } 243 | --------------------------------------------------------------------------------