Compare commits

..

36 Commits
master ... IPV6

Author SHA1 Message Date
Tim Young c4e12040f9 Fix some things that we had issues with. 2020-12-08 16:23:59 -07:00
Tim Young d4989feb16 Changing for NB_IPAddress.isBroadcast 2020-12-08 15:40:31 -07:00
Tim Young 6889f92fc7 Global search and fixing functions to use NB_IPAddress.isZeroIPString 2020-12-08 15:38:19 -07:00
Tim Young 8a906bad5f Network Interface moving to IPAddress functions 2020-12-08 15:26:11 -07:00
Tim Young 49151e7c55 Network Card using NB_IPAddress functions. We can change these functions to work with ipv6 later. Move our comparisons to these funcs. 2020-12-08 15:22:24 -07:00
Tim Young f34b9a405e More switching to functions on the IP address. 2020-12-08 08:32:24 -07:00
Tim Young 635736b035 Zeroipstrings 2020-12-07 14:46:50 -07:00
Tim Young 774797a28f use broadcast func 2020-12-07 13:55:41 -07:00
Tim Young ecf2332eee Use broadcast func 2020-12-07 13:54:39 -07:00
Tim Young 22597d0117 Use more of the constants 2020-12-07 12:09:11 -07:00
Tim Young 2f63aacecd Add functions to the IP address. We need to use them and then test, test, test... 2020-12-07 12:00:10 -07:00
Tim Young fdc3877e4f Fix some spelling mistakes 2019-05-15 14:38:07 -05:00
Tim Young 93f0c6e4a3 Allow ping/arp/traceroute to cancel by 'x'
WellDone ought to default to "false" so that canceling the
form does not return a true.

However, that then means that the validating (particularly for DHCP)
needs to be handled differently.   Otherwise validation would ONLY
occur when you press OK.   (Not a terrible thing, but also not ideal.)

In any case, this is a solution I found on the internet. It seems
to work nicely. Validating still runs unless the form is closing
(via ESC, Cancel, or X), including when moving from textbox to
textbox, or tabbing to OK.

I think this also solves a lingering problem where DHCP couldn't
X out without attempting to validate.   So it feels like an all-around winner.

Step to reproduce:   Level0 ping test
1.) on net_switch0, try to ping pc0.
   -tab through and notice that pc0 resolves to 192.168.1.2 on OK button.
 2.) close with form window using X
   -notice that the ping happens anyway.   Same is true for arp and traceroute.
2019-04-29 17:15:10 -05:00
Tim Young 5d06bfd8f3 Simple typo. 192.168 instead of 102.168 2019-04-29 16:32:32 -05:00
Tim Young a0790918fb Tag PC3 on Level 6 VLAN Firewalls (Level6_VLANRouting3). It was on the default vlan instead of the student vlan. 2019-04-15 08:33:51 -05:00
Tim Young c2f41ae5b9 tracert: respond from requested IP address
If a device does a traceroute to the opposite side of a router,
the traceroute request will continue on to the next gateway
until it dies from not being able to return on the same NIC.

Instead, respond to traceroute requests from the "pinged"
ip address (so that the originator stops requesting more
tracert packets) instead of the closest address to the
originator.

Scenario: Level 3 It is dead, Jim
1.) from PC1, traceroute to the far side of router2 (192.168.3.2).
Notice that the tracert continues on two times to router0 before
dying.
2019-04-13 10:18:02 -05:00
Tim Young f5cb1875d2 Allow forwarding devices to respond to tracert_requests
Things like switches could not be tracert'd.

Scenario: Level 3 It is dead, Jim.
1.) from PC2, do a tracert to net_switch0.
Notice that there is no response.
2019-04-13 10:13:12 -05:00
Tim Young 5e39a2896d No routing/sending destination for ZeroIPString
pinging 0.0.0.0 should not go anywhere, but previously
it could be routed anywhere by default gateways etc.

Scenario: Level 3 It's dead Jim
1.) set the gateway for PC2 to router2
2.) ping net_switch1
The ping travels halfway around the network before it is dropped.

Even worse is L4 Who done it, where
originally the puzzle could be solved by
just pinging 0.0.0.0 enough times.
2019-04-13 10:08:32 -05:00
Tim Young 4a72518ccc Don't lose DHCP range when NIC address changes
When a server or firewall changes the IP address of a network
card, any DHCP ranges associated with that old number were
zeroed out.

Invalidating the range COULD be a nice feature in case the
new IP address falls within the DHCP range - thus preventing
conflicting IP addresses. So just to be nice I did allow the
range to invalidate in that situation. However, in real life
it wouldn't be so nice, and so perhaps it would actually be
better to keep the existing rules intact even if it would
cause a problem.

Scenario: Level 2 Firewall Test
-change firewall eth0 to 192.168.1.10 and eth1 to 192.168.2.20
-click OK
-edit firewall again and look at the DHCP rules
    -notice that 192.168.1 has all zeros.
    -same thing with 192.168.2
    -after the fix, the 192.168.2 rules are retained since
   2.20 doesn't conflict with the range, but 1.10 does
   conflict, so that rule was invalidated.
2019-04-13 10:05:22 -05:00
Tim Young cecd14a901 Do a better job with network interfaces when faced with vlans 2019-03-17 14:26:51 +03:00
Tim Young 073cba135e Basic renumbering working. Will blow up on a machine with multiple network interfaces. 2019-03-07 17:02:49 +03:00
Tim Young e27d960403 Add a comment about the hosts func 2019-03-06 12:38:08 +03:00
Tim Young 4014439162 Many small changes working towards renumbering a subnet. If many items are selected, we can right-click and renumber the lot of them. 2019-03-06 12:32:00 +03:00
Tim Young c0b655386e Adding a bunch of strings 2019-03-06 12:30:51 +03:00
Tim Young 199ecbcf06 Add an initial RenumberData class. Used when processing devices and figuring out which devices are part of a particular broadcast network. 2019-03-06 12:30:28 +03:00
Tim Young 966f4fe8a8 Add the ability to prompt for a network, subnet, and gateway. Used when renumbering a subnet. 2019-03-06 12:29:19 +03:00
Tim Young b1a13b95bc Add a "GetUntaggedVLAN" func to return the VLAN that is untagged on this interface. 2019-03-06 11:36:10 +03:00
Tim Young fded1f454a Add functions to find the devices connected to this device 2019-03-06 09:43:39 +03:00
Tim Young a72aec9f9a At least with this added test, the student must find and fix the hidden laptop. Not enough to solve the problem, but a step in the right direction. This test works because it requires the IP address to be unique. 2019-02-28 09:57:14 -06:00
Tim Young bed1a8a846 When the router needs to be replaced, it should not have the correct routes. You should need to add the right IP addresses and routes both. 2019-02-28 09:01:05 -06:00
Tim Young 9bf9d58c48 IPAE: DNS lookup provides subnet mask as well as IP
If the user types in a name in the IP Address Entry form,
       also replace the subnet mask.

       This is particularly useful for pinging, since ping doesn't
       allow access to the subnet mask field, and if an inappropriate
       mask is autoIP-entered, then the results might be unexpected.

       Exception for DHCP ranges: Actually, it shouldn't be necessary
       (since the IP address field is disabled for DHCP), but just
       for completeness, I ensure that the second field is not altered
       for DHCP range entries.

       Scenario: Level4, Small Subnets
       1.) fix router2, so the subnet mask is /30
       2.) from pc1, ping pc2 (which is address 192.168.1.3)
                       -lastIP sets subnet mask to 255.255.255.252
                       -that makes .3 the broadcast address
       -fix result: lastIP mask is replaced by pc2's real mask.
2019-02-27 10:16:59 -06:00
Tim Young 2a17fba36c broadcast address only applies to correct subnet
Ultimately, the problem stemmed from a ping to an address
       with the wrong subnet mask (auto-filled subnet) which turned
       the address (which should have been routed) into a local broadcast.
       Only the global broadcast, or a local broadcast should be accepted,
       not a broadcast that should be routed.

       This can be seen in Level 4, Small Subnets puzzle.
       1.) fix router2 to be /31
       2.) from pc1, ping pc2 (which turns into 192.168.1.3)
                       -autoIP filled in a subnet mask of 255.255.255.252
                       -therefore 1.3 is considered the broadcast IP.
       -result: a local broadcast on the 192.168.2 network.
       3.) from pc1, ping 192.168.1.1 or 192.168.1.4 works fine.
       4.) edit firewall1, edit route to 192.168.1.1
                       -make no changes, just hit OK
       5.) again from pc1 ping pc2
                       -now autoIP fills in subnet mask 255.255.255.0
       -result: it works
2019-02-27 08:41:58 -06:00
Tim Young 886e1d7911 allow DHCP range to cancel
The problem is easily seen most times when a DHCP range is canceled.
       The cancel completely fails to work, and refuses to cancel until
       correct values are put in start and end. (However, pressing the ESC
       key sometimes helped.)
2019-02-23 12:20:24 -06:00
Tim Young 06eb896558 cancel should also cancel auto-filled lastIP values
The problem is seen in the first puzzle if you ping
       pc0, and then edit the 0.0.0.0 gateway.   It auto-fills in
       the last-used pc0 IP address, and canceling saves that change
       instead of leaving the gateway at 0.0.0.0.

       lastIP nicely saves some typing (although it has also confused
       my student quite a bit I think), but since it updates WhatToEdit,
       that becomes the "saved" value even during a cancel.

       Instead, save the original value as a copy, and set back to
       the original value when cancellng.

       Perhaps it would be worth creating a reparse( NB_IPAddress)
       function, but this was easy to just hack together.

       Tested by pinging pc0, then editing the gateway and cancellng,
       editing the IP address and canceling.

       Next: don't add a canceled route
2019-02-23 12:16:04 -06:00
Tim Young ddebafeec9 don't add a canceled, empty route
This was especially bad when lastIP filled in default values,
       so this patch pretty much depends on the patch that cancels
       the auto-filled lastIP.

       This didn't cause a problem - it just cluttered up the routing
       table with duplicate, undeletable routes.
2019-02-23 12:08:01 -06:00
Tim Young 2ae5781bea Don't crash when adding a NIC to a PC/server (Justin) 2019-02-23 12:06:24 -06:00
34 changed files with 1924 additions and 824 deletions

View File

@ -62,12 +62,12 @@ namespace EduNetworkBuilder
}
}
public ActionClass RunAction(int WhichIndex, bool NoteAllChanges = false)
public ActionClass RunAction(int WhichIndex)
{
if (CurrentNetAction == null) return null;
if (WhichIndex < CurrentNetAction.Actions.Count)
{
CurrentNetAction.Actions[WhichIndex].DoAction(NoteAllChanges);
CurrentNetAction.Actions[WhichIndex].DoAction();
return CurrentNetAction.Actions[WhichIndex];
}
return null;
@ -180,21 +180,19 @@ namespace EduNetworkBuilder
public NetworkComponentType newItemType = NetworkComponentType.none; //Making new device
public NetworkComponent ChangedComponent = null;
public void DoAction(bool NoteAllChanges=false)
public void DoAction()
{
Network myNet = NB.GetNetwork();
NetworkDevice source = myNet.GetDeviceFromID(SourceID);
NetworkComponent sourceC = myNet.GetComponentFromID(SourceID);
NetworkLink sourceNL;
string indent = " ";
switch (Action)
{
case NBAction.changecomponent:
//This could be a link or a device we are changing.
if(ChangedComponent is NetworkDevice)
{
if (NoteAllChanges) { NB.AddNetMessage("", indent + NB.Translate("AC_ChangeDevice") + " " + source.hostname); }
source.UpdateFromComponent(ChangedComponent, NoteAllChanges); //Copy any changes across
source.UpdateFromComponent(ChangedComponent); //Copy any changes across
source.SetImageFromType(); //The image was not saved. Re-make it
}
else
@ -202,7 +200,6 @@ namespace EduNetworkBuilder
if(source != null)
myNet.RemoveComponent(source);
sourceNL = (NetworkLink)ChangedComponent;
if (NoteAllChanges) { NB.AddNetMessage("", indent + NB.Translate("AC_Replace_Link") + " " + sourceNL.Src.HostName + " - " + sourceNL.Dst.HostName); }
myNet.MarkAsLinked(sourceNL.Src, sourceNL.GetUniqueIdentifier);
myNet.MarkAsLinked(sourceNL.Dst, sourceNL.GetUniqueIdentifier);
myNet.AddItem(ChangedComponent);
@ -215,7 +212,6 @@ namespace EduNetworkBuilder
source.ChangeLocation(Location);
source.UnHide(); //In case it was hidden
if (NB.DebugActions) { Console.WriteLine("Changing location for: " + source + " " + Location.X + ":" +Location.Y); }
if (NoteAllChanges) { NB.AddNetMessage("", indent + NB.Translate("AC_MoveDevice") + " " + source.hostname + " - " +Location.X + ":" + Location.Y); }
}
break;
case NBAction.deletecomponent:
@ -232,7 +228,6 @@ namespace EduNetworkBuilder
}
myNet.RemoveComponent(source);
if (NB.DebugActions) { Console.WriteLine("Deleting a device: " + source.hostname); }
if (NoteAllChanges) { NB.AddNetMessage("", indent + NB.Translate("AC_DeleteDevice") + " " + source.hostname + " - " + source.myType.ToString()); }
} else if(sourceC != null && sourceC is NetworkLink)
{
if (myNet.ItemIsCritical(sourceC.hostname))
@ -241,7 +236,6 @@ namespace EduNetworkBuilder
SourceL.Destroy(); //Mark both ends as being deleted
myNet.RemoveComponent(SourceL); //Get rid of this link
if (NB.DebugActions) { Console.WriteLine("Deleting a link: " + source.hostname); }
if (NoteAllChanges) { NB.AddNetMessage("", indent + NB.Translate("AC_DeleteLink") + " " + SourceL.Src.HostName + " - " + SourceL.Dst.HostName); }
}
break;
case NBAction.newdevice:
@ -260,15 +254,13 @@ namespace EduNetworkBuilder
if (myNet.BlockedByTree(BottomLeft)) CanDo = false;
if (CanDo)
{
NetworkDevice newdevice = (NetworkDevice)myNet.AddItem(newItemType, Location);
if (NB.DebugActions && source != null) { Console.WriteLine("Adding a Device: " + newdevice.hostname); }
if (NoteAllChanges) { NB.AddNetMessage("", indent + NB.Translate("AC_AddDevice") + " " + newdevice.hostname + " - " + newdevice.myType.ToString()); }
ChangedComponent = (NetworkDevice)myNet.AddItem(newItemType, Location);
if (NB.DebugActions && source != null) { Console.WriteLine("Adding a Device: " + source.hostname); }
}
else
{
NB.SetBuilderWindowStatis(NB.Translate("NB_TreePlacementError"));
if (NB.DebugActions) { Console.WriteLine("Unable to add device: " + ChangedComponent.hostname); }
if (NB.DebugActions) { Console.WriteLine("Unable to add device: " + source.hostname); }
}
break;
case NBAction.dhcp:
@ -276,33 +268,27 @@ namespace EduNetworkBuilder
{
source.DHCPRequestFromHere();
if (NB.DebugActions) { Console.WriteLine("Requesting DHCP: " + source.hostname); }
if (NoteAllChanges) { NB.AddNetMessage("", indent + NB.Translate("AC_RequestDHCP") + " " + source.hostname); }
}
break;
case NBAction.arp:
if (source != null)
{
//We have not implimented this well. But, here it is anyway. We would do this if showing ethernet stuff
source.AskArpFromHere(Destination);
if (NB.DebugActions) { Console.WriteLine("Requesting ARP: " + source.hostname); }
if (NoteAllChanges) { NB.AddNetMessage("", indent + NB.Translate("AC_RequestARP") + " " + source.hostname + " - " + Destination.GetIPString); }
if (NB.DebugActions) { Console.WriteLine("Requesting DHCP: " + source.hostname); }
}
break;
case NBAction.cleararp:
if (source != null)
{
//We have not implimented this well. But, here it is anyway. We would do this if showing ethernet stuff
source.ClearArps();
if (NB.DebugActions) { Console.WriteLine("Clearing ARP: " + source.hostname); }
if (NoteAllChanges) { NB.AddNetMessage("", indent + NB.Translate("AC_ClearArp") + " " + source.hostname + " - " + Destination.GetIPString); }
}
break;
case NBAction.ping:
if (source != null)
{
source.PingFromHere(Destination);
if (NB.DebugActions) { Console.WriteLine("Pinging " + Destination.GetIPString + " from " + source.hostname); }
if (NoteAllChanges) { NB.AddNetMessage("", indent + NB.Translate("AC_DoPing") + " " + source.hostname + " - " + Destination.GetIPString); }
if (NB.DebugActions) { Console.WriteLine("Pinging " + Destination.GetIPString + " from " + source.hostname); }
}
break;
case NBAction.traceroute:
@ -310,7 +296,6 @@ namespace EduNetworkBuilder
{
source.TracerouteFromHere(Destination);
if (NB.DebugActions) { Console.WriteLine("Traceroute: " + Destination.GetIPString + " from " + source.hostname); }
if (NoteAllChanges) { NB.AddNetMessage("", indent + NB.Translate("AC_DoTraceroute") + " " + source.hostname + " - " + Destination.GetIPString ); }
}
break;
case NBAction.replace:
@ -325,7 +310,6 @@ namespace EduNetworkBuilder
myNet.RegisterDeviceReplaced(source.hostname); //replace it.
if (NB.DebugActions) { Console.WriteLine("Replacing device: " + source.hostname); }
if (NoteAllChanges) { NB.AddNetMessage("", indent + NB.Translate("AC_Replace_Device") + " " + source.hostname); }
}
else if (sourceC is NetworkLink)
{
@ -338,32 +322,27 @@ namespace EduNetworkBuilder
myNet.RemoveComponent(sourceNL);
NetworkLink nNL = new NetworkLink(sourceID, destID, LinkType.normal);
myNet.AddItem(nNL);
if (NB.DebugActions) { Console.WriteLine("Replacing link: " + sourceID.HostName + " - " + destID.HostName); }
if (NoteAllChanges) { NB.AddNetMessage("", indent + NB.Translate("AC_Replace_Link") + " " + sourceID.HostName + " - " + destID.HostName); }
if (NB.DebugActions) { Console.WriteLine("Replacing link: " + source.hostname); }
}
}
break;
case NBAction.replaceUPS:
myNet.RegisterUPSAdded(source.hostname);
if (NB.DebugActions) { Console.WriteLine("Replacing UPS on: " + source.hostname); }
if (NoteAllChanges) { NB.AddNetMessage("", indent + NB.Translate("AC_Replace_UPS") + " " + source.hostname); }
break;
case NBAction.poweroff:
source.PowerOff = true;
myNet.RegisterDeviceReset(source.hostname);
if (NB.DebugActions) { Console.WriteLine("Powering off: " + source.hostname); }
if (NoteAllChanges) { NB.AddNetMessage("", indent + NB.Translate("AC_Powering_OFF") + " " + source.hostname); }
break;
case NBAction.poweron:
source.PowerOff = false;
if (NB.DebugActions) { Console.WriteLine("Powering on: " + source.hostname); }
if (NoteAllChanges) { NB.AddNetMessage("", indent + NB.Translate("AC_Powering_ON") + " " + source.hostname); }
//We might see about exploding the device here.
break;
case NBAction.reset:
source.ClearIPs(); //reset the device - IPs and VLANs
if (NB.DebugActions) { Console.WriteLine("Resetting: " + source.hostname); }
if (NoteAllChanges) { NB.AddNetMessage("", indent + NB.Translate("AC_Resetting") + " " + source.hostname); }
//We might see about exploding the device here.
break;

View File

@ -357,7 +357,7 @@ namespace EduNetworkBuilder
tnic = ndCLonedItem.AddNic(WhatToAdd[cbQuestions.SelectedIndex]);
}
}
if(tnet != null)
if(tnet != null && tnic != null)
tnet.RegisterNICAdded(ndCLonedItem.hostname, tnic.NicName());
}
UpdateForm();

View File

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\WiX.3.11.2\build\wix.props" Condition="Exists('..\packages\WiX.3.11.2\build\wix.props')" />
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@ -23,19 +22,17 @@
<UpdatePeriodically>true</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<InstallUrl>http://tyounglightsys.com/EduNetworkBuilder/v1/</InstallUrl>
<InstallUrl>http://tyounglightsys.ddns.info/EduNetworkBuilder/v1/</InstallUrl>
<UpdateUrl>http://tyounglightsys.ddns.info/EduNetworkBuilder/v1/</UpdateUrl>
<ProductName>EduNetworkBuilder</ProductName>
<PublisherName>Tim Young</PublisherName>
<CreateWebPageOnPublish>true</CreateWebPageOnPublish>
<WebPage>publish.htm</WebPage>
<ApplicationRevision>54</ApplicationRevision>
<ApplicationRevision>51</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust>
<PublishWizardCompleted>true</PublishWizardCompleted>
<BootstrapperEnabled>true</BootstrapperEnabled>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
@ -122,6 +119,7 @@
<DependentUpon>ListBoxWindow.cs</DependentUpon>
</Compile>
<Compile Include="NB.cs" />
<Compile Include="NBRenumberData.cs" />
<Compile Include="NBSettings.cs" />
<Compile Include="NetShape.cs" />
<Compile Include="NetTest.cs" />
@ -266,7 +264,6 @@
<DependentUpon>VLANConfig.cs</DependentUpon>
</EmbeddedResource>
<None Include="EduNetworkBuilder_TemporaryKey.pfx" />
<None Include="packages.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
@ -479,12 +476,6 @@
<Content Include="Resources\NBIco.ico" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\WiX.3.11.2\build\wix.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\WiX.3.11.2\build\wix.props'))" />
</Target>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">

View File

@ -24,11 +24,13 @@ namespace EduNetworkBuilder
private IPAddress theNetmask;
private IPAddress theGateway;
private bool Unset = true;
public NB_IPAddress() { } //used for reflection
/// <summary>
/// Duplicate an IP address structure
/// </summary>
/// <param name="Orig"></param>
/// <param name="Orig">The IP to clone from</param>
public NB_IPAddress(NB_IPAddress Orig)
{
_ip = Orig._ip;
@ -38,22 +40,42 @@ namespace EduNetworkBuilder
theIP = Orig.theIP;
theNetmask = Orig.theNetmask;
theGateway = Orig.theGateway;
Unset = false;
}
/// <summary>
/// Make a simple IP address with netmask
/// </summary>
/// <param name="ip">The new IP</param>
/// <param name="mask">The new netmask</param>
/// <param name="WhatType"></param>
public NB_IPAddress(string ip, string mask, IPAddressType WhatType)
{
myType = WhatType;
_ip = ip.ParseIp();
_mask = mask.ParseIp();
Unset = false;
}
/// <summary>
/// Make a new IP address, netmask, with gateway.
/// </summary>
/// <param name="ip">The IP address</param>
/// <param name="mask">The netmask</param>
/// <param name="gw">The gateway to use</param>
public NB_IPAddress(string ip, string mask, string gw)
{
myType = IPAddressType.route;
_ip = ip.ParseIp();
_mask = mask.ParseIp();
_gw = gw.ParseIp();
Unset = false;
}
/// <summary>
/// Load an IP address from the XML file
/// </summary>
/// <param name="theNode">The XmlNode to load from</param>
public NB_IPAddress(XmlNode theNode)
{
foreach (XmlNode Individual in theNode.ChildNodes)
@ -65,12 +87,15 @@ namespace EduNetworkBuilder
{
case "ip":
_ip = Individual.InnerText.ParseIp();
Unset = false;
break;
case "mask":
_mask = Individual.InnerText.ParseIp();
Unset = false;
break;
case "gateway":
_gw = Individual.InnerText.ParseIp();
Unset = false;
break;
case "type":
myType = NB.ParseEnum<IPAddressType>(Individual.InnerText);
@ -80,6 +105,12 @@ namespace EduNetworkBuilder
}
}
public void SetIP(UInt32 newIP)
{
_ip = newIP;
Unset = false;
}
public bool Equals(NB_IPAddress CompareWith)
{
if (_ip != CompareWith._ip) return false;
@ -104,11 +135,13 @@ namespace EduNetworkBuilder
_ip = ip.ParseIp();
_mask = mask.ParseIp();
_gw = gw.ParseIp();
Unset = false;
}
public void Reparse(string ip, string mask)
{
_ip = ip.ParseIp();
_mask = mask.ParseIp();
Unset = false;
}
public IPAddressType GetAddressType
@ -241,6 +274,10 @@ namespace EduNetworkBuilder
get { return NetworkAddress + ~_mask; }
}
/// <summary>
/// Return the list of hosts in the subnet.
/// </summary>
/// <returns></returns>
public IEnumerable<UInt32> Hosts()
{
for (var host = NetworkAddress + 1; host < BroadcastAddress; host++)
@ -289,6 +326,57 @@ namespace EduNetworkBuilder
return false;
}
#region IP Status Funcs
/// <summary>
/// If the IP address has not yet been assigned
/// </summary>
public bool IsUnassigned() {
if (GetIPString == NB.ZeroIPString) return true; //Sometimes we use 0.0.0.0 as unset.
return Unset;
}
/// <summary>
/// If the IP address is the same as the broadcast address
/// </summary>
public bool IsBroadcast()
{
uint BA = BroadcastAddress;
if (_ip == BA) return true; //the actual broadcast for the network
if (GetIPString == NB.BroadcastIPString) return true; //The special broadcast 255.255.255.255
return false;
}
/// <summary>
/// If the IP address is the same as the network address
/// </summary>
public bool IsNetwork()
{
uint NA = NetworkAddress;
if (_ip == NA) return true;
return false;
}
/// <summary>
/// If the IP address is the loopback address. Different for IPv4 than IPv6
/// </summary>
public bool IsLoopback()
{
if (GetIPString == NB.LoopbackIPString) return true;
return false;
}
/// <summary>
/// If the IP address is 0.0.0.0 or the equavelent
/// </summary>
/// <returns>true if it is zeroes could be unset or anywhere</returns>
public bool IsZeroString() {
if (_ip == 0) return true;
return false;
}
#endregion
#region Break an IP
public string GenRandomIPOrMask()
@ -323,12 +411,12 @@ namespace EduNetworkBuilder
public NB_IPAddress BreakIPNetmaskZero()
{
NB_IPAddress one = new NB_IPAddress(GetIPString, "0.0.0.0", myType);
NB_IPAddress one = new NB_IPAddress(GetIPString, NB.ZeroIPString, myType); //0.0.0.0
return one;
}
public NB_IPAddress BreakIPNetmask32()
{
NB_IPAddress one = new NB_IPAddress(GetIPString, "255.255.255.255", myType);
NB_IPAddress one = new NB_IPAddress(GetIPString, NB.BroadcastIPString, myType); //255.255.255.0
return one;
}
public NB_IPAddress BreakIPNetmaskRandom()
@ -350,12 +438,12 @@ namespace EduNetworkBuilder
public NB_IPAddress BreakIPAddressZero()
{
NB_IPAddress one = new NB_IPAddress("0.0.0.0", GetIPString, myType);
NB_IPAddress one = new NB_IPAddress(NB.ZeroIPString, GetIPString, myType);
return one;
}
public NB_IPAddress BreakIPAddress32()
{
NB_IPAddress one = new NB_IPAddress("255.255.255.255", GetIPString, myType);
NB_IPAddress one = new NB_IPAddress(NB.BroadcastIPString, GetIPString, myType);
return one;
}
public NB_IPAddress BreakIPAddressRandom()

View File

@ -103,6 +103,7 @@
this.btnCancel.Text = "Cancel";
this.btnCancel.UseVisualStyleBackColor = true;
this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
this.btnCancel.CausesValidation = false;
//
// btnOK
//

View File

@ -17,10 +17,24 @@ namespace EduNetworkBuilder
{
NB_IPAddress WhatToEdit;
NB_IPAddress DHCPInterface=null;
bool WellDone = true;
bool WellDone = false;
NetworkDevice ParentDevice = null;
Point StartLocation = new Point (50,50);
NB_IPAddress SavedIPAddress = null;
ToolTip myTooltip = new ToolTip();
//variable to hold true if the for is closing
private bool isFormClosing = false;
// Contant for the close message
private const int WM_CLOSE = 16;
//override the WndProc msg to trap the WM_CLOSE message
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_CLOSE)
isFormClosing = true;
base.WndProc(ref m);
}
public IPAddressEntry(NB_IPAddress toEdit, NetworkDevice ToEdit, Form ParentForm, bool JustPinging=false)
{
@ -34,11 +48,12 @@ namespace EduNetworkBuilder
ParentDevice = ToEdit;
Network myNet = NB.GetNetwork();
NB_IPAddress lastIP = myNet.RetrieveLastIP();
SavedIPAddress = new NB_IPAddress(toEdit);
WhatToEdit = toEdit;
string hostname = "";
if (ToEdit != null)
hostname = ToEdit.hostname;
if (toEdit.GetIP.ToIpString() == NB.ZeroIPString)
if (toEdit.IsZeroString())
{
string lIP = lastIP.GetIP.ToIpString();
string lNM = lastIP.GetMask.ToIpString();
@ -148,6 +163,7 @@ namespace EduNetworkBuilder
WhatToEdit.Reparse(tbIPAddress.Text, tbNetmask.Text, tbGateway.Text);
Network myNet = NB.GetNetwork();
myNet.StoreLastIP(WhatToEdit);
WellDone = true;
Close();
}
@ -182,13 +198,16 @@ namespace EduNetworkBuilder
private void btnCancel_Click(object sender, EventArgs e)
{
if(SavedIPAddress != null)
WhatToEdit.Reparse(SavedIPAddress.GetIPString, SavedIPAddress.GetMaskString, SavedIPAddress.GetGateway.ToIpString());
UpdateFieldsFromAddress();
WellDone = false;
Close();
}
private void tbGateway_Validating(object sender, CancelEventArgs e)
{
if (isFormClosing) return;
Network mynet = NB.GetNetwork();
if (ParentDevice != null)
{
@ -216,6 +235,8 @@ namespace EduNetworkBuilder
private void tbNetmask_Validating(object sender, CancelEventArgs e)
{
if (isFormClosing) return;
UInt32 taddress = tbNetmask.Text.ParseIp();
tbNetmask.Text = taddress.ToIpString();
if (DHCPInterface != null)
@ -231,6 +252,8 @@ namespace EduNetworkBuilder
private void tbIPAddress_Validating(object sender, CancelEventArgs e)
{
if (isFormClosing) return;
UInt32 taddress;
Network mynet = NB.GetNetwork();
NB_IPAddress tIPAddress = null;
@ -238,9 +261,11 @@ namespace EduNetworkBuilder
{
tIPAddress = mynet.DNSLookup(ParentDevice, tbIPAddress.Text);
}
if(tIPAddress != null)
if (tIPAddress != null) //device name used, convert to IP address and netmask
{
taddress = tIPAddress.GetIP;
if (DHCPInterface == null)
tbNetmask.Text = tIPAddress.GetMaskString;
}
else
taddress = tbIPAddress.Text.ParseIp();
@ -258,5 +283,27 @@ namespace EduNetworkBuilder
if (tLocation.X < 0 || tLocation.Y < 0) tLocation = new Point(50, 50);
Location = tLocation;
}
public void ShowAsSubnetGateway()
{
lblIP.Text = NB.Translate("IPE_Network");
Text = NB.Translate("NB_Subnet");
myTooltip.AutoPopDelay = 5000;
myTooltip.InitialDelay = 1000;
myTooltip.ReshowDelay = 500;
// Force the ToolTip text to be displayed whether or not the form is active.
myTooltip.ShowAlways = true;
myTooltip.SetToolTip(tbIPAddress, NB.Translate("IPE_NetworkTooltip"));
myTooltip.SetToolTip(tbGateway, NB.Translate("IPE_GatewayTooltip"));
myTooltip.SetToolTip(tbNetmask, NB.Translate("IPE_NetmaskTooltip"));
myTooltip.SetToolTip(lblIP, NB.Translate("IPE_NetworkTooltip"));
myTooltip.SetToolTip(lblGateway, NB.Translate("IPE_GatewayTooltip"));
myTooltip.SetToolTip(lblNetmask, NB.Translate("IPE_NetmaskTooltip"));
ShowDialog();
}
}
}

View File

@ -35,63 +35,53 @@
this.btnLink = new System.Windows.Forms.Button();
this.btnCancel = new System.Windows.Forms.Button();
this.cbLinkType = new System.Windows.Forms.ComboBox();
this.pbSource = new System.Windows.Forms.PictureBox();
this.pbDest = new System.Windows.Forms.PictureBox();
this.lblInstructions = new System.Windows.Forms.Label();
((System.ComponentModel.ISupportInitialize)(this.pbSource)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.pbDest)).BeginInit();
this.SuspendLayout();
//
// lbSrcHost
//
this.lbSrcHost.FormattingEnabled = true;
this.lbSrcHost.ItemHeight = 29;
this.lbSrcHost.Location = new System.Drawing.Point(20, 185);
this.lbSrcHost.Margin = new System.Windows.Forms.Padding(5);
this.lbSrcHost.ItemHeight = 16;
this.lbSrcHost.Location = new System.Drawing.Point(9, 18);
this.lbSrcHost.Name = "lbSrcHost";
this.lbSrcHost.Size = new System.Drawing.Size(177, 149);
this.lbSrcHost.Size = new System.Drawing.Size(103, 84);
this.lbSrcHost.TabIndex = 0;
this.lbSrcHost.SelectedIndexChanged += new System.EventHandler(this.lbSrcHost_SelectedIndexChanged);
//
// lbSrcNic
//
this.lbSrcNic.FormattingEnabled = true;
this.lbSrcNic.ItemHeight = 29;
this.lbSrcNic.Location = new System.Drawing.Point(210, 185);
this.lbSrcNic.Margin = new System.Windows.Forms.Padding(5);
this.lbSrcNic.ItemHeight = 16;
this.lbSrcNic.Location = new System.Drawing.Point(118, 18);
this.lbSrcNic.Name = "lbSrcNic";
this.lbSrcNic.Size = new System.Drawing.Size(153, 149);
this.lbSrcNic.Size = new System.Drawing.Size(89, 84);
this.lbSrcNic.TabIndex = 1;
this.lbSrcNic.SelectedIndexChanged += new System.EventHandler(this.lbSrcNic_SelectedIndexChanged);
//
// lbDstNic
//
this.lbDstNic.FormattingEnabled = true;
this.lbDstNic.ItemHeight = 29;
this.lbDstNic.Location = new System.Drawing.Point(702, 185);
this.lbDstNic.Margin = new System.Windows.Forms.Padding(5);
this.lbDstNic.ItemHeight = 16;
this.lbDstNic.Location = new System.Drawing.Point(399, 18);
this.lbDstNic.Name = "lbDstNic";
this.lbDstNic.Size = new System.Drawing.Size(153, 149);
this.lbDstNic.Size = new System.Drawing.Size(89, 84);
this.lbDstNic.TabIndex = 3;
this.lbDstNic.SelectedIndexChanged += new System.EventHandler(this.lbDstNic_SelectedIndexChanged);
//
// lbDstHost
//
this.lbDstHost.FormattingEnabled = true;
this.lbDstHost.ItemHeight = 29;
this.lbDstHost.Location = new System.Drawing.Point(512, 185);
this.lbDstHost.Margin = new System.Windows.Forms.Padding(5);
this.lbDstHost.ItemHeight = 16;
this.lbDstHost.Location = new System.Drawing.Point(290, 18);
this.lbDstHost.Name = "lbDstHost";
this.lbDstHost.Size = new System.Drawing.Size(177, 149);
this.lbDstHost.Size = new System.Drawing.Size(103, 84);
this.lbDstHost.TabIndex = 2;
this.lbDstHost.SelectedIndexChanged += new System.EventHandler(this.lbDstHost_SelectedIndexChanged);
//
// btnLink
//
this.btnLink.Location = new System.Drawing.Point(372, 185);
this.btnLink.Margin = new System.Windows.Forms.Padding(5);
this.btnLink.Location = new System.Drawing.Point(210, 18);
this.btnLink.Name = "btnLink";
this.btnLink.Size = new System.Drawing.Size(131, 42);
this.btnLink.Size = new System.Drawing.Size(75, 23);
this.btnLink.TabIndex = 4;
this.btnLink.Text = "Link";
this.btnLink.UseVisualStyleBackColor = true;
@ -99,10 +89,9 @@
//
// btnCancel
//
this.btnCancel.Location = new System.Drawing.Point(372, 237);
this.btnCancel.Margin = new System.Windows.Forms.Padding(5);
this.btnCancel.Location = new System.Drawing.Point(210, 47);
this.btnCancel.Name = "btnCancel";
this.btnCancel.Size = new System.Drawing.Size(131, 42);
this.btnCancel.Size = new System.Drawing.Size(75, 23);
this.btnCancel.TabIndex = 5;
this.btnCancel.Text = "Cancel";
this.btnCancel.UseVisualStyleBackColor = true;
@ -111,47 +100,16 @@
// cbLinkType
//
this.cbLinkType.FormattingEnabled = true;
this.cbLinkType.Location = new System.Drawing.Point(372, 290);
this.cbLinkType.Margin = new System.Windows.Forms.Padding(5);
this.cbLinkType.Location = new System.Drawing.Point(210, 76);
this.cbLinkType.Name = "cbLinkType";
this.cbLinkType.Size = new System.Drawing.Size(128, 37);
this.cbLinkType.Size = new System.Drawing.Size(75, 24);
this.cbLinkType.TabIndex = 6;
//
// pbSource
//
this.pbSource.Location = new System.Drawing.Point(120, 28);
this.pbSource.Name = "pbSource";
this.pbSource.Size = new System.Drawing.Size(167, 149);
this.pbSource.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
this.pbSource.TabIndex = 7;
this.pbSource.TabStop = false;
//
// pbDest
//
this.pbDest.Location = new System.Drawing.Point(607, 28);
this.pbDest.Name = "pbDest";
this.pbDest.Size = new System.Drawing.Size(167, 149);
this.pbDest.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
this.pbDest.TabIndex = 8;
this.pbDest.TabStop = false;
//
// lblInstructions
//
this.lblInstructions.AutoSize = true;
this.lblInstructions.Location = new System.Drawing.Point(15, 351);
this.lblInstructions.Name = "lblInstructions";
this.lblInstructions.Size = new System.Drawing.Size(79, 29);
this.lblInstructions.TabIndex = 9;
this.lblInstructions.Text = "label1";
//
// LinkEditor
//
this.AutoScaleDimensions = new System.Drawing.SizeF(14F, 29F);
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(866, 389);
this.Controls.Add(this.lblInstructions);
this.Controls.Add(this.pbDest);
this.Controls.Add(this.pbSource);
this.ClientSize = new System.Drawing.Size(495, 117);
this.Controls.Add(this.cbLinkType);
this.Controls.Add(this.btnCancel);
this.Controls.Add(this.btnLink);
@ -161,14 +119,10 @@
this.Controls.Add(this.lbSrcHost);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
this.Icon = global::EduNetworkBuilder.Properties.Resources.NBIco;
this.Margin = new System.Windows.Forms.Padding(5);
this.Name = "LinkEditor";
this.Text = "LinkEditor";
this.Shown += new System.EventHandler(this.LinkEditor_Shown);
((System.ComponentModel.ISupportInitialize)(this.pbSource)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.pbDest)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
@ -181,8 +135,5 @@
private System.Windows.Forms.Button btnLink;
private System.Windows.Forms.Button btnCancel;
private System.Windows.Forms.ComboBox cbLinkType;
private System.Windows.Forms.PictureBox pbSource;
private System.Windows.Forms.PictureBox pbDest;
private System.Windows.Forms.Label lblInstructions;
}
}

View File

@ -45,7 +45,6 @@ namespace EduNetworkBuilder
lbSrcHost.SelectedIndex = tindex;
UpdateDeviceList();
}
pbSource.Image = new Bitmap(Source.GetImage());
}
if (Dest != null)
{
@ -55,7 +54,6 @@ namespace EduNetworkBuilder
lbDstHost.SelectedIndex = tindex;
UpdateDeviceList();
}
pbDest.Image = new Bitmap(Dest.GetImage());
}
}
@ -88,12 +86,11 @@ namespace EduNetworkBuilder
if (lbDstHost.SelectedItem != null)
DstHost = lbDstHost.SelectedItem.ToString();
string SrcNic = "";
NetworkDevice Src = null;
if (lbSrcNic.SelectedItem != null)
{
Src = myNet.DeviceFromName(lbSrcHost.SelectedItem.ToString());
SrcNic = lbSrcNic.SelectedItem.ToString();
int sNicIndex = lbSrcNic.SelectedIndex;
NetworkDevice Src = myNet.DeviceFromName(lbSrcHost.SelectedItem.ToString());
NetworkCard sNic = null;
if(Src != null) sNic = Src.NicFromName(lbSrcNic.SelectedItem.ToString());
if(sNic != null) srcNicType = sNic.GetNicType;
@ -179,34 +176,7 @@ namespace EduNetworkBuilder
lbDstNic.SelectedIndex = tint;
}
if (lbSrcHost.SelectedItem != null)
{
Src = myNet.DeviceFromName(lbSrcHost.SelectedItem.ToString());
pbSource.Image = Src.GetImage();
pbSource.Invalidate();
}
else
{
pbSource.Image = null;
pbSource.Invalidate();
}
if (lbDstHost.SelectedItem != null)
{
NetworkDevice Dest = myNet.DeviceFromName(lbDstHost.SelectedItem.ToString());
if (Dest != null)
{
pbDest.Image = Dest.GetImage();
pbDest.Invalidate();
}
}
else
{
pbDest.Image = null;
pbDest.Invalidate();
}
if (lbDstNic.SelectedIndex > -1 && lbSrcNic.SelectedIndex > -1)
if(lbDstNic.SelectedIndex > -1 && lbSrcNic.SelectedIndex > -1)
{
btnLink.Enabled = true;
}
@ -232,43 +202,6 @@ namespace EduNetworkBuilder
cbLinkType.SelectedItem = theLinkType;
else
cbLinkType.SelectedIndex = 0;
//Update the instructions.
lblInstructions.Text = ""; //empty them out if we do not need instructions
lbSrcHost.ResetForeColor() ;
lbSrcNic.ResetForeColor();
lbDstHost.ResetForeColor();
lbDstNic.ResetForeColor();
btnLink.ForeColor = Color.Black;
if (lbSrcHost.SelectedItem == null)
{
lblInstructions.Text = "Choose the source device.";
lbSrcHost.ForeColor = Color.Red;
}
else if (lbSrcNic.SelectedItem == null)
{
lblInstructions.Text = "Choose the NIC / Port on the source device.";
lbSrcNic.ForeColor = Color.Red;
}
else if (lbDstHost.SelectedItem == null)
{
lblInstructions.Text = "Choose the destination device.";
lbDstHost.ForeColor = Color.Red;
}
else if (lbDstNic.SelectedItem == null)
{
lblInstructions.Text = "Choose the NIC / Port on the destination device.";
lbDstNic.ForeColor = Color.Red;
}
else
{
//We have a valid link. We are ready to press the link.
lblInstructions.Text = "This is a valid link. Press LINK to continue";
btnLink.ForeColor = Color.Red;
}
processing = false;
}

View File

@ -755,7 +755,10 @@ namespace EduNetworkBuilder
{
NB_IPAddress newip = new NB_IPAddress(NB.ZeroIPString, NB.ZeroIPString, NB.ZeroIPString);
newip.Edit(myNetDevice, this, NB.Translate("LBW_AddRouteCreate"));
myNetDevice.AddRoute(newip);
if (!newip.Equals(new NB_IPAddress(NB.ZeroIPString, NB.ZeroIPString, NB.ZeroIPString)))
{
myNetDevice.AddRoute(newip);
}
UpdateForm();
}

View File

@ -379,6 +379,8 @@ namespace EduNetworkBuilder
public static int NormalRotation = 5;
public static int PacketDamageDistance = 25;
public static int InvalidVLAN = -999; //What we return when it is invalid
public static bool DebugActions = false;
public static bool DebugTests = false;
@ -934,6 +936,46 @@ namespace EduNetworkBuilder
return tbEvent.Text;
}
public static string ComboBoxPromptBox(string title, string prompt, List<string> Options, string value)
{
Form QuestionForm = new Form();
QuestionForm.Text = title;
Label lbPrompt = new Label();
lbPrompt.Text = prompt;
lbPrompt.Location = new Point(1, 1);
lbPrompt.Size = new Size(200, lbPrompt.Size.Height);
ComboBox Choice = new ComboBox();
List<string> tlist = new List<string>();
foreach (string tstring in Options)
{
Choice.Items.Add(tstring);
}
if (value != "" && Choice.Items.Contains(value))
{
Choice.SelectedItem = value;
}
Choice.Location = new Point(1, lbPrompt.Location.Y + lbPrompt.Height + 5);
Button Done = new Button();
Done.Click += (s, g) => { Button b = (Button)s; Form f = (Form)b.Parent; f.Close(); };
Choice.DoubleClick += (s, g) => { Button b = (Button)s; Form f = (Form)b.Parent; Choice.SelectedIndex = -1; f.Close(); }; ;
Done.Text = NB.Translate("_Done");
Done.Location = new Point(1, Choice.Location.Y + Choice.Height + 5);
QuestionForm.Controls.Clear();
QuestionForm.Controls.Add(Choice);
QuestionForm.Controls.Add(Done);
QuestionForm.Controls.Add(lbPrompt);
QuestionForm.AcceptButton = Done;
QuestionForm.FormBorderStyle = FormBorderStyle.FixedDialog;
QuestionForm.AutoSize = true;
QuestionForm.Height = Done.Location.Y + Done.Height + 5; //This is too small for the form, it autosizes to "big enough"
QuestionForm.Width = Choice.Location.X + Choice.Width + 5;
QuestionForm.ShowDialog();
if (Choice.SelectedIndex >= 0) return Choice.SelectedItem.ToString();
return "";
}
public static Dictionary<string, bool> CheckPromptBox(Dictionary<string, bool> Checks)
{
@ -1078,14 +1120,6 @@ namespace EduNetworkBuilder
return randomizedList;
}
public static void AddNetMessage(string host, string message)
{
Network thenet = GetNetwork();
//Console.WriteLine("Adding message: " + host + " : " + message);
if (thenet == null) return; //we cannot add it. do not blow up
thenet.AddMessage(new PacketMessage(host, message));
}
public static bool OpenURLInExternalBrowser(string URL)
{
Uri uriResult;

View File

@ -0,0 +1,293 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EduNetworkBuilder
{
public class NBRenumberer
{
private bool renumbered = false;
public List<NBRenumberData> ListOfItems = new List<NBRenumberData>();
public void Count(string what)
{
NBRenumberData entry = DataFromName(what);
if(entry != null)
{
entry.ActiveCount++;
return;
}
//If we get here, we have not found it yet.
NBRenumberData One = new NBRenumberData(what, ListOfItems.Count);
One.ActiveCount++;
ListOfItems.Add(One);
}
public void SetAsGateway(string what)
{
NBRenumberData GW = DataFromName(what);
if (GW == null) {
GW = new NBRenumberData(what, ListOfItems.Count);
ListOfItems.Add(GW);
}
GW.isTheGateway = true;
GW.UpdateSortOrder();
//We can only have one gateway. Make sure all the rest are set not to be the GW
foreach(NBRenumberData one in ListOfItems)
{
if (one != GW) {
one.isTheGateway = false;
one.UpdateSortOrder();
}
}
}
public NBRenumberData DataFromName(string hostname)
{
foreach (NBRenumberData NBRD in ListOfItems)
{
if (NBRD.Hostname == hostname)
{
return NBRD;
}
}
return null;
}
public bool TryRenumbering(NB_IPAddress Network, NB_IPAddress Gateway)
{
renumbered = true;
//Separate out the devices by type
// Find the gateway too
int biggestcount = 0;
int spacing = 10;
bool HasGateway = false;
foreach (NBRenumberData NBRD in ListOfItems)
{
if (NBRD.ActiveCount > biggestcount) biggestcount = NBRD.ActiveCount;
}
//now, we can prune off everything that is not part of biggestcount.
for(int i=ListOfItems.Count-1; i>=0; i--)
{
if (ListOfItems[i].ActiveCount != biggestcount)
ListOfItems.RemoveAt(i);
else
{
if (ListOfItems[i].isTheGateway) HasGateway = true;
ListOfItems[i].SuggestedIP = "";
}
}
if (!HasGateway)
for (int i = ListOfItems.Count - 1; i >= 0; i--)
{
if (ListOfItems[i].Device.HasIPAddress(Gateway))
SetAsGateway(ListOfItems[i].Hostname);
}
int switches = 0;
int servers = 0;
int printers = 0;
int wireless = 0;
int clients = 0;
foreach(NBRenumberData NBRD in ListOfItems)
{
switch(NBRD.TypeString())
{
case "client":
clients++;
break;
case "printer":
printers++;
break;
case "switch":
switches++;
break;
case "server":
servers++;
break;
case "wireless":
wireless++;
break;
}
}
//Decide on which way we want to do this.
biggestcount = 0;
if (servers > biggestcount) biggestcount = servers;
if (switches > biggestcount) biggestcount = switches;
if (printers > biggestcount) biggestcount = printers;
if (wireless > biggestcount) biggestcount = wireless;
if (clients > biggestcount) biggestcount = clients;
ListOfItems.Sort((p, q) => p.sortorder.CompareTo(q.sortorder));
//If it works to do 10 for each bunch, do that. Otherwise, see what the smallest bunch that works is.
if (biggestcount < 10)
{
spacing = 10;
}
if (biggestcount > 10)
spacing = 99; //Don't bother with anything fancy. Punt if it does not fit the first time
//Fallback is to simply count up from the gateway.
if (Network.NumberOfHosts < ListOfItems.Count)
return false;
if(spacing * 5 > Network.NumberOfHosts)
{
renumberlist(Network, 1, "");
}
else
{
//We can do this in parts
renumberlist(Network, 1, "Gateway");
renumberlist(Network, 2, "server");
renumberlist(Network, spacing * 1, "switch");
renumberlist(Network, spacing * 2, "wireless");
renumberlist(Network, spacing * 3, "printer");
renumberlist(Network, spacing * 4, "client");
}
return true;
}
private void renumberlist(NB_IPAddress Network, int Base, string filter)
{
int count = Base;
for (int i = 0; i < ListOfItems.Count; i++)
{
if (ListOfItems[i].SuggestedIP != "") continue;
if (filter == "" || ListOfItems[i].TypeString() == filter || filter == "Gateway" && ListOfItems[i].isTheGateway)
{
NB_IPAddress next = new NB_IPAddress(Network);
next._ip += (UInt32)count;
ListOfItems[i].SuggestedIP = next.GetIPString;
count++;
}
}
}
public void DoRenumbering(NB_IPAddress Network, NB_IPAddress Gateway, int vlanID)
{
if (!renumbered) TryRenumbering(Network, Gateway);
//loop through and set all the IPs and the gateway IP if not DHCPS
for(int i = 0; i < ListOfItems.Count; i++)
{
ListOfItems[i].Device.RenumberIP(ListOfItems[i].SuggestedIP, Gateway, vlanID);
}
}
}
public class NBRenumberData
{
public string Hostname = "";
public NetworkDevice Device {
get {
Network myNet = NB.GetNetwork();
if (myNet == null) return null;
return myNet.DeviceFromName(Hostname);
}
}
public int ActiveCount=0;
public string nicname;
public string SuggestedIP;
public int sortorder = 0;
private int _index = 0;
public NetworkComponentType mytype = NetworkComponentType.none;
public bool isTheGateway = false;
private bool _isRouter = false;
/// <summary>
/// Return true if the Device specified by hostname does routing.
/// </summary>
public bool IsRouter {
get {
if (_isRouter) return true;
NetworkDevice ND = Device;
if(ND.RoutesPackets())
{
_isRouter = true;
return true;
}
return false;
}
}
public NBRenumberData(string hostname, int index)
{
Hostname = hostname;
NetworkDevice nd = Device;
mytype = nd.myType;
_index = index;
UpdateSortOrder();
}
public void UpdateSortOrder()
{
switch (TypeString())
{
case "client":
sortorder=5000;
break;
case "printer":
sortorder = 4000;
break;
case "switch":
sortorder=2000;
break;
case "server":
sortorder=1000;
break;
case "wireless":
sortorder=3000;
break;
}
sortorder = sortorder + _index;
if (isTheGateway) sortorder = 0;
}
public string TypeString()
{
string what = "";
switch (mytype)
{
case NetworkComponentType.cellphone:
case NetworkComponentType.ip_phone:
case NetworkComponentType.laptop:
case NetworkComponentType.pc:
case NetworkComponentType.tablet:
what = "client";
break;
case NetworkComponentType.printer:
case NetworkComponentType.copier:
what = "printer";
break;
case NetworkComponentType.net_hub:
case NetworkComponentType.net_switch:
what = "switch";
break;
case NetworkComponentType.firewall:
case NetworkComponentType.router:
case NetworkComponentType.server:
what = "server";
break;
case NetworkComponentType.wap:
case NetworkComponentType.wbridge:
case NetworkComponentType.wrepeater:
case NetworkComponentType.wrouter:
what = "wireless";
break;
}
return what;
}
}
}

View File

@ -513,7 +513,7 @@ namespace EduNetworkBuilder
case NetTestType.NeedsRouteToNet:
if (Source == null) return false; //Unable to do it. Do not count it against them.
tAddr = theNet.DNSLookup(Source,dHost);
if (tAddr == null || tAddr.GetIPString == NB.ZeroIPString)
if (tAddr == null || tAddr.IsZeroString())
tAddr = new NB_IPAddress(dHost);
if (Source.HasRouteMatching(tAddr))
{
@ -531,9 +531,9 @@ namespace EduNetworkBuilder
if (Dest.HasIPAddress(tAddr)) return false; //They gave the same address to the source that the dest has.
if (!theNet.HasUniqueIP(tAddr, Source)) return false; //Verify we have not given the IP to someone else
if (tAddr != null &&
tAddr.GetIPString != NB.ZeroIPString)
!tAddr.IsZeroString())
{
if(dAddress != null & dAddress.GetMask == tAddr.GetMask)
if(dAddress != null && dAddress.GetMask == tAddr.GetMask)
return true;
}
return false; //Something is not set right.

View File

@ -1696,7 +1696,7 @@ namespace EduNetworkBuilder
//We are doing a replay and enough time has passed from the last replay...
NBSettings Settings = NB.GetSettings();
ActionCollection AC = Settings.GetUserActionCollection();
ActionClass Success = AC.RunAction(NextReplayIndex++, true); //note all changes as we do them
ActionClass Success = AC.RunAction(NextReplayIndex++);
NextReplayAction = DateTime.UtcNow.AddMilliseconds(NB.MillisecondsBetweenReplays);
@ -2427,7 +2427,7 @@ namespace EduNetworkBuilder
src = GetDeviceFromName(NT.sHost);
if (src == null) continue;
destination = DNSLookup(src, NT.dHost);
if (destination == null || destination.GetIPString == NB.ZeroIPString)
if (destination == null || destination.IsZeroString())
destination = new NB_IPAddress(NT.dHost);
src.PingFromHere(destination);
break;
@ -2435,7 +2435,7 @@ namespace EduNetworkBuilder
src = GetDeviceFromName(NT.sHost);
if (src == null) continue;
destination = DNSLookup(src, NT.dHost);
if (destination == null || destination.GetIPString == NB.ZeroIPString)
if (destination == null || destination.IsZeroString())
destination = new NB_IPAddress(NT.dHost);
src.AskArpFromHere(destination);
break;
@ -2443,7 +2443,7 @@ namespace EduNetworkBuilder
src = GetDeviceFromName(NT.sHost);
if (src == null) continue;
destination = DNSLookup(src, NT.dHost);
if (destination == null || destination.GetIPString == NB.ZeroIPString)
if (destination == null || destination.IsZeroString())
destination = new NB_IPAddress(NT.dHost);
src.TracerouteFromHere(destination);
break;

View File

@ -919,6 +919,12 @@ namespace EduNetworkBuilder
pbNetworkView.ContextMenuStrip.Items.Add(NB.Translate("_Delete"));
pbNetworkView.ContextMenuStrip.Items[index++].Click += pbNetworkView_Delete_Click;
if(!myNetwork.LoadedFromResource)
{
pbNetworkView.ContextMenuStrip.Items.Add(NB.Translate("NB_Renumber"));
pbNetworkView.ContextMenuStrip.Items[index++].Click += pbNetworkRenumber;
}
//We can color-code multiple items
if (myNetwork.VLANsEnabled)
{
@ -1129,6 +1135,150 @@ namespace EduNetworkBuilder
}
/// <summary>
/// Try to renumber a chunk of a network
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void pbNetworkRenumber(object sender, EventArgs e)
{
//come up with a plan
// sort items by type
// loop through the items
// come up with the numbers we want to use
// Decide which nics to change
// On a router, find the nic that is connected to other items in the list
// On other devices, find first nic that is connected that is not DHCP
// track hostname, nicname, ip_address
//print out a list of what we are going to do
//Ask if we want to do it. Yes/No
//do it
if (ItemsSelected.Count > 0)
{
//This next entry should never happen.
if (ItemsSelected.Count < 2)
{
MessageBox.Show("You need to have more items selected");
return;
}
int ChosenVlanID = 1;
if(myNetwork != null && myNetwork.VLANsEnabled)
{
List<string> vnames = new List<string>();
foreach(VLANName vn in myNetwork.VlanNames)
{
vnames.Add(vn.Name);
}
string ChosenVlanName = "";
if (vnames.Count > 0) ChosenVlanName = vnames[0]; //Usually "Default"
if (vnames.Count > 1)
{
//we need to prompt
ChosenVlanName = NB.ComboBoxPromptBox(NB.Translate("NB_ChooseVLANRenumberTitle"), NB.Translate("NB_ChooseVLANRenumber"), vnames, vnames[0]);
}
ChosenVlanID = myNetwork.VLANIDFromName(ChosenVlanName);
}
NB_IPAddress prompted = new NB_IPAddress("192.168.1.0","255.255.255.0","192.168.1.1");
IPAddressEntry IPE = new IPAddressEntry(prompted, null, this, false);
//Read in the settings we will use
IPE.ShowAsSubnetGateway();
//pull out the gateway address
NB_IPAddress gw = new NB_IPAddress(prompted.GetGateway.ToIpString(), prompted._mask.ToIpString(),IPAddressType.gw);
//pull out the network address
NB_IPAddress network = new NB_IPAddress(prompted.NetworkAddress.ToIpString(), prompted._mask.ToIpString(), IPAddressType.gw);
//We need to find the gateway device. If no such device exists, find the most likely candidate
string gateway_name = myNetwork.ReverseDNSLookup(ItemsSelected[0],gw);
NetworkDevice gwDevice = myNetwork.DeviceFromName(gateway_name);
if(gwDevice == null)
{
//Make a list of possibilities
//Prompt user to select one of them
List<NetworkDevice> gwdevices = new List<NetworkDevice>();
for (int i = ItemsSelected.Count - 1; i >= 0; i--)
{
if (ItemsSelected[i].RoutesPackets()) gwdevices.Add(ItemsSelected[i]);
}
if (gwdevices.Count == 1) gwDevice = gwdevices[0];
else
{
//We need to prompt which device
List<string> names = new List<string>();
foreach(NetworkDevice one in gwdevices)
{
names.Add(one.hostname);
}
names.Sort();
gateway_name = NB.ComboBoxPromptBox(NB.Translate("_Gateway"), NB.Translate("NB_ChooseGateway"), names, names[0]);
gwDevice = myNetwork.DeviceFromName(gateway_name);
}
}
if (gwDevice == null) return; //No gateway device selected
NBRenumberer Renumberer = new NBRenumberer();
//If we get here, we have a gateway and a list of items to renumber.
//Loop through all the items
//Find find all connected items
//loop through all connected items & count them (excluding them if they are not selected)
//set the gateway.
//count them and exclude items that are not within the threshhold.
foreach(NetworkDevice one in ItemsSelected)
{
List<NetworkDevice> alreadydone = new List<NetworkDevice>();
List<NetworkDevice> connections = one.ConnectedTo();
for(int i=0; i< connections.Count; i++)
{
NetworkDevice connection = connections[i];
//If we have not done it yet
if (!ItemsSelected.Contains(connection))
continue;
if (myNetwork.VLANsEnabled && (ChosenVlanID != connection.PrimaryVLAN() && connection.myType != NetworkComponentType.net_switch))
continue; //Skip the device if it is not on the primary vlan, and is not a switch (asuming switches are taggexd)
if (!alreadydone.Contains(connection))
{
alreadydone.Add(connection);
if(!connection.RoutesPackets() || connection.myType == NetworkComponentType.wrouter)
connections.AddRange(connection.ConnectedTo(true));
Renumberer.Count(connection.hostname);
}
}
}
Renumberer.SetAsGateway(gwDevice.hostname);
Renumberer.TryRenumbering(network, gw);
if (Renumberer.ListOfItems.Count > network.NumberOfHosts)
{
//Not enough room in the subnet for the various items.
MessageBox.Show("There are not enough IP addresses in the subnet you specified for the number of items we need to renumber.");
return;
}
//We should print off the things we are hoping to do.
string message = "What we are trying to do:\n";
foreach(NBRenumberData NBRD in Renumberer.ListOfItems)
{
message += NBRD.Hostname + " " + NBRD.TypeString() + " -> " + NBRD.SuggestedIP + "\n";
}
DialogResult answer = MessageBox.Show(message,"Renumber?",MessageBoxButtons.OKCancel);
if (answer == DialogResult.OK)
Renumberer.DoRenumbering(network, gw, ChosenVlanID);
}
}
private void pbNetworkView_Hide_Click(object sender, EventArgs e)
{
if (ItemClickedOn != null)
@ -1474,7 +1624,7 @@ namespace EduNetworkBuilder
string dest = (string)Pressed.Tag;
NB_IPAddress destination;
destination = myNetwork.DNSLookup(ItemClickedOn, dest);
if (destination == null || destination.GetIPString == NB.ZeroIPString)
if (destination == null || destination.IsZeroString())
destination = new NB_IPAddress(dest);
//ItemClickedOn.PingFromHere(destination);
NB.DoActionPingDevice(ItemClickedOn.GetUniqueIdentifier, destination);
@ -1490,7 +1640,7 @@ namespace EduNetworkBuilder
string dest = (string)Pressed.Tag;
NB_IPAddress destination;
destination = myNetwork.DNSLookup(ItemClickedOn, dest);
if (destination == null || destination.GetIPString == NB.ZeroIPString)
if (destination == null || destination.IsZeroString())
destination = new NB_IPAddress(dest);
//ItemClickedOn.TracerouteFromHere(destination);
NB.DoActionTracertDevice(ItemClickedOn.GetUniqueIdentifier, destination);
@ -1506,7 +1656,7 @@ namespace EduNetworkBuilder
string dest = (string)Pressed.Tag;
NB_IPAddress destination;
destination = myNetwork.DNSLookup(ItemClickedOn, dest);
if (destination == null || destination.GetIPString == NB.ZeroIPString)
if (destination == null || destination.IsZeroString())
destination = new NB_IPAddress(dest);
NB.DoActionArpDevice(ItemClickedOn.GetUniqueIdentifier, destination);
//ItemClickedOn.AskArpFromHere(destination);
@ -1886,7 +2036,6 @@ namespace EduNetworkBuilder
private void pbNetworkView_MouseMove(object sender, MouseEventArgs e)
{
Image tImage;
//Only do this 10 times a second
if (DateTime.UtcNow - LastMoveTime < TimeSpan.FromMilliseconds(100)) return;
@ -1895,25 +2044,7 @@ namespace EduNetworkBuilder
//If we are dragging lines, do that first.
if (selectedButton == "btnLink")
{
if (MouseIsDown)
{
//We are trying to do a link. Drag a line...
if (ItemClickedOn != null)
{
Point OrigCenter = ItemClickedOn.GetCenter();
//Draw a line from the item-clicked on to the mouse
tImage = new Bitmap(pbNetworkView.BackgroundImage.Width, pbNetworkView.BackgroundImage.Height);
Graphics tGraphics = Graphics.FromImage(tImage);
tGraphics.Clear(Color.Transparent); //erase the whole thing
//draw the line
//tGraphics.FillRectangle(semiTransBrush, selectbox);
tGraphics.DrawLine(Pens.Black, OrigCenter, MouseLocation);
pbNetworkView.Image = tImage;
pbNetworkView.Invalidate();
}
}
//We are trying to do a link. Do not drag...
}
else if (MouseIsDown && LastBackgroundImage != null && ItemClickedOn != null && ItemsSelected.Count == 0) //We are trying to drag something
{
@ -1943,7 +2074,7 @@ namespace EduNetworkBuilder
else if (MouseIsDown && ItemClickedOn == null) //Dragging an empty area
{
//make a rectangle
tImage = new Bitmap(pbNetworkView.BackgroundImage.Width, pbNetworkView.BackgroundImage.Height);
Image tImage = new Bitmap(pbNetworkView.BackgroundImage.Width, pbNetworkView.BackgroundImage.Height);
Graphics tGraphics = Graphics.FromImage(tImage);
tGraphics.Clear(Color.Transparent); //erase the whole thing
int sx;

View File

@ -45,7 +45,7 @@ namespace EduNetworkBuilder
myID = new HostNicID(HostID, UniqueIdentifier, hostname, _nic_name);
NetworkInterface nInterface = new NetworkInterface(NicName(), NB.ZeroIPString, NB.ZeroIPString, myID);
if(theType == NicType.lo)
nInterface = new NetworkInterface(NicName(), "127.0.0.1", "255.0.0.0", myID);
nInterface = new NetworkInterface(NicName(), NB.LoopbackIPString, "255.0.0.0", myID);
interfaces.Add(nInterface);
ApplyNicRules();
SetIPForDHCP();
@ -313,7 +313,7 @@ namespace EduNetworkBuilder
if (iface.myIP.BroadcastAddress == 0) continue; //a netmask of 0.0.0.0 causes grief
if (iface.myIP.BroadcastAddress == dest.GetIP)
return true;//If they are pinging the broadcast IP
if (iface.myIP.GetIPString == NB.BroadcastIPString)
if (iface.myIP.IsBroadcast())
return true;
}
return false;
@ -435,7 +435,7 @@ namespace EduNetworkBuilder
if (UsesDHCP && CanUseDHCP)
{
bool doIt = true;
if (interfaces.Count > 0 && interfaces[0].myIP.GetIPString == NB.ZeroIPString)
if (interfaces.Count > 0 && interfaces[0].myIP.IsZeroString())
{
doIt = true;
}
@ -568,15 +568,15 @@ namespace EduNetworkBuilder
nf.ProcessOutboundPacket(nPacket);
if (nPacket.MyStatus == PacketStatus.finished || nPacket.MyStatus == PacketStatus.finished_failed || nPacket.MyStatus == PacketStatus.finished_ok)
continue; //If the packet cannot be sent out (VLAN stuff)
if (tPacket.OutboundIP == null || (nf.isLocal(tPacket.OutboundIP) || (tPacket.OutboundIP.GetIPString == NB.BroadcastIPString && tPacket.isFresh)))
if (tPacket.OutboundIP == null || (nf.isLocal(tPacket.OutboundIP) || (tPacket.OutboundIP.IsBroadcast() && tPacket.isFresh)))
{
if ((nf != null && nf.myIP.GetIPString != NB.ZeroIPString) || nPacket.MyType == PacketType.dhcp_request)
if ((nf != null && !nf.myIP.IsZeroString()) || nPacket.MyType == PacketType.dhcp_request)
{
//this means we have a local interface to send it out of
//if(nPacket.sourceMAC == null || nPacket.sourceMAC == "" || nPacket.isFresh)
nPacket.sourceMAC = MAC;
//If the source IP is empty then it is a new packet. We set the source to be us
if (nPacket.sourceIP == null || nPacket.sourceIP.GetIPString == NB.ZeroIPString)
if (nPacket.sourceIP == null || nPacket.sourceIP.IsZeroString())
nPacket.sourceIP = nf.myIP;
nPacket.TsourceIP = nf.myIP;
if (nPacket.destMAC == null || nPacket.destMAC == "")
@ -627,14 +627,14 @@ namespace EduNetworkBuilder
if (nPacket.MyStatus == PacketStatus.finished || nPacket.MyStatus == PacketStatus.finished_failed || nPacket.MyStatus == PacketStatus.finished_ok)
continue; //If the packet cannot be sent out (VLAN stuff)
if (tPacket.OutboundIP != null && (nf.isLocal(tPacket.OutboundIP) || tPacket.OutboundIP.GetIPString == NB.BroadcastIPString))
if (tPacket.OutboundIP != null && (nf.isLocal(tPacket.OutboundIP) || tPacket.OutboundIP.IsBroadcast()))
{
if ((nf != null && nf.myIP != null && nf.myIP.GetIPString != NB.ZeroIPString) || nPacket.MyType == PacketType.dhcp_request)
if ((nf != null && nf.myIP != null && !nf.myIP.IsZeroString()) || nPacket.MyType == PacketType.dhcp_request)
{
//this means we have a local interface to send it out of
nPacket.sourceMAC = MAC;
//If the source IP is empty then it originated from here. We set the source to be us
if (nPacket.sourceIP == null || nPacket.sourceIP.GetIPString == NB.ZeroIPString)
if (nPacket.sourceIP == null || nPacket.sourceIP.IsZeroString())
{
nPacket.sourceIP = nf.myIP;
WhereFrom.StoreOutgoingPacketInfo(nPacket); //the packet is not masqueraded, just accepted
@ -701,10 +701,10 @@ namespace EduNetworkBuilder
}
}
}
if (nf != null && nf.myIP != null && nf.myIP.GetIPString != NB.ZeroIPString)
if (nf != null && nf.myIP != null && !nf.myIP.IsZeroString())
{
//If the source IP is empty then it originated from here. We set the source to be us
if (tPacket.sourceIP == null || tPacket.sourceIP.GetIPString == NB.ZeroIPString)
if (tPacket.sourceIP == null || tPacket.sourceIP.IsZeroString())
{
tPacket.sourceIP = nf.myIP;
WhereFrom.StoreOutgoingPacketInfo(tPacket); //the packet is not yet tunneled
@ -785,7 +785,7 @@ namespace EduNetworkBuilder
//Need to find the managament interface MAC
nPacket.sourceMAC = WhereFrom.HubManagementMAC();
}
if ((nPacket.sourceIP == null || nPacket.sourceIP.GetIPString == NB.ZeroIPString) && nPacket.MyType != PacketType.dhcp_request)
if ((nPacket.sourceIP == null || nPacket.sourceIP.IsZeroString()) && nPacket.MyType != PacketType.dhcp_request)
{
//set it to be the ip of management interface
nPacket.sourceIP = WhereFrom.HubManagementIP();
@ -800,7 +800,7 @@ namespace EduNetworkBuilder
nl = myNet.GetLinkFromID(ConnectedLink);
if (nl == null)
break;
if ((nPacket.sourceIP == null || nPacket.sourceIP.GetIPString == NB.ZeroIPString) && tPacket.MyType != PacketType.dhcp_request) return false; //We still have no IP. Do not send the packet out.
if ((nPacket.sourceIP == null || nPacket.sourceIP.IsZeroString()) && tPacket.MyType != PacketType.dhcp_request) return false; //We still have no IP. Do not send the packet out.
nPacket.StartOnLink(nl, WhereFrom); //This sends the packet down the link.
myNet.addPacket(nPacket);
if (tPacket.isFresh)
@ -978,17 +978,6 @@ namespace EduNetworkBuilder
return null;
}
public string AllInterfacesString(bool UseCidr= false)
{
string thestring = "";
foreach (NetworkInterface oneIF in interfaces)
{
if (thestring != "") thestring += ",";
thestring += oneIF.InterfaceString(UseCidr);
}
return thestring;
}
public NB_IPAddress FirstIP()
{
List<NB_IPAddress> addresses = IPAddressList();

View File

@ -99,7 +99,7 @@ namespace EduNetworkBuilder
{
}
public virtual void UpdateFromComponent(NetworkComponent CopyFrom, bool NoteAllChanges = false)
public virtual void UpdateFromComponent(NetworkComponent CopyFrom)
{
}

View File

@ -35,7 +35,7 @@ namespace EduNetworkBuilder
public bool IsBurned = false;
public Color BackgroundColor = Color.Empty;
protected Color MorphColor = Color.Empty;
public List<FirewallRule> FirewallRules = new List<FirewallRule>();
public List<FirewallRule> FirewallRules = new List<FirewallRule>();
public bool PowerOff = false;
private List<string> tracertmessages = new List<string>();
public int BadSprayCount = 0;
@ -49,7 +49,7 @@ namespace EduNetworkBuilder
myType = what;
SetImageFromType(what);
NetworkCard tnic = new NetworkCard(0,GetUniqueIdentifier,hostname,NicType.lo);
NetworkCard tnic = new NetworkCard(0, GetUniqueIdentifier, hostname, NicType.lo);
NICs.Add(tnic);
if (what == NetworkComponentType.net_switch || what == NetworkComponentType.net_hub)
{
@ -58,7 +58,7 @@ namespace EduNetworkBuilder
tnic = new NetworkCard(0, GetUniqueIdentifier, hostname, NicType.management_interface);
NICs.Add(tnic);
}
for(int looper=1; looper < 8; looper++)
for (int looper = 1; looper < 8; looper++)
{
tnic = new NetworkCard(looper, GetUniqueIdentifier, hostname, NicType.port);
NICs.Add(tnic);
@ -71,16 +71,16 @@ namespace EduNetworkBuilder
tnic = new NetworkCard(0, GetUniqueIdentifier, hostname);
NICs.Add(tnic);
}
if(what == NetworkComponentType.router)
if (what == NetworkComponentType.router)
{
tnic = new NetworkCard(1, GetUniqueIdentifier, hostname);
NICs.Add(tnic);
}
//**********Wireless***********
//Add a wireless network card to laptops, wireless bridge and wireless repeater
if (what == NetworkComponentType.laptop )
if (what == NetworkComponentType.laptop)
{
tnic = new NetworkCard(NICs.Count(), GetUniqueIdentifier, hostname,NicType.wlan); //Add a wireless nic
tnic = new NetworkCard(NICs.Count(), GetUniqueIdentifier, hostname, NicType.wlan); //Add a wireless nic
tnic.UsesDHCP = true;
NICs.Add(tnic);
}
@ -161,8 +161,8 @@ namespace EduNetworkBuilder
NICs.Add(tnic);
//Add one wan port
tnic = new NetworkCard(0, GetUniqueIdentifier, hostname, NicType.wan);
NICs.Insert(1,tnic); //Make this first in the list
}
NICs.Insert(1, tnic); //Make this first in the list
}
if (what == NetworkComponentType.cellphone || what == NetworkComponentType.tablet)
{
NICs.Clear();
@ -179,9 +179,9 @@ namespace EduNetworkBuilder
public int CountNics(NicType TheType)
{
int count = 0;
foreach(NetworkCard nic in NICs)
foreach (NetworkCard nic in NICs)
{
if(nic.GetNicType == TheType)
if (nic.GetNicType == TheType)
{
count++;
}
@ -197,7 +197,7 @@ namespace EduNetworkBuilder
string tname = TheType.ToString() + count.ToString();
foreach (NetworkCard nic in NICs)
{
if(nic.NicName() == tname)
if (nic.NicName() == tname)
{
found = true;
break;
@ -236,7 +236,7 @@ namespace EduNetworkBuilder
CanAddNics = true;
setNicsCanUseDHCP(false);
}
if (myType == NetworkComponentType.pc || myType == NetworkComponentType.laptop ||
if (myType == NetworkComponentType.pc || myType == NetworkComponentType.laptop ||
myType == NetworkComponentType.copier || myType == NetworkComponentType.printer ||
myType == NetworkComponentType.tablet || myType == NetworkComponentType.cellphone)
{
@ -276,7 +276,7 @@ namespace EduNetworkBuilder
private void setNicsCanUseDHCP(bool CanUse)
{
foreach(NetworkCard nic in NICs)
foreach (NetworkCard nic in NICs)
{
//if the device must use DHCP. we set it here.
if (MustUseDHCP && nic.CanUseDHCP)
@ -355,37 +355,37 @@ namespace EduNetworkBuilder
NetworkLink nl;
if (myNet != null)
{
foreach(NetworkCard nic in NICs)
{
if(nic.ConnectedLink != -1)
{
foreach (NetworkCard nic in NICs)
{
if (nic.ConnectedLink != -1)
{
nl = myNet.GetLinkFromID(nic.ConnectedLink);
if(nl != null)
if (nl != null)
{
myNet.RemoveComponent(nl);
nl.Destroy();
}
nic.ConnectedLink = -1;
}
}
}
}
}
}
public void EditGateway(Form ParentForm)
{
DefaultGW.Edit(this,ParentForm,NB.Translate("ND_EdtGteway"));
DefaultGW.Edit(this, ParentForm, NB.Translate("ND_EdtGteway"));
}
public NB_IPAddress GetGateway()
{
if(!HasNonDHCPConnected() && CanUseDHCP)
{
foreach(NetworkCard nic in NICs)
if (!HasNonDHCPConnected() && CanUseDHCP)
{
foreach (NetworkCard nic in NICs)
{
if(nic.UsesDHCP)
if (nic.UsesDHCP)
{
List<NB_IPAddress> tlist = nic.IPAddressList();
if(tlist.Count > 0)
if (tlist.Count > 0)
{
NB_IPAddress newIP = new NB_IPAddress(tlist[0].GetGateway.ToIpString());
return newIP;
@ -422,7 +422,7 @@ namespace EduNetworkBuilder
XmlNodeType myNodetype = Individual.NodeType;
if (myNodetype == XmlNodeType.Element)
{
switch(Individual.Name.ToLower())
switch (Individual.Name.ToLower())
{
case "location":
string[] pointstr = Individual.InnerText.Split(',');
@ -450,13 +450,13 @@ namespace EduNetworkBuilder
newNic = new NetworkCard(Individual);
//if (myType == NetworkComponentType.wap && newNic.GetNicType == NicType.eth)
//{
// //This happened once upon a time. Waps did not have management interfaces.
// //Make a management interface for the wap and move the IP from the eth to that.
// //Then, change the nic to a port instead of an eth.
// NetworkCard tNic = new NetworkCard(newNic);
// tNic.ChangeType(NicType.management_interface);
// NICs.Add(tNic);
// newNic.ChangeType(NicType.port);
// //This happened once upon a time. Waps did not have management interfaces.
// //Make a management interface for the wap and move the IP from the eth to that.
// //Then, change the nic to a port instead of an eth.
// NetworkCard tNic = new NetworkCard(newNic);
// tNic.ChangeType(NicType.management_interface);
// NICs.Add(tNic);
// newNic.ChangeType(NicType.port);
//}
NICs.Add(newNic);
break;
@ -474,7 +474,7 @@ namespace EduNetworkBuilder
bool.TryParse(Individual.InnerText, out isDHCPServer);
break;
case "dhcprange":
NB_IPAddress dhcpip = new NB_IPAddress(Individual);
NB_IPAddress dhcpip = new NB_IPAddress(Individual);
DHCPRanges.Add(dhcpip);
break;
case "hasadvfirewall":
@ -510,13 +510,13 @@ namespace EduNetworkBuilder
writer.WriteElementString("mytype", myType.ToString());
writer.WriteElementString("isdns", isDNSServer.ToString());
writer.WriteElementString("isdhcp", isDHCPServer.ToString());
if(IsBurned)
if (IsBurned)
writer.WriteElementString("isburned", IsBurned.ToString());
if (HasAdvFirewall)
writer.WriteElementString("hasadvfirewall", HasAdvFirewall.ToString());
if (MorphColor != Color.Empty)
if (MorphColor != Color.Empty)
writer.WriteElementString("morphcolor", MorphColor.Name);
if(PowerOff == true)
if (PowerOff == true)
writer.WriteElementString("poweroff", PowerOff.ToString());
if (isInvisible == true)
writer.WriteElementString("isinvisible", isInvisible.ToString());
@ -584,21 +584,21 @@ namespace EduNetworkBuilder
return NB.Translate("ND_MicrowaveTooltip");
foreach (NetworkCard nic in NICs)
{
if (nic.GetNicType == NicType.wport || nic.GetNicType == NicType.port)
if (nic.GetNicType == NicType.wport || nic.GetNicType == NicType.port)
continue;
foreach(string addr in nic.IPAddresses())
foreach (string addr in nic.IPAddresses())
{
answer += System.Environment.NewLine + addr;
answer += System.Environment.NewLine + addr;
}
}
if(BackgroundColor != Color.Empty)
if (BackgroundColor != Color.Empty)
{
//There is something wrong with it?
Network myNet = NB.GetNetwork();
List<string> DeviceMessages = myNet.GetTestMessages(hostname);
foreach (string tString in DeviceMessages)
{
answer += System.Environment.NewLine + tString;
answer += System.Environment.NewLine + tString;
}
}
return answer;
@ -607,18 +607,18 @@ namespace EduNetworkBuilder
public List<string> ListOfConnectedHosts()
{
List<string> thelist = new List<string>();
foreach(NetworkCard nic in NICs)
foreach (NetworkCard nic in NICs)
{
if(nic.ConnectedLink != -1)
if (nic.ConnectedLink != -1)
{
Network myNet = NB.GetNetwork();
NetworkLink Link = myNet.GetLinkFromID(nic.ConnectedLink);
if(Link != null)
if (Link != null)
{
NetworkDevice tmp = myNet.GetDeviceFromID(Link.Src);
if (tmp == null) continue;
if (tmp.hostname != hostname) thelist.Add(tmp.hostname);
tmp = myNet.GetDeviceFromID(Link.Dst);
tmp = myNet.GetDeviceFromID(Link.Dst);
if (tmp.hostname != hostname) thelist.Add(tmp.hostname);
}
}
@ -655,6 +655,196 @@ namespace EduNetworkBuilder
}
}
/// <summary>
/// Return the list of devices connected to this device
/// </summary>
/// <param name="skipwan">For routers, do not show things connected on the WAN</param>
/// <returns>A list of devices</returns>
public List<NetworkDevice> ConnectedTo(bool skipwan= false)
{
List<NetworkDevice> connected = new List<NetworkDevice>();
foreach (NetworkCard nic in NICs)
{
//We want to skip connections through the wan when searching a broadcast network
if (!(myType == NetworkComponentType.wrouter && skipwan && nic.GetNicType == NicType.wan))
{
NetworkDevice nd = ConnectedTo(nic);
if (nd != null) connected.Add(nd);
}
}
return connected;
}
/// <summary>
/// return the device this nic is attached to
/// </summary>
/// <param name="NIC"></param>
/// <returns></returns>
public NetworkDevice ConnectedTo(NetworkCard NIC)
{
return NIC.ConnectedTo();
}
/// <summary>
/// return the device this nic is attached to
/// </summary>
/// <param name="NIC">the network card ID</param>
/// <returns></returns>
public NetworkDevice ConnectedTo(HostNicID NIC)
{
NetworkCard nic = NicFromID(NIC);
if (nic == null) return null;
return nic.ConnectedTo();
}
/// <summary>
/// return the device this nic is attached to
/// </summary>
/// <param name="nicname">The network card name</param>
/// <returns></returns>
public NetworkDevice ConnectedTo(string nicname)
{
NetworkCard nic = NicFromName(nicname);
if (nic == null) return null;
return nic.ConnectedTo();
}
public int VLANFromNIF(NetworkInterface nif, int level = 0)
{
level++;
if (DoesVLANs())
{
//This device itself does vlans
int vlan = nif.GetUntaggedVLAN();
if (vlan != NB.InvalidVLAN)
{
return vlan;
}
}
if (nif == null) return NB.InvalidVLAN;
NetworkCard nic = NicFromID(nif.AttachedToHostNic);
if (nic == null) return NB.InvalidVLAN; //Nothing
if (level > 5) return NB.InvalidVLAN;
return VLANFromNIC(nic, level);
}
public int VLANFromNIC(NetworkCard nic, int level=0)
{
level++;
int vlan = NB.InvalidVLAN;
if (DoesVLANs())
{
foreach (NetworkInterface nif in nic.interfaces)
{
int tvlan = NB.InvalidVLAN;
if(DoesVLANs())
tvlan = VLANFromNIF(nif, level);
if (tvlan != NB.InvalidVLAN)
{
if (vlan != NB.InvalidVLAN && vlan != tvlan)
return NB.InvalidVLAN; //We have multiple VLANs defined on this nic. Cannot determine it from the nic. Need to look using nif
vlan = tvlan;
}
}
return vlan;
}
//If the device does not do vlans, we need to trace the wire to the device.
NetworkDevice FarEnd = ConnectedTo(nic);
if (FarEnd == null) return NB.InvalidVLAN; //Nothing connected to this link
//if it is a switch or wrouter(does vlans), return vlan for the device
if (FarEnd.myType == NetworkComponentType.net_switch || FarEnd.myType == NetworkComponentType.wrouter)
return FarEnd.VLANFromSwitchPort(hostname);
//if it is a hub, return invalid
if (FarEnd.myType == NetworkComponentType.net_hub)
return NB.InvalidVLAN;
//if it is a wireless device, find the vlan the device is attached to.
if (FarEnd.IsWirelessForwarder())
{
return FarEnd.PrimaryVLAN();
}
return NB.InvalidVLAN;
}
/// <summary>
/// Used by PrimaryVLAN
/// </summary>
/// <param name="tList"></param>
/// <returns></returns>
private int ProcessVLANlist(List<NetworkCard> tList)
{
int VLAN = NB.InvalidVLAN;
int tvlan = NB.InvalidVLAN;
foreach(NetworkCard nic in tList)
{
tvlan = VLANFromNIC(nic);
if(VLAN != NB.InvalidVLAN && tvlan != VLAN)
{
//We have multiple VLANs defined on these nics. We do not know what is primary
return NB.InvalidVLAN;
}
VLAN = tvlan;
}
return VLAN;
}
/// <summary>
/// Return the primary vlan of the device.
/// </summary>
/// <returns></returns>
public int PrimaryVLAN()
{
int tVLAN;
List<NetworkCard> Connections;
Connections = NICsFromTypeNic(NicType.management_interface);
tVLAN = ProcessVLANlist(Connections);
if (tVLAN != NB.InvalidVLAN) return tVLAN;
//Connections = NICsFromTypeNic(NicType.wan); //If the device has a wan vlan defined
//tVLAN = ProcessVLANlist(Connections);
//if (tVLAN != NB.InvalidVLAN) return tVLAN;
Connections = NICsFromTypeNic(NicType.eth);
tVLAN = ProcessVLANlist(Connections);
if (tVLAN != NB.InvalidVLAN) return tVLAN;
Connections = NICsFromTypeNic(NicType.wlan);
tVLAN = ProcessVLANlist(Connections);
if (tVLAN != NB.InvalidVLAN) return tVLAN;
return NB.InvalidVLAN;
}
/// <summary>
/// On a switch, return the vlan that hostname is attached to. Returns invalid if not found on this switch
/// </summary>
/// <param name="hostname">the hostname of the device</param>
/// <returns>nb.invalid if it is not attached to this switch, or if this is not a switch</returns>
public int VLANFromSwitchPort(string hostname)
{
if (myType == NetworkComponentType.net_hub) return NB.InvalidVLAN; //Hubs do not know what vlan they are on
if(myType == NetworkComponentType.net_switch || myType == NetworkComponentType.wrouter)
{
//We want to find the port the hostname is on.
foreach(NetworkCard nic in NICs)
{
NetworkDevice FarEnd = ConnectedTo(nic); //Get the device at the far end
if (FarEnd == null) continue;
if(FarEnd.hostname == hostname)
{
//This is the port the host is on
return VLANFromNIC(nic);
}
}
}
return NB.InvalidVLAN;
}
public int VLANFromIP(string ip)
{
NetworkInterface nif = InterfaceFromIP(ip);
if (nif == null) return NB.InvalidVLAN; //Nothing
return VLANFromNIF(nif);
}
/// <summary>
/// Check to see if the device has a link to the specified host
/// </summary>
@ -755,15 +945,6 @@ namespace EduNetworkBuilder
}
}
/// <summary>
/// Return a copy of the image for this device
/// </summary>
/// <returns></returns>
public Image GetImage()
{
return new Bitmap(MyImage);
}
//This function heavily borrowed from: http://stackoverflow.com/questions/1563038/fast-work-with-bitmaps-in-c-sharp
public Image ColoredImage(Image BaseImage)
{
@ -1173,6 +1354,73 @@ namespace EduNetworkBuilder
}
return null;
}
public NetworkInterface InterfaceFromIP(string IP)
{
foreach (NetworkCard nic in NICs)
{
foreach (NetworkInterface nif in nic.interfaces)
{
if (nif.myIP.GetIPString == IP)
return nif;
}
}
return null;
}
public bool RenumberIP(string newip, NB_IPAddress gateway, int vlanID)
{
DefaultGW = new NB_IPAddress(gateway);
//figure out which interface to change.
if (!RenumberIP(newip, gateway, NicType.management_interface, vlanID))
if (!RenumberIP(newip, gateway, NicType.eth, vlanID))
return RenumberIP(newip, gateway, NicType.wlan, vlanID);
return true;
}
private bool RenumberIP(string newip, NB_IPAddress gateway, NicType what, int vlan)
{
List<NetworkCard> smalllist = NICsFromTypeNic(what);
smalllist.Sort((p, q) => p._nic_name.CompareTo(q._nic_name));
foreach (NetworkCard nic in smalllist)
{
//see if we can renumber this one
//It cannot be dhcp, and must be connected.
if((!nic.UsesDHCP && nic.isConnected(false)) || nic.GetNicType == NicType.management_interface)
{
//If we are doing vlans, the vlan should match the interface if eth
//If we are doing vlans, the vlan should match if we are doing management interface
//
//right now, just do it.
NetworkInterface nif = nic.PrimaryInterface();
if(nif == null)
{ //There are multiple interfaces, or there are no interfaces.
//If multiple interfaces, try one with the specified vlan.
nif = nic.InterfaceFromVlanTag(vlan);
}
if (nif != null)
{
nif.myIP = new NB_IPAddress(newip, gateway._mask.ToIpString(), IPAddressType.ip);
return true;
}
}
}
return false;
}
public NetworkCard NicFromIP(string IP)
{
foreach (NetworkCard nic in NICs)
{
foreach(NetworkInterface nif in nic.interfaces)
{
if (nif.myIP.GetIPString == IP)
return nic;
}
}
return null;
}
public NetworkCard NicFromID(HostNicID ID)
{
return NicFromID(ID.NicID);
@ -1424,7 +1672,7 @@ namespace EduNetworkBuilder
public bool HasRouteMatching(string destString)
{
NB_IPAddress dest = new NB_IPAddress(destString);
if (dest.GetIPString == NB.ZeroIPString) return false;
if (dest.IsZeroString()) return false;
return HasRouteMatching(dest);
}
@ -1440,7 +1688,12 @@ namespace EduNetworkBuilder
public bool HasBroadcastAddress(NB_IPAddress dest)
{
if (dest.BroadcastAddress == dest.GetIP) return true;
foreach(NetworkCard nic in NICs)
//This "fixes" a strange fringe case of when we configure a subnet such that
//a packet that is traversing the network suddenly is a broadcast packet on the
//target network. Gotta have odd subnetting for this to happen
if (dest.IsBroadcast()) return true;
foreach (NetworkCard nic in NICs)
{
if (nic.HasBroadcastAddresses(dest))
return true;
@ -1518,109 +1771,28 @@ namespace EduNetworkBuilder
return arps;
}
public override void UpdateFromComponent(NetworkComponent CopyFrom, bool NoteAllChanges = false)
public override void UpdateFromComponent(NetworkComponent CopyFrom)
{
if (CopyFrom.GetType() != this.GetType()) return; //we cannot copy from it if it is different
NetworkDevice ndCopyFrom = (NetworkDevice)CopyFrom;
if (Object.ReferenceEquals(this, CopyFrom)) return; //No need to copy values to itself
Network mainnet = NB.GetNetwork();
string indent = " ";
//if(NoteAllChanges && mainnet != null) mainnet.AddMessage(new PacketMessage("", indent + NB.Translate("NDUpdateComponent")));
if (hostname != ndCopyFrom.hostname)
{
if (NoteAllChanges && mainnet != null) mainnet.AddMessage(new PacketMessage("", indent + "hostname: " + hostname + " -> " + ndCopyFrom.hostname));
hostname = ndCopyFrom.hostname;
}
hostname = ndCopyFrom.hostname;
Size = ndCopyFrom.Size;
if (DefaultGW.GetIPString != ndCopyFrom.DefaultGW.GetIPString)
{
if (NoteAllChanges && mainnet != null) mainnet.AddMessage(new PacketMessage("", indent + "DefaultGW: " + DefaultGW.GetIPString + " -> " + ndCopyFrom.DefaultGW.GetIPString));
DefaultGW = ndCopyFrom.DefaultGW;
}
DefaultGW = ndCopyFrom.DefaultGW;
if (ndCopyFrom.MyImage != null)
MyImage = new Bitmap(ndCopyFrom.MyImage);
else
MyImage = null;
CanAddNics = ndCopyFrom.CanAddNics;
CanServeDHCP = ndCopyFrom.CanServeDHCP;
CanUseDHCP = ndCopyFrom.CanUseDHCP;
MustUseDHCP = ndCopyFrom.MustUseDHCP;
isDHCPServer = ndCopyFrom.isDHCPServer;
isDNSServer = ndCopyFrom.isDNSServer;
HasAdvFirewall = ndCopyFrom.HasAdvFirewall;
if (CanAddNics != ndCopyFrom.CanAddNics)
{
if (NoteAllChanges && mainnet != null) mainnet.AddMessage(new PacketMessage("", indent + "CanAddNics: " + CanAddNics + " -> " + ndCopyFrom.CanAddNics));
CanAddNics = ndCopyFrom.CanAddNics;
}
if (CanServeDHCP != ndCopyFrom.CanServeDHCP)
{
if (NoteAllChanges && mainnet != null) mainnet.AddMessage(new PacketMessage("", indent + "CanServeDHCP: " + CanServeDHCP + " -> " + ndCopyFrom.CanServeDHCP));
CanServeDHCP = ndCopyFrom.CanServeDHCP;
}
if (CanUseDHCP != ndCopyFrom.CanUseDHCP)
{
if (NoteAllChanges && mainnet != null) mainnet.AddMessage(new PacketMessage("", indent + "CanUseDHCP: " + CanUseDHCP + " -> " + ndCopyFrom.CanUseDHCP));
CanUseDHCP = ndCopyFrom.CanUseDHCP;
}
if (MustUseDHCP != ndCopyFrom.MustUseDHCP)
{
if (NoteAllChanges && mainnet != null) mainnet.AddMessage(new PacketMessage("", indent + "MustUseDHCP: " + MustUseDHCP + " -> " + ndCopyFrom.MustUseDHCP));
MustUseDHCP = ndCopyFrom.MustUseDHCP;
}
if (isDHCPServer != ndCopyFrom.isDHCPServer)
{
if (NoteAllChanges && mainnet != null) mainnet.AddMessage(new PacketMessage("", indent + "IsDHCPServer: " + isDHCPServer + " -> " + ndCopyFrom.isDHCPServer));
isDHCPServer = ndCopyFrom.isDHCPServer;
}
if (isDNSServer != ndCopyFrom.isDNSServer)
{
if (NoteAllChanges && mainnet != null) mainnet.AddMessage(new PacketMessage("", indent + "IsDNSserver: " + isDNSServer + " -> " + ndCopyFrom.isDNSServer));
isDNSServer = ndCopyFrom.isDNSServer;
}
if (HasAdvFirewall != ndCopyFrom.HasAdvFirewall)
{
if (NoteAllChanges && mainnet != null) mainnet.AddMessage(new PacketMessage("", indent + "HasAdvancedFirewall: " + HasAdvFirewall + " -> " + ndCopyFrom.HasAdvFirewall));
HasAdvFirewall = ndCopyFrom.HasAdvFirewall;
}
MyLocation = ndCopyFrom.MyLocation;
//Process NICs.
if (NoteAllChanges && mainnet != null)
{
//List all nics that we are dropping
foreach (NetworkCard nic in NICs)
{
NetworkCard foundnic = ndCopyFrom.NicFromName(nic.NicName());
if (foundnic == null)
mainnet.AddMessage(new PacketMessage("", indent + "DropNIC: " + nic.NicName()));
else
{
//The nic still exists. Note any major changes. IP, netmask
if((foundnic.myNicType == NicType.wport || foundnic.myNicType == NicType.wlan) && foundnic.SSID != nic.SSID)
mainnet.AddMessage(new PacketMessage("", indent + "SSID: " + nic.SSID + " -> " + foundnic.SSID));
if ((foundnic.myNicType == NicType.vpn || foundnic.myNicType == NicType.vpn) && foundnic.EncryptionKey != nic.EncryptionKey)
mainnet.AddMessage(new PacketMessage("", indent + "EncryptionKey: " + nic.EncryptionKey + " -> " + foundnic.EncryptionKey));
//Compare interfaces - should be done at nic level...
if (foundnic.AllInterfacesString() != nic.AllInterfacesString())
mainnet.AddMessage(new PacketMessage("", indent + "Interfaces: " + nic.AllInterfacesString(true) + " -> " + foundnic.AllInterfacesString(true)));
}
}
//List all nics that we are dropping
foreach (NetworkCard nic in ndCopyFrom.NICs)
{
NetworkCard mynic = NicFromName(nic.NicName());
if (mynic == null)
mainnet.AddMessage(new PacketMessage("", indent + "AddNIC: " + nic.NicName() + " " +nic.AllInterfacesString()));
}
}
//Now, copy across the NICs
NICs.Clear();
foreach(NetworkCard nic in ndCopyFrom.NICs)
{
@ -1634,6 +1806,24 @@ namespace EduNetworkBuilder
RouteTable.AddRange(ndCopyFrom.RouteTable);
DHCPRanges.Clear();
DHCPRanges.AddRange(ndCopyFrom.DHCPRanges);
//if the IP address has changed, also update the corresponding address in DHCP rules
foreach (NB_IPAddress dhcpIP in DHCPRanges)
{
foreach (NetworkCard nic in NICs)
{
NetworkInterface matchingIF = nic.LocalInterface(dhcpIP, null);
if (matchingIF != null && !matchingIF.myIP.Equals(dhcpIP.GetIP) && !matchingIF.myIP.Equals(0))
{
//only validate the entry if the new address doesn't conflict with the DHCP range.
UInt32 nStartingDHCP = dhcpIP.GetMask;
UInt32 nEndingDHCP = dhcpIP.GetGateway;
if (matchingIF.myIP.GetIP < nStartingDHCP || matchingIF.myIP.GetIP > nEndingDHCP)
{
dhcpIP.SetIP(matchingIF.myIP.GetIP);
}
}
}
}
DHCPLeases.Clear();
DHCPLeases.AddRange(ndCopyFrom.DHCPLeases);
@ -1913,7 +2103,7 @@ namespace EduNetworkBuilder
//Change this. Need a new ProcessArrival
if (tPacket.MyType != PacketType.dhcp_answer) //If it is a match, it should be handled elsewhere
ProcessArrival(tPacket);
if (ExactMatch && tPacket.isFinshed())
if (ExactMatch && tPacket.isFinished())
return;
}
@ -1929,7 +2119,7 @@ namespace EduNetworkBuilder
//It was destined for here, or it is starting from scratch. See if we need to route it.
if (tPacket.destIP == null) tPacket.destIP = new NB_IPAddress(NB.ZeroIPString);
NB_IPAddress dest = DestinationFromIP(tPacket.destIP); //Get the IP, or GW
if(dest.GetIPString == NB.ZeroIPString && tPacket.destIP.GetIPString != NB.BroadcastIPString)
if(dest.IsZeroString() && !tPacket.destIP.IsBroadcast())
{
//No gateway set and no route...
string errString = string.Format(NB.Translate("ND_NoRouteStr"), hostname, tPacket.destIP.GetIPString);
@ -1945,7 +2135,7 @@ namespace EduNetworkBuilder
tPacket.OutboundIP = tPacket.destIP;
tPacket.TsourceIP = null;
}
else if(tPacket.destIP.GetIPString != NB.BroadcastIPString)
else if(!tPacket.destIP.IsBroadcast())
{
//it needs to go to a gateway. Set the next destination is the GW
tPacket.OutboundIP = dest;
@ -1960,7 +2150,7 @@ namespace EduNetworkBuilder
}
if (tPacket.isFinshed() && !BroadcastMatch) return;
if (tPacket.isFinished() && !BroadcastMatch) return;
NetworkCard dNic = null;
NetworkCard sNic = null;
@ -2234,7 +2424,7 @@ namespace EduNetworkBuilder
nPacket.sourceIP = new NB_IPAddress(NB.ZeroIPString);
nPacket.TsourceIP = new NB_IPAddress(NB.ZeroIPString);
}
if (tip.GetIP.ToIpString() != NB.ZeroIPString)
if (!tip.IsZeroString())
nPacket.destIP = tip;
if (tPacket.isFresh)
{
@ -2519,7 +2709,7 @@ namespace EduNetworkBuilder
if (tNic.GetNicType == NicType.lo) continue; //Don't check loopback nics
if (tNic.GetNicType == NicType.port) continue; //Don't check ports
nif = tNic.LocalInterface(ip, null);
if(nif != null && nif.myIP.GetIPString != NB.ZeroIPString)
if(nif != null && !nif.myIP.IsUnassigned())
{
return nif.myIP;
}
@ -2642,7 +2832,12 @@ namespace EduNetworkBuilder
NetworkCard tCard = null;
NB_IPAddress DestAddr;
string DHCPGW = "";
foreach( NB_IPAddress ip in RouteTable)
//Do not ping the zero string. Should not go anywhere
if (dest != null && dest.IsZeroString())
return new NB_IPAddress(NB.ZeroIPString);
foreach ( NB_IPAddress ip in RouteTable)
{
if (ip.IsLocal(dest))
return new NB_IPAddress(ip.GetGateway.ToIpString());//We return the gateway
@ -2655,7 +2850,7 @@ namespace EduNetworkBuilder
DHCPGW = nic.FirstIP().GetGateway.ToIpString();
}
nIF = nic.LocalInterface(dest,null);
if (nIF != null && nIF.myIP.GetIPString != NB.ZeroIPString)
if (nIF != null && !nIF.myIP.IsZeroString())
{
DestAddr = dest; //We found it. Send it to the destination
return DestAddr;
@ -2664,9 +2859,13 @@ namespace EduNetworkBuilder
if (oNic != null)
{
List<NB_IPAddress> tlist = oNic.IPAddressList();
if(tlist.Count > 0 && tlist[0].GetGateway.ToIpString() != NB.ZeroIPString)
if(tlist.Count > 0)
{
return new NB_IPAddress(tlist[0].GetGateway.ToIpString());
//Make sure the address is not the zerostring...
NB_IPAddress nAddress = new NB_IPAddress(tlist[0].GetGateway.ToIpString());
if(!nAddress.IsZeroString())
return new NB_IPAddress(tlist[0].GetGateway.ToIpString());
}
}
if (DHCPGW != "")
@ -2728,10 +2927,10 @@ namespace EduNetworkBuilder
tPacket.MyStatus = PacketStatus.finished; //we have replaced it with other ones
return false;
}
if (tPacket.OutboundIP == null || tPacket.OutboundIP.GetIP.ToIpString() == NB.ZeroIPString && tPacket.MyType != PacketType.dhcp_request)
if (tPacket.OutboundIP == null || tPacket.OutboundIP.IsZeroString() && tPacket.MyType != PacketType.dhcp_request)
{
tPacket.OutboundIP = DestinationFromIP(dest,tPacket.OutboundNic);
if (tPacket.OutboundIP.GetIP.ToIpString() == NB.ZeroIPString)
if (tPacket.OutboundIP.IsZeroString())
{
if (tPacket.MyType == PacketType.dhcp_answer)
{
@ -2818,7 +3017,7 @@ namespace EduNetworkBuilder
{
nIF = nic.LocalInterface(toFind, null);
if (nIF != null) {
if (nIF.myIP.GetIPString == NB.ZeroIPString)
if (nIF.myIP.IsZeroString())
continue;
return nic;
}
@ -2867,7 +3066,7 @@ namespace EduNetworkBuilder
{
foreach(NB_IPAddress ip in nic.IPAddressList())
{
if (ip.GetIPString != NB.ZeroIPString && ip.GetIPString != NB.LoopbackIPString)
if (!ip.IsZeroString() && !ip.IsLoopback())
return ip;
}
}
@ -2875,13 +3074,26 @@ namespace EduNetworkBuilder
return null;
}
private List<NetworkCard> NICsFromTypeNic(NicType What)
{
List<NetworkCard> tList = new List<NetworkCard>();
foreach (NetworkCard nic in NB.Randomize(NICs).ToList())
{
if (nic.GetNicType == What)
{
tList.Add(nic);
}
}
return tList;
}
public NB_IPAddress BestIPForThis(NetworkDevice Source=null)
{
NB_IPAddress answer=null;
if(Source != null)
{
answer = LocalDeviceIP(Source);
if (answer != null && answer.GetIPString != NB.ZeroIPString)
if (answer != null && !answer.IsZeroString())
return answer;
}
//If we have a WAN Nic, use that first
@ -3002,14 +3214,16 @@ namespace EduNetworkBuilder
}
}
if (!ForwardsPackets())
if (!ForwardsPackets() || HasIPAddress(tPacket.destIP))
{
//Traceroute bounce-back
if(tPacket.MyType == PacketType.tracert_request)
if (tPacket.MyType == PacketType.tracert_request)
{
if (ProcessTracertPacket(tPacket)) return; //the packet stops if it gets bounced.
}
}
if (!ForwardsPackets())
{
if (tPacket.MyType == PacketType.dhcp_request && !isDHCPServer)
{
tPacket.AddMessage(DebugLevel.debug, NB.LeftPad(hostname) + " " +string.Format(NB.Translate("ND_DoInFromLnkDeaf")));
@ -3080,7 +3294,12 @@ namespace EduNetworkBuilder
//Console.WriteLine(" Tracert bounce: " + tPacket.OrigTTL + " " + hostname + " " + tPacket.payloadData);
//Finish setting up the new packet - sending it back
nPacket.sourceIP = new NB_IPAddress(NB.ZeroIPString);
// respond from requested address, not outgoing address: important for routers.
if (HasIPAddress(tPacket.destIP))
nPacket.sourceIP = tPacket.destIP;
else
nPacket.sourceIP = new NB_IPAddress(NB.ZeroIPString);
nPacket.TsourceIP = new NB_IPAddress(NB.ZeroIPString);
myNet.addPacket(nPacket);
//Console.WriteLine(" Tracert bounce pkt:" + nPacket.OrigTTL + nPacket.payloadData);
@ -3200,7 +3419,8 @@ namespace EduNetworkBuilder
{
ArpTable.Add(AE);
}
if(IPFromArp(mac) != ip && ip != NB.ZeroIPString)
NB_IPAddress tAddress = new NB_IPAddress(ip);
if(IPFromArp(mac) != ip && !tAddress.IsZeroString())
{
foreach (ArpEntry arp in ArpTable.ToList())
{
@ -3287,7 +3507,7 @@ namespace EduNetworkBuilder
List<string> theStrings = new List<string>();
foreach(NB_IPAddress ip in DHCPRanges)
{
if (ip.GetIP.ToIpString() != "127.0.0.1")
if (!ip.IsLoopback())
{
if (WithAdditionalInfo)
{
@ -3308,7 +3528,7 @@ namespace EduNetworkBuilder
if (InterfaceIP == null) return null;
foreach (NB_IPAddress ip in DHCPRanges)
{
if (ip.GetIP.ToIpString() != "127.0.0.1" && InterfaceIP.IsLocal(ip))
if (!ip.IsLoopback() && InterfaceIP.IsLocal(ip))
return ip;
}
return null;

View File

@ -123,6 +123,16 @@ namespace EduNetworkBuilder
return VLANTagType.Forbidden; //if not defined, it is forbidden
}
public int GetUntaggedVLAN()
{
foreach (VLANInfo vin in VLANs)
{
if (vin.Tag == VLANTagType.Untagged)
return vin.ID;
}
return NB.InvalidVLAN;
}
public int GetNonForbiddenVLANID()
{
foreach(VLANInfo vin in VLANs)
@ -130,7 +140,7 @@ namespace EduNetworkBuilder
if (vin.Tag != VLANTagType.Forbidden)
return vin.ID;
}
return -999;
return NB.InvalidVLAN;
}
public void SetVLANTag(int id, VLANTagType Tag)
@ -271,7 +281,7 @@ namespace EduNetworkBuilder
NetworkCard nic = HD.NicFromID(AttachedToHostNic);
if(nic != null && nic.GetNicType != NicType.port && nic.GetNicType != NicType.wport)
tPacket.TsourceIP = myIP;
if(tPacket.TsourceIP == null || tPacket.TsourceIP.GetIPString == NB.ZeroIPString)
if(tPacket.TsourceIP == null || tPacket.TsourceIP.IsZeroString())
tPacket.TsourceIP = myIP;
if (What == VLANTagType.Forbidden)

View File

@ -489,7 +489,7 @@ namespace EduNetworkBuilder
return false;
}
public bool isFinshed()
public bool isFinished()
{
if (_MyStatus == PacketStatus.finished_ok) return true;
if (_MyStatus == PacketStatus.finished_failed) return true;

View File

@ -70,7 +70,7 @@
<interface>
<nicname>management_interface0</nicname>
<myip>
<ip>102.168.1.4</ip>
<ip>192.168.1.4</ip>
<mask>255.255.255.0</mask>
<gateway>0.0.0.0</gateway>
<type>ip</type>

View File

@ -2,8 +2,8 @@
<EduNetworkBuilder>
<!--This is a network file for EduNetworkBuilder.-->
<Network>
<en_message>The one router got replaced and needs the correct IP-Addresses given to it.</en_message>
<fr_message>Le routeur a été remplacé et a besoin des adresses IP correctes qui lui ont été attribuées.</fr_message>
<en_message>The one router got replaced and needs the correct IP-Addresses and routes given to it.</en_message>
<fr_message>Le routeur a été remplacé et a besoin des adresses IP correctes qui lui ont été attribuées et des itinéraires.</fr_message>
<en_title>Router Replacement</en_title>
<height>1024</height>
<width>1024</width>
@ -1205,18 +1205,6 @@
ID="1">Untagged</VLAN>
</interface>
</nic>
<route>
<ip>172.16.1.2</ip>
<mask>255.255.255.252</mask>
<gateway>172.16.1.9</gateway>
<type>route</type>
</route>
<route>
<ip>172.16.1.18</ip>
<mask>255.255.255.252</mask>
<gateway>172.16.1.14</gateway>
<type>route</type>
</route>
</device>
<device>
<hostname>router4</hostname>

View File

@ -1478,6 +1478,11 @@ Someone is complaining that they cannot access the servers on the other side of
<dhost>pc3</dhost>
<thetest>SuccessfullyPings</thetest>
</nettest>
<nettest>
<shost>laptop0</shost>
<dhost>server0</dhost>
<thetest>NeedsLocalIPTo</thetest>
</nettest>
<VLANName
ID="1"
Color="Blue">Default</VLANName>

View File

@ -1102,6 +1102,6 @@ Ce puzzle a un interrupteur que vous avez été bloqué. Réinitialisez-le (clic
Color="Blue">Default</VLANName>
<VLANName
ID="2"
Color="Blue">Sttaff</VLANName>
Color="Blue">Staff</VLANName>
</Network>
</EduNetworkBuilder>

View File

@ -3,7 +3,7 @@
<!--This is a network file for EduNetworkBuilder.-->
<Network>
<en_message>Switch Ports can have three states:
Unagged
UnTagged
Tagged
Forbidden
When you are connecting switch-to-switch, they should be "Tagged." This makes a "Trunk", or a backbone link that can pass any VLAN. This allows packets to go to all the switches, and let the switches determine what devices they can go to from there.
@ -1124,6 +1124,6 @@ Pour compléter ce puzzle, vérifiez les deux commutateurs. L'un d'eux n'a pas l
Color="Blue">Default</VLANName>
<VLANName
ID="2"
Color="Blue">Sttaff</VLANName>
Color="Blue">Staff</VLANName>
</Network>
</EduNetworkBuilder>

View File

@ -2,7 +2,7 @@
<EduNetworkBuilder>
<!--This is a network file for EduNetworkBuilder.-->
<Network>
<en_message>A staff memner brought in a laptop and they have problems. As always, they want you to fix it.
<en_message>A staff member brought in a laptop and they have problems. As always, they want you to fix it.
Some vlan issues are a lot simpler than they originally look.</en_message>
<fr_message>Un membre du personnel a apporté un ordinateur portable et ils ont des problèmes. Comme toujours, ils veulent que vous le répariez.
Certains problèmes de vlan sont beaucoup plus simples qu'ils ne le paraissent à l'origine.</fr_message>

View File

@ -1204,6 +1204,6 @@
Color="Blue">Default</VLANName>
<VLANName
ID="2"
Color="Blue">Sttaff</VLANName>
Color="Blue">Staff</VLANName>
</Network>
</EduNetworkBuilder>

View File

@ -1214,6 +1214,6 @@ Pour que cela fonctionne, nous avons besoin de deux VLAN différents sur le seul
Color="Blue">Default</VLANName>
<VLANName
ID="2"
Color="Blue">Sttaff</VLANName>
Color="Blue">Staff</VLANName>
</Network>
</EduNetworkBuilder>

View File

@ -1121,6 +1121,6 @@ Faites un ping sur un certain nombre d'ordinateurs et faites des pings de diffus
Color="Blue">Default</VLANName>
<VLANName
ID="2"
Color="Blue">Sttaff</VLANName>
Color="Blue">Staff</VLANName>
</Network>
</EduNetworkBuilder>

View File

@ -42,6 +42,8 @@
<nictype>lo</nictype>
<uniqueidentifier>101</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>lo0</nicname>
<myip>
@ -66,6 +68,8 @@
<nictype>wan</nictype>
<uniqueidentifier>104</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>wan0</nicname>
<myip>
@ -90,6 +94,8 @@
<nictype>eth</nictype>
<uniqueidentifier>102</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>eth0</nicname>
<myip>
@ -153,6 +159,8 @@
<nictype>eth</nictype>
<uniqueidentifier>103</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>eth1</nicname>
<myip>
@ -202,6 +210,8 @@
<nictype>lo</nictype>
<uniqueidentifier>106</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>lo0</nicname>
<myip>
@ -226,6 +236,8 @@
<nictype>management_interface</nictype>
<uniqueidentifier>107</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>management_interface0</nicname>
<myip>
@ -250,6 +262,8 @@
<nictype>port</nictype>
<uniqueidentifier>108</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>port1</nicname>
<myip>
@ -276,6 +290,8 @@
<nictype>port</nictype>
<uniqueidentifier>109</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>port2</nicname>
<myip>
@ -302,6 +318,8 @@
<nictype>port</nictype>
<uniqueidentifier>110</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>port3</nicname>
<myip>
@ -328,6 +346,8 @@
<nictype>port</nictype>
<uniqueidentifier>111</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>port4</nicname>
<myip>
@ -354,6 +374,8 @@
<nictype>port</nictype>
<uniqueidentifier>112</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>port5</nicname>
<myip>
@ -380,6 +402,8 @@
<nictype>port</nictype>
<uniqueidentifier>113</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>port6</nicname>
<myip>
@ -410,6 +434,8 @@
<nictype>port</nictype>
<uniqueidentifier>114</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>port7</nicname>
<myip>
@ -455,6 +481,8 @@
<nictype>lo</nictype>
<uniqueidentifier>116</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>lo0</nicname>
<myip>
@ -479,6 +507,8 @@
<nictype>management_interface</nictype>
<uniqueidentifier>117</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>management_interface0</nicname>
<myip>
@ -505,6 +535,8 @@
<nictype>port</nictype>
<uniqueidentifier>118</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>port1</nicname>
<myip>
@ -533,6 +565,8 @@
<nictype>port</nictype>
<uniqueidentifier>119</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>port2</nicname>
<myip>
@ -542,11 +576,11 @@
<type>ip</type>
</myip>
<VLAN
ID="1">Untagged</VLAN>
ID="1">Forbidden</VLAN>
<VLAN
ID="2">Forbidden</VLAN>
<VLAN
ID="3">Forbidden</VLAN>
ID="3">Untagged</VLAN>
</interface>
</nic>
<nic>
@ -561,6 +595,8 @@
<nictype>port</nictype>
<uniqueidentifier>120</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>port3</nicname>
<myip>
@ -589,6 +625,8 @@
<nictype>port</nictype>
<uniqueidentifier>121</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>port4</nicname>
<myip>
@ -617,6 +655,8 @@
<nictype>port</nictype>
<uniqueidentifier>122</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>port5</nicname>
<myip>
@ -645,6 +685,8 @@
<nictype>port</nictype>
<uniqueidentifier>123</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>port6</nicname>
<myip>
@ -675,6 +717,8 @@
<nictype>port</nictype>
<uniqueidentifier>124</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>port7</nicname>
<myip>
@ -720,6 +764,8 @@
<nictype>lo</nictype>
<uniqueidentifier>126</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>lo0</nicname>
<myip>
@ -744,6 +790,8 @@
<nictype>management_interface</nictype>
<uniqueidentifier>127</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>management_interface0</nicname>
<myip>
@ -770,6 +818,8 @@
<nictype>port</nictype>
<uniqueidentifier>128</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>port1</nicname>
<myip>
@ -798,6 +848,8 @@
<nictype>port</nictype>
<uniqueidentifier>129</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>port2</nicname>
<myip>
@ -826,6 +878,8 @@
<nictype>port</nictype>
<uniqueidentifier>130</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>port3</nicname>
<myip>
@ -852,6 +906,8 @@
<nictype>port</nictype>
<uniqueidentifier>131</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>port4</nicname>
<myip>
@ -878,6 +934,8 @@
<nictype>port</nictype>
<uniqueidentifier>132</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>port5</nicname>
<myip>
@ -904,6 +962,8 @@
<nictype>port</nictype>
<uniqueidentifier>133</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>port6</nicname>
<myip>
@ -934,6 +994,8 @@
<nictype>port</nictype>
<uniqueidentifier>134</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>port7</nicname>
<myip>
@ -980,6 +1042,8 @@
<nictype>lo</nictype>
<uniqueidentifier>136</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>lo0</nicname>
<myip>
@ -1004,6 +1068,8 @@
<nictype>eth</nictype>
<uniqueidentifier>137</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>eth0</nicname>
<myip>
@ -1044,6 +1110,8 @@
<nictype>lo</nictype>
<uniqueidentifier>139</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>lo0</nicname>
<myip>
@ -1068,6 +1136,8 @@
<nictype>eth</nictype>
<uniqueidentifier>140</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>eth0</nicname>
<myip>
@ -1108,6 +1178,8 @@
<nictype>lo</nictype>
<uniqueidentifier>142</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>lo0</nicname>
<myip>
@ -1132,6 +1204,8 @@
<nictype>eth</nictype>
<uniqueidentifier>143</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>eth0</nicname>
<myip>
@ -1172,6 +1246,8 @@
<nictype>lo</nictype>
<uniqueidentifier>145</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>lo0</nicname>
<myip>
@ -1196,6 +1272,8 @@
<nictype>eth</nictype>
<uniqueidentifier>146</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>eth0</nicname>
<myip>
@ -1236,6 +1314,8 @@
<nictype>lo</nictype>
<uniqueidentifier>148</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>lo0</nicname>
<myip>
@ -1260,6 +1340,8 @@
<nictype>eth</nictype>
<uniqueidentifier>149</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>eth0</nicname>
<myip>
@ -1300,6 +1382,8 @@
<nictype>lo</nictype>
<uniqueidentifier>151</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>lo0</nicname>
<myip>
@ -1324,6 +1408,8 @@
<nictype>eth</nictype>
<uniqueidentifier>152</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>eth0</nicname>
<myip>
@ -1364,6 +1450,8 @@
<nictype>lo</nictype>
<uniqueidentifier>154</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>lo0</nicname>
<myip>
@ -1388,6 +1476,8 @@
<nictype>eth</nictype>
<uniqueidentifier>155</uniqueidentifier>
<usesdhcp>False</usesdhcp>
<encryptionkey />
<ssid />
<interface>
<nicname>eth0</nicname>
<myip>

View File

@ -1,306 +1,689 @@
{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1033\deflangfe1033{\fonttbl{\f0\fswiss\fprq2\fcharset0 Calibri;}}
{\colortbl ;\red0\green0\blue255;}
{\*\generator Riched20 10.0.22621}{\*\mmathPr\mdispDef1\mwrapIndent1440 }\viewkind4\uc1
\pard\nowidctlpar\sa200\sl276\slmult1\b\f0\fs22\lang9 Version 1.0.54\b0\par
* Minor changefor developers allowing more information about what is happening during regression testing. \par
\b Version 1.0.53\par
*\b0 Show a line between devices when dragging ethernet cables. Makes it easier to see.\par
* Tried highlighting what you are supposed to be filling out next, when creating network links.\b\par
Version 1.0.52\par
\b0 * Change publish URL to an actual domain.\b\par
Version 1.0.51\par
\b0 * Added small time-based delay when printing packets; on fast computers the packets would fly by too fast.\par
\b Version 1.0.50\par
\b0 * Added regression testing for making sure we do not break things while making changes to the UI or how the system works.\par
* Added regression tests for most all the networks\par
* Able to change gateway if the primary network connection does not have DHCP. There was an issue with a puzzle because of this.\par
* Do not check firewall rules if the firewall checkmark is turned off. You can disable the firewall rules by turning off the firewall.\par
* Get the reload button working properly. You can reload a puzzle and it will reset to its original state.\par
* Better listing of puzzles and highlighting the next puzzle to do.\par
* When resetting a switch, reset the vlans on that switch. Somewhere this broke and we needed to put it back.\par
* Added some action debugging. No impact on users, just developers.\par
* Better processing of wireless link autojoin\par
\b Version 1.0.49\par
\b0 * Change level1_practice5. It had been a puzzle with two DHCP servers, but we have not taught that concept yet. I change it so the DHCP server was passing out bad DHCP. IPs already exist.\par
* Fixed a few bugs in other \ldblquote practice\rdblquote levels.\par
* Made a test for a network loop. So we can have a \ldblquote ping without looping\rdblquote test. So we need to have a successful ping that does not cause a network loop.\par
* Fixed an issue with wireless bridges. They were routing packets instead of forwarding packets, which broke them in a few instances.\par
* Make it so a NIC can spray. It creates bad packets that just keep coming.\par
* Fix some issues with wireless links. Some puzzles had saved multiple wireless links to the same device, which ended up having some rather bizarre issues. Since all wireless links are rebuilt on load, I made it so none of the wireless links are saved, and if they are loaded, they are discarded. It solved a number of issues. \par
\b Version 1.0.48\par
\b0 * Fix a traversal class not serializable error\par
* Close the file -> load toolstrip menu after a load. It had remained annoyingly open.\par
* Added a bunch of \ldblquote practice\rdblquote puzzles. These are for practicing troubleshooting. They do not give you a lot of information about what the problem is; you need to do a bit more testing and trying things to figure them out.\par
* Added a bunch of level5 practice puzzles. More physical networking and wireless than routing issues.\par
* Added the solved versions of the office networks. One with wireless linking between them, and the other having physical wires.\par
\b Version 1.0.47\par
\b0 * YAY! The long-awaited ctrl-z / ctrl-y works. Undo / redo.\par
* Lock a device to a location\par
* Add a tree. Wireless packets cannot go through a tree.\par
* Add background shapes. So we can draw a building and have understandable line of sight.\par
* Add a wireless line of sight puzzle.\par
* Went through old puzzles and locked some items in their locations. Makes some puzzles need to be solved the way the puzzle was intended to be solved.\par
\b Version 1.0.46\par
\b0 * Added a frozen device. Fix it with a reboot. (power off / power on)\par
* Added a bad power-supply (device catches fire when powered on. Need to replace the device to fix)\par
* Added bad electricity. (device continues to catch fire, even after being replaced, until a UPS is added)\par
* Can right-click a network wire. Delete, edit, replace.\par
* Added frozen device, bad power-supply and Needs UPS as ways to randomly break networks.\par
* Optimize the redrawing of the screen packets. Speeded it up considerably\par
* Add puzzles for frozen device, bad power-supply, and needs a UPS.\par
\b Version 1.0.45\par
\b0 * More infrastructure for translating the main program\par
\b Version 1.0.44\par
\b0 * Added ability to add a video URL to a help topic\par
* Added video URL for individual puzzles\par
* Added some initial videos\par
* More work on translation window (most people will not see this)\par
* Fix order of help-level radio-buttons.\par
* Some puzzles are properly translated to French\par
\b Version 1.0.43\par
\b0 * Added the title to the translation window. Puzzle titles can now be translated.\par
* Use the translated titles for the puzzle names on the puzzle selection box\par
\b Version 1.0.42\par
\b0 * Fixed some bugs with working in French \endash puzzles would not show\par
* Fixed bug in French \endash \ldblquote Ping to\rdblquote would not work\par
* Added a translation box when working on puzzles. Ctrl-click the network message in the options window to pull up a translation box. Look at two languages simultaneously. Has save button to save your changes from there.\par
\b Version 1.0.41\par
\b0 * Have the ability to randomly break a network. If you want to just test your brain for fun, or if you are a teacher and just want to generate some homework of some sort. This can help.\par
* Added another solved network (InternetHomeAndOffice)\par
* Give us more options for viewing text under devices. This lets us see things much more cleanly.\par
* Allow different captioning systems. Hostname only, IP only, host + IP, none, full\par
* firewall rules can now affect VPN traffic. You can block from a VPN to the office VLAN, for example. Also, can block guest VLAN from pinging something across the VPN.\par
\b Version 1.0.40\par
\b0 * Jumping ahead version numbers. Adding Educational Mode (see doc on the wiki for a description of the basic functionality added) {{\field{\*\fldinst{HYPERLINK https://git.solidcharity.com/timy/EduNetworkBuilder/wikis/Teacherdoc }}{\fldrslt{https://git.solidcharity.com/timy/EduNetworkBuilder/wikis/Teacherdoc\ul0\cf0}}}}\f0\fs22\par
* Added the ability to make msi files for better deployment in multi-user settings\par
* Adjusted drag functionality so we do not jostle devices around accidentally\par
* Fixed bug when trying to ping wireless devices by name\par
* Fixed a bug pinging 0.0.0.0\par
* Fixed lots of other bugs\par
\b Version 1.0.33\par
\b0 * Fixed a major bug in settings that would blow up new installs.\par
* ctrl-right-click a device to add \ldblquote hide\rdblquote to the context menu.\par
* From the puzzle menu you can ctrl-alt click items to mark them as solved.\par
* Display bad subnet masks (that cannot be displayed using CIDR notation) as /?\par
* Allow pings from devices that are locked. A bug made it so we could not change the address we wanted to ping to; all ip-addresses were locked, even a \ldblquote ping to\rdblquote address.\par
* Minor bug: If we ping a local IP that does not exist, the error message we were getting was the wrong error message. Fixed that.\par
* When wireless device is powered off, remove all wireless links. Links connected to WLAN had been reconnected. Fixed that.\par
* Cannot go into the network options if we have loaded the network from resources. This way we cannot \ldblquote cheat\rdblquote by changing the network options. This is in preparation for setting this up for school use. Making it harder for students to cheat on homework assignments.\par
\b Version 1.0.32\par
\b0 * Allow dragging of items\par
* Select multiple items for dragging by using a nice big drag-box.\par
* Highlight the multiple items if selecting them\par
* Allow the ESC key to clear the selected items.\par
* Can right-click and delete of multiple selected items\par
* Can right-click and change color of multiple selected items\par
* Fixed some tracert bugs\par
* lots of minor fixes so is more stable on Linux\par
* Saves settings in ~/.conf/EduNetworkbuilder_config.xml file on Linux\par
* Cannot edit something that is powered off. Also, cannot ping, do DHCP refresh, etc.\par
* Fixed losing the VPN password changes when editing VPN Info.\par
* Fixed anchoring of puzzle filter box.\par
* Added invisible items. Forgotten switches and unseen network wires. Right now, the only way to make something hidden is by editing the file and saying <invisible>true</invisible> on it.\par
\b Version 1.0.31\par
\b0 * Added powering off switches, routers, and the like\par
* Added traceroute\par
* Added a few puzzles for those\par
* Moved to a new git repository\par
* Changed the default location of popups. They worked very strange in a multi-window environment.\par
\b Version 1.0.30\par
\b0 * Another downloadable (zip only, stable) version.\b\par
Version 1.0.29\par
\b0 * Lots of VLAN butfixes\par
* Fixed ping-fail test\par
* Lots more VLAN puzzles\par
* Update VLAN documentation\par
\b Version 1.0.28\par
\b0 * Initial VLAN release\par
\b Version 1.0.27\par
\b0 * Made distribution easier by CD (does updates from web, but we also have a downloadable zip you can install from)\par
\b Version 1.0.26\par
\b0 * Major graphics overhaul\par
- Packets move on timer\par
- Graphics drawn "smarter"\par
- Result is that things flow smoother. Loopback2 also works much nicer. \par
* Fixed minor issue with "help" puzzle\par
* Made help "?" button turn red when it is part of the puzzle\par
* Put checkmark to display names and IPs of devices on front form.\par
* Add a NetTest to show people to click on the "display Device names and IP" checkmark\b\par
Version 1.0.25\par
\b0 * Minor changes to help file\par
* Fixed size of labels on IP-Address editor box\par
* Hide gateway label when we do not need it. (ip-address editor)\par
* rename "mixed network" puzzle to be "adding devices" (the puzzle was about adding devices)\par
* Changed layout of many messages\par
* Save the level we are working on. Allows us to finish level 5 before level 3 if we want to.\par
* Make network-loop puzzles sit next to each-other\par
* Make it so network-loop2 puzzle asks for second ping after first one finishes \par
* Lots of work towards the French translation\b\par
Version 1.0.24 \par
\b0 * Add sound when ctrl-s is pressed so we know we saved.\par
* Add sound fail when save is canceled (will use it later if ctrl-s fails)\par
* Added some wireless puzzles\par
* Fix issue with WAP not forwarding packets correctly\par
* Clear out old status message if we do something. So we do not say "saved" forever...\par
* Fixed bad gateway on wireless router issue\par
* Fixed wbridge misbehaving. (issue with gateway)\par
* Added wireless items to help and context help topics\par
* Thanks to Peter Wilson for so much of the translation backbone.\par
* Lots of translation string changes. The French translation should be soon in coming.\par
\b Version 1.0.23 09/20/2015\par
\b0 * Fixed issues with broadcast packets\par
* Fixed a network loop issue\par
* Fixed issue with multiple interfaces and being able to go out a different interface than we came in on\par
* Fixed many small bugs that crept in when fixing other bugs. Now all puzzles seem to play correctly\b\par
Version 1.0.22 09/01/2015\b0\par
* Added ssid and keys for wireless links\par
* Wireless will auto-disconnect if link is too long\par
* Wireless will auto-connect if ssid and key match, if link is short enough\par
* Packets will drop on wireless links if distance is too great\par
* wport has no interface (cannot edit IP address)\par
* wireless router works properly - forwards broadcast packets\par
* wireless router handles dhcp requests properly (both responds to it but also passes it on)\par
* right-clicking light and microwave no longer has ping, arp, edit, and other context menus\par
* added net-test for DHCP server status (on/off)\par
* If multiple DHCP servers, client randomly chooses which to keep.\par
*Add Wireless Puzzle\par
*Fix many wireless device bugs\line\b Version 1.0.21 08/15/2015\b0\par
* Added a microwave and fluorescent light. They corrupt data when packets run close to them.\par
* Added some packet corruption puzzles\par
* Fixed window resize-on-load issue where the help window popped up first, then the builder window resized over to hide the help window. \par
\b Version 1.0.20 08/12/2015\b0\par
* wports do not display on tooltips or when printing the device info\par
* Added ctrl-s to quick-save a network we are working on\par
* commented out wireless devices for now - doing a big demo and wireless is not yet complete\par
* added search box to help\par
\b Version 1.0.19 08/08/2015\b0\par
*Updated context help for most puzzles that introduce new ideas.\par
* Sorted Help topics when adding them in net-tests.\par
* Added some images to the help to help clarify things.\par
* Start with the help windows being the same "height" as the network window.\par
* Open Help so it can be kept open while the puzzles progress.\par
* Deal with minimized state better (used to shrink window to smallest possible state)\par
* Remember size and location of main window between uses.\par
\b Version 1.0.18 08/08/2015\b0\par
* Added Context Help for puzzles.\par
- Each puzzle can have context help\par
- There is a net-test to have us read help\par
* fixed minor problem with a "ding" sound when we load a puzzle that has something locked.\par
\b Version 1.0.17 08/01/2015\b0\par
* Added more help\par
* Much progress made in preparing for a French translation\par
* allow for Puzzle's description to be in another language\par
* Added more to help\par
* Removed edit -> cut, paste, copy, undo. They never did anything. So why have them?\par
* Save box starts in the directory of the file we opened (if we have one)\par
* Choose a language at startup if one has never been chosen, and have option to change language.\par
* Added another puzzle, showing what happens (or does not happen) if we have two networks that use the same IP addresses, and we want to build a VPN between them.\par
\b Version 1.0.16 07/18/2015\b0\par
* Added ability to break links (bad network wire)\par
* "connection lights" on network cards / ports when we edit devices\par
* Test for "needs link to" does not succeed if the link in question is a broken link\par
* Added a puzzle to show you how to find broken links \par
* Used broken links in other puzzles\par
* Fixed bug: switches could not use DHCP for many different reasons. Now it works for them.\par
\b Version 1.0.15 07/11/2015\b0\par
* Added ping time progress bar\par
* Fixed issue with things timing out before they completed. If the network screen is too large, it makes it go just a tiny bit slower and various things would fail. When the first packet successfully makes it to the far end, it recomputes the time needed and gives extra time.\par
* Added context menu ping. If an item is supposed to ping something, right-clicking adds the ping test to the menu. Takes some of the guess-work out of things.\par
* Fixed minor issue with this change log. Had two 1.0.11 versions & somehow was stating we were at version 10.x.x instead of 1.x.x (sigh) \par
* Fixed the VPNify puzzle. Had a goof in it.\par
* Made it so you cannot connect a link to a VPN. A VPN should be a virtual connection, not a physical connection.\par
\b Version 1.0.14 07/10/2015\b0\par
* When we finish a puzzle, allow us to auto-open the "next puzzle" box.\par
* Added lots more puzzles\par
* Added more help & documentation\par
* Made it so test for local IP also checked to make sure the subnet-masks matched\par
* Made it so the test for a matching route compared netmasks\par
* Added a printer object\par
* Added a copier object\par
\b Version 1.0.13 06/21/2015\b0\par
* Fixed issues with arp - arp could go through routers. Now works correctly\par
* Made it test for puzzle completion after adding devices\par
* Made it test for completion after changing / deleting devices\par
* Let you delete / add NICs on PCs, primarily so we can solve the duplicate MAC puzzle\par
* Replaced the "Network Loop" puzzle with the correct one.\par
\b Version 1.0.12 06/20/2015\b0\par
* Added VPN and TUN nic types\par
* Fixed numerous small bugs\par
* Fixed bug with early solution to failed ping test\par
* Added "ding" when a test is solved.\par
* Added a "firewall" network that has a firewall and vpns\par
* Added numerous firewall / vpn puzzles\par
* Fixed a DNS issue. It now more intelligently finds the right IP address when you ping it\par
\b Version 1.0.11 06/14/2015\b0\par
* Added the ability to lock various important features to make puzzles better\par
* Able to add interfaces (multiple IPs on a Network Card)\par
* Right-click context menu to add net-tests. \par
* Del key now deletes the last item we had clicked on\par
* Can add NICs (on some devices)\par
* Can delete NICs\par
* Fixed minor bug with broadcast pinging solving ping test for individual computers\par
\b Version 1.0.10 06/13/2015\b0\par
* Renamed puzzles to manage them easier\par
* Deal with duplicate IPs, and what happens when a packet returns to a computer that did not send it.\par
* Change to the help window so you can keep the window open while working with the puzzle.\par
* Change to the donation link. Not that it will ever be used, but it makes me feel better having a few places for people to donate to if they wish.\par
* Minor change for how broadcast packets work, specifically dealing with duplicate IP addresses.\par
* Added a "firewall" device & WAN port with masquerade\par
* Added a FailedPing test so we can ping things that must fail (show the firewall works)\par
* added more to the help\par
* added more puzzles\par
\b Version 1.0.0.9 05/29/2015\b0\par
* Add a grid to the network map. It makes things easier to straighten up\par
* Sorted and organized the puzzles\par
* Made a level for each puzzle.\par
* Tracked the puzzles which have been completed\par
* When we open the puzzle list, we now show the first level of puzzles that have an uncompleted puzzle.\par
* Added more "tests", viewing help, pinging, arp, and dhcp.\par
* Reset buttons when we load a new network.\par
* Added a bunch more puzzles\par
* Sometimes the remembered IP gets annoying when it remembers odd gateways and numbers we cannot change. Fixed that in many cases.\par
\b Version 1.0.0.8 05/25/2015\b0\par
* Always Start with level0 puzzles for now\par
* Fixed the icon when program running\par
* Added an infrastructure for Puzzles (needs work)\par
* Added a number of basic puzzles\par
* Fixed DHCP Leases. Now it clears leases when you change the DHCP server range.\par
\b Version 1.0.0.7 05/16/2015\b0\par
* Added file association so we can double-click an enbx file\par
* Fixed the icon so it looks right (removed left edge)\par
\b Version 1.0.0.6 05/16/2015\b0\par
* Able to delete a route (right click route and delete it)\par
* Add map title as something we can load/save\par
* Add message as something we can load and save\par
* Changing size of items affects all items\par
* Allow entering a hostname in the IP address field (ping / gateway)\par
\b Version 1.0.0.5 04/26/2015\b0\par
* Fixed ping from switch\par
* Fixed error message when pinging IP that does not exist\par
\b Version 1.0.0.4 04/26/2015\b0\par
* Fixed broadcast ping\par
*Fixed dhcp request error\par
\b Version 1.0.0.3 04/15/2015\par
\b0 * Added "file" -> "new" to erase and start a clean new network\par
* Fixed pc2 to have gateway on "solved"->"Two Networks"\par
* Fixed - only machines capable of doing DHCP do dhcp request if we do DHCP request on all\par
* Changed - major overhaul to tcp-stack.\par
* Downgrade - Arp temporarily removed from system while tcp-stack overhaul completed\par
\b Version 1.0.0.2 4/19/2015\b0\par
* Added IP-Phone\par
* Packets terminate at the far end - this makes it easier to see packets go both directions\par
* Packets are randomized in transit - Allows packets to arrive at slightly different times\par
\b Version 1.0.0.1 4/11/2015\b0\par
* DHCP selection on nics is not functioning correctly\par
* Various small bug-fixes\par
\b Version 1.0.0.0 4/10/2015\b0\par
This is the initial alpha build\par
* basic pinging\par
* basic arp\par
* Routers\par
* Switches/Hubs\par
* PCs/Laptops\par
* Network Links (ethernet)\par
* Basic DHCP\par
}
{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch31505\stshfloch31506\stshfhich31506\stshfbi0\deflang1033\deflangfe1033\themelang1033\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}
{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;}{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math;}
{\f39\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}
{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhimajor\f31502\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0302020204030204}Calibri Light;}
{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}
{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}
{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f40\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f41\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}
{\f43\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f44\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f45\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f46\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}
{\f47\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f48\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f60\fbidi \fmodern\fcharset238\fprq1 Courier New CE;}{\f61\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr;}
{\f63\fbidi \fmodern\fcharset161\fprq1 Courier New Greek;}{\f64\fbidi \fmodern\fcharset162\fprq1 Courier New Tur;}{\f65\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew);}{\f66\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic);}
{\f67\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic;}{\f68\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese);}{\f380\fbidi \froman\fcharset238\fprq2 Cambria Math CE;}{\f381\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr;}
{\f383\fbidi \froman\fcharset161\fprq2 Cambria Math Greek;}{\f384\fbidi \froman\fcharset162\fprq2 Cambria Math Tur;}{\f387\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic;}{\f388\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese);}
{\f430\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f431\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\f433\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f434\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}
{\f435\fbidi \fswiss\fcharset177\fprq2 Calibri (Hebrew);}{\f436\fbidi \fswiss\fcharset178\fprq2 Calibri (Arabic);}{\f437\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\f438\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}
{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}
{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}
{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}
{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}
{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}
{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhimajor\f31528\fbidi \fswiss\fcharset238\fprq2 Calibri Light CE;}{\fhimajor\f31529\fbidi \fswiss\fcharset204\fprq2 Calibri Light Cyr;}
{\fhimajor\f31531\fbidi \fswiss\fcharset161\fprq2 Calibri Light Greek;}{\fhimajor\f31532\fbidi \fswiss\fcharset162\fprq2 Calibri Light Tur;}{\fhimajor\f31533\fbidi \fswiss\fcharset177\fprq2 Calibri Light (Hebrew);}
{\fhimajor\f31534\fbidi \fswiss\fcharset178\fprq2 Calibri Light (Arabic);}{\fhimajor\f31535\fbidi \fswiss\fcharset186\fprq2 Calibri Light Baltic;}{\fhimajor\f31536\fbidi \fswiss\fcharset163\fprq2 Calibri Light (Vietnamese);}
{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}
{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}
{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}
{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}
{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}
{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}
{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}
{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}
{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}
{\fhiminor\f31573\fbidi \fswiss\fcharset177\fprq2 Calibri (Hebrew);}{\fhiminor\f31574\fbidi \fswiss\fcharset178\fprq2 Calibri (Arabic);}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}
{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}
{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}
{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}
{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;
\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\*\defchp \fs22\loch\af31506\hich\af31506\dbch\af31505 }{\*\defpap \ql \li0\ri0\sa160\sl259\slmult1
\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sa160\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0
\fs22\lang1033\langfe1033\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 \snext0 \sqformat \spriority0 Normal;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\*
\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa160\sl259\slmult1
\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1033\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 \snext11 \ssemihidden \sunhideused
Normal Table;}}{\*\listtable{\list\listtemplateid-678110632\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat4\levelspace0\levelindent0{\leveltext\leveltemplateid1569626406\'01\u-3913 ?;}{\levelnumbers;}
\loch\af3\hich\af3\dbch\af31505\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}
\f2\fbias0\hres0\chhres0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}
\f10\fbias0\hres0\chhres0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}
\f3\fbias0\hres0\chhres0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0
\fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0
\fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0
\fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\lin5760 }
{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\lin6480 }{\listname
;}\listid159203163}{\list\listtemplateid-103407058\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat0\levelspace0\levelindent0{\leveltext\leveltemplateid379213054\'01\u-3913 ?;}{\levelnumbers;}
\loch\af3\hich\af3\dbch\af31505\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}
\f2\fbias0\hres0\chhres0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}
\f10\fbias0\hres0\chhres0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}
\f3\fbias0\hres0\chhres0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0
\fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0
\fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0
\fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\lin5760 }
{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\lin6480 }{\listname
;}\listid237788805}{\list\listtemplateid-1448205776\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat4\levelspace0\levelindent0{\leveltext\leveltemplateid-1831819778\'01\u-3913 ?;}{\levelnumbers;}
\loch\af3\hich\af3\dbch\af31505\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}
\f2\fbias0\hres0\chhres0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}
\f10\fbias0\hres0\chhres0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}
\f3\fbias0\hres0\chhres0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0
\fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0
\fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0
\fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\lin5760 }
{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\lin6480 }{\listname
;}\listid272565942}{\list\listtemplateid951750322\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat0\levelspace0\levelindent0{\leveltext\leveltemplateid-557448562\'01\u-3913 ?;}{\levelnumbers;}
\loch\af3\hich\af3\dbch\af31505\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}
\f2\fbias0\hres0\chhres0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}
\f10\fbias0\hres0\chhres0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}
\f3\fbias0\hres0\chhres0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0
\fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0
\fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0
\fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\lin5760 }
{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\lin6480 }{\listname
;}\listid300036472}{\list\listtemplateid1850757320\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat4\levelspace0\levelindent0{\leveltext\leveltemplateid-1251324124\'01\u-3913 ?;}{\levelnumbers;}
\loch\af3\hich\af3\dbch\af31505\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}
\f2\fbias0\hres0\chhres0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}
\f10\fbias0\hres0\chhres0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}
\f3\fbias0\hres0\chhres0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0
\fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0
\fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0
\fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\lin5760 }
{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\lin6480 }{\listname
;}\listid569733219}{\list\listtemplateid1348617656\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat4\levelspace0\levelindent0{\leveltext\leveltemplateid-1331424806\'01\u-3913 ?;}{\levelnumbers;}
\loch\af3\hich\af3\dbch\af31505\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}
\f2\fbias0\hres0\chhres0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}
\f10\fbias0\hres0\chhres0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}
\f3\fbias0\hres0\chhres0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0
\fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0
\fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0
\fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\lin5760 }
{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\lin6480 }{\listname
;}\listid1059207521}{\list\listtemplateid-1653202988\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat0\levelspace0\levelindent0{\leveltext\leveltemplateid1996378994\'01\u-3913 ?;}{\levelnumbers;}
\loch\af3\hich\af3\dbch\af31505\fbias0\hres0\chhres0 \fi-360\li480\lin480 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}
\f2\fbias0\hres0\chhres0 \fi-360\li1200\lin1200 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}
\f10\fbias0\hres0\chhres0 \fi-360\li1920\lin1920 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}
\f3\fbias0\hres0\chhres0 \fi-360\li2640\lin2640 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0
\fi-360\li3360\lin3360 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0
\fi-360\li4080\lin4080 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0
\fi-360\li4800\lin4800 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5520\lin5520 }
{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6240\lin6240 }{\listname
;}\listid1164392343}{\list\listtemplateid1293564504\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat0\levelspace0\levelindent0{\leveltext\leveltemplateid-1614118322\'01\u-3913 ?;}{\levelnumbers;}
\loch\af3\hich\af3\dbch\af31505\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}
\f2\fbias0\hres0\chhres0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}
\f10\fbias0\hres0\chhres0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}
\f3\fbias0\hres0\chhres0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0
\fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0
\fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0
\fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\lin5760 }
{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\lin6480 }{\listname
;}\listid1272543532}{\list\listtemplateid-884542874\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat0\levelspace0\levelindent0{\leveltext\leveltemplateid-1963024970\'01\u-3913 ?;}{\levelnumbers;}
\loch\af3\hich\af3\dbch\af31505\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}
\f2\fbias0\hres0\chhres0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}
\f10\fbias0\hres0\chhres0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}
\f3\fbias0\hres0\chhres0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0
\fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0
\fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0
\fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\lin5760 }
{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\lin6480 }{\listname
;}\listid1332484604}{\list\listtemplateid-308776008\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat0\levelspace0\levelindent0{\leveltext\leveltemplateid142246634\'01\u-3913 ?;}{\levelnumbers;}
\loch\af3\hich\af3\dbch\af31505\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}
\f2\fbias0\hres0\chhres0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}
\f10\fbias0\hres0\chhres0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}
\f3\fbias0\hres0\chhres0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0
\fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0
\fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0
\fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\lin5760 }
{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\lin6480 }{\listname
;}\listid1436513145}{\list\listtemplateid711852752\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat0\levelspace0\levelindent0{\leveltext\leveltemplateid1548498794\'01\u-3913 ?;}{\levelnumbers;}
\loch\af3\hich\af3\dbch\af31505\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}
\f2\fbias0\hres0\chhres0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}
\f10\fbias0\hres0\chhres0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}
\f3\fbias0\hres0\chhres0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0
\fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0
\fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0
\fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\lin5760 }
{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\lin6480 }{\listname
;}\listid1535926840}{\list\listtemplateid96765656\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat0\levelspace0\levelindent0{\leveltext\leveltemplateid-2137615088\'01\u-3913 ?;}{\levelnumbers;}
\loch\af3\hich\af3\dbch\af31505\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}
\f2\fbias0\hres0\chhres0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}
\f10\fbias0\hres0\chhres0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}
\f3\fbias0\hres0\chhres0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0
\fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0
\fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0
\fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\lin5760 }
{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\lin6480 }{\listname
;}\listid1574776731}{\list\listtemplateid-898045548\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat0\levelspace0\levelindent0{\leveltext\leveltemplateid-212272924\'01\u-3913 ?;}{\levelnumbers;}
\loch\af3\hich\af3\dbch\af31505\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}
\f2\fbias0\hres0\chhres0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}
\f10\fbias0\hres0\chhres0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}
\f3\fbias0\hres0\chhres0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0
\fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0
\fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0
\fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\lin5760 }
{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\lin6480 }{\listname
;}\listid1668097324}{\list\listtemplateid-496706588\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat0\levelspace0\levelindent0{\leveltext\leveltemplateid-34189396\'01\u-3913 ?;}{\levelnumbers;}
\loch\af3\hich\af3\dbch\af31505\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}
\f2\fbias0\hres0\chhres0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}
\f10\fbias0\hres0\chhres0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}
\f3\fbias0\hres0\chhres0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0
\fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0
\fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0
\fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\lin5760 }
{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\lin6480 }{\listname
;}\listid1729453556}{\list\listtemplateid1472331976\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat0\levelspace0\levelindent0{\leveltext\leveltemplateid-1529854154\'01\u-3913 ?;}{\levelnumbers;}
\loch\af3\hich\af3\dbch\af31505\fbias0\hres0\chhres0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}
\f2\fbias0\hres0\chhres0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}
\f10\fbias0\hres0\chhres0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}
\f3\fbias0\hres0\chhres0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0
\fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0
\fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698689\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0
\fi-360\li5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698691\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\lin5760 }
{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67698693\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\lin6480 }{\listname
;}\listid1903905976}}{\*\listoverridetable{\listoverride\listid300036472\listoverridecount0\ls1}{\listoverride\listid1535926840\listoverridecount0\ls2}{\listoverride\listid569733219\listoverridecount0\ls3}{\listoverride\listid1059207521
\listoverridecount0\ls4}{\listoverride\listid159203163\listoverridecount0\ls5}{\listoverride\listid272565942\listoverridecount0\ls6}{\listoverride\listid1574776731\listoverridecount0\ls7}{\listoverride\listid1332484604\listoverridecount0\ls8}
{\listoverride\listid237788805\listoverridecount0\ls9}{\listoverride\listid1164392343\listoverridecount0\ls10}{\listoverride\listid1272543532\listoverridecount0\ls11}{\listoverride\listid1729453556\listoverridecount0\ls12}{\listoverride\listid1903905976
\listoverridecount0\ls13}{\listoverride\listid1436513145\listoverridecount0\ls14}{\listoverride\listid1668097324\listoverridecount0\ls15}}{\*\rsidtbl \rsid935579\rsid1715044\rsid2361093\rsid2634409\rsid3230122\rsid3738219\rsid3953182\rsid3954092
\rsid4002608\rsid4014997\rsid4148115\rsid4201155\rsid4330009\rsid4674322\rsid4984628\rsid4995504\rsid5902490\rsid6243721\rsid6709067\rsid7014465\rsid7089617\rsid7091827\rsid7425313\rsid7431196\rsid7475506\rsid8135144\rsid8154512\rsid8807737\rsid8871995
\rsid9005806\rsid9076344\rsid9125153\rsid9187300\rsid9664289\rsid10361403\rsid11235612\rsid11358317\rsid11886434\rsid12019296\rsid12193239\rsid12329139\rsid12389542\rsid12613072\rsid12727249\rsid12727595\rsid12738045\rsid13122645\rsid13307397\rsid13454907
\rsid13783353\rsid13982156\rsid14170698\rsid14353560\rsid14427571\rsid14508595\rsid14577306\rsid14746156\rsid14829014\rsid15677065\rsid15949156\rsid16005564\rsid16457871}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0
\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim0}{\info{\operator tim.young@lightsys.org}{\creatim\yr2017\mo3\dy14\hr9\min58}{\revtim\yr2019\mo1\dy23\hr8\min23}{\version62}{\edmins74}{\nofpages13}{\nofwords3262}{\nofchars15042}{\nofcharsws17946}{\vern95}}
{\*\userprops {\propname amzn:id}\proptype30{\staticval 5d8f9aa3-7362-4e9d-ad7a-41823ad84e09}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\paperw12240\paperh15840\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect
\widowctrl\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata1\grfdocevents0\validatexml0\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors0\horzdoc\dghspace120\dgvspace120\dghorigin1701
\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind1\viewscale100\rsidroot14577306 \nouicompat \fet0{\*\wgrffmtfilter 2450}\nofeaturethrottle1\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\*\pnseclvl1
\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5
\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang
{\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid13982156 \rtlch\fcs1 \af0\afs22\alang1025
\ltrch\fcs0 \fs22\lang1033\langfe1033\loch\af31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid4330009 \hich\af39\dbch\af31505\loch\f39 Version 1.0.51
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12613072\charrsid12613072 \hich\af39\dbch\af31505\loch\f39 * }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12613072 \hich\af39\dbch\af31505\loch\f39
Added small \hich\af39\dbch\af31505\loch\f39 time-based delay when printing packets; on fast computers the pa\hich\af39\dbch\af31505\loch\f39 ckets would fly by too fast.}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0
\f39\lang9\langfe1033\langnp9\insrsid12613072\charrsid12613072
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid13982156 \hich\af39\dbch\af31505\loch\f39 Version 1.0.50
\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid10361403 {\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid10361403\charrsid10361403 \hich\af39\dbch\af31505\loch\f39 *}{
\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid10361403 \hich\af39\dbch\af31505\loch\f39 Added regression testing for making sure we do not break things while making changes to the UI or how the system works.
\par \hich\af39\dbch\af31505\loch\f39 * Added regression tests for most all the networks
\par \hich\af39\dbch\af31505\loch\f39 * Able to change gateway if the primary network connection does not have DHCP. Ther\hich\af39\dbch\af31505\loch\f39 e was an issue with a puzzle because of this.
\par \hich\af39\dbch\af31505\loch\f39 * Do not check firewall rules if the firewall checkmark is turned off. You can disable the firewall rules by turning off the firewall.
\par \hich\af39\dbch\af31505\loch\f39 * Get the reload button working properly. You can reload a puzzle and it \hich\af39\dbch\af31505\loch\f39 will reset to its original state.
\par \hich\af39\dbch\af31505\loch\f39 * Better listing of puzzles and highlighting the next puzzle to do.
\par \hich\af39\dbch\af31505\loch\f39 * When resetting a switch, reset the vlans on that switch. Somewhere this broke and we needed to put it back.
\par \hich\af39\dbch\af31505\loch\f39 * Added some action debugging. No impact o\hich\af39\dbch\af31505\loch\f39 n users, just developers.
\par \hich\af39\dbch\af31505\loch\f39 * Better processing of wireless link autojoin}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid10361403\charrsid10361403
\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid6709067 {\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid11886434 \hich\af39\dbch\af31505\loch\f39 Version 1.0.49}{\rtlch\fcs1
\ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid6709067
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid11886434\charrsid11886434 \hich\af39\dbch\af31505\loch\f39 * Change level1_practice5.}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid11886434
\hich\af39\dbch\af31505\loch\f39 It had been a puzzle with two DHCP servers, but we have not taught that concept yet. I change it so the DHCP server was passing out bad DHCP\hich\af39\dbch\af31505\loch\f39 . IPs already exist.
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid7014465 \hich\af39\dbch\af31505\loch\f39 \hich\f39 * Fixed a few bugs in other \'93\loch\f39 \hich\f39 practice\'94\loch\f39 levels.
\par \hich\af39\dbch\af31505\loch\f39 \hich\f39 * Made a test for a network loop. So we can have a \'93\loch\f39 \hich\f39 ping without looping\'94\loch\f39 test. So we need to have a successful ping that does not cause a network loop.
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid935579 \hich\af39\dbch\af31505\loch\f39 * Fixed an issue with wireless b\hich\af39\dbch\af31505\loch\f39
ridges. They were routing packets instead of forwarding packets, which broke them in a few instances.
\par \hich\af39\dbch\af31505\loch\f39 * Make it so a NIC can spray. It creates bad packets that just keep coming.}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12738045
\par \hich\af39\dbch\af31505\loch\f39 * Fix some issues with wireless links. Some puzzles had saved multiple wire\hich\af39\dbch\af31505\loch\f39
less links to the same device, which ended up having some rather bizarre issues. Since all wireless links are rebuilt on load, I made it so none of the wireless links are saved, and if they are loaded, they are discarded. It solved a number of issues.}{
\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid7014465 \hich\af39\dbch\af31505\loch\f39 }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid7014465\charrsid11886434
\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid11886434 {\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid11886434 \hich\af39\dbch\af31505\loch\f39 V
\hich\af39\dbch\af31505\loch\f39 ersion 1.0.48
\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid6709067 {\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid4002608\charrsid4002608 \hich\af39\dbch\af31505\loch\f39
* Fix a traversal class not serializable error}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid4002608
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid15949156 \hich\af39\dbch\af31505\loch\f39 * Close the file -> load toolstrip menu after a load. It had remained annoyingly open.
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid11358317 \hich\af39\dbch\af31505\loch\f39 \hich\f39 * Added a bunch of \'93\loch\f39 \hich\f39 practice\'94\hich\af39\dbch\af31505\loch\f39
puzzles. These are for practicing troubleshooting. They do not give you a lot of information about what the problem is; you need to do a bit more testing and trying things to figure them out.
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid2634409 \hich\af39\dbch\af31505\loch\f39 * Added a bunch of level5 practice puzzles. More physical ne\hich\af39\dbch\af31505\loch\f39 tworking and wireless than routing issues.
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid3953182 \hich\af39\dbch\af31505\loch\f39 * Added the solved versions of the office networks. One with wireless linking between them, and the other having physical wires.}{
\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid3953182\charrsid4002608
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid6709067 \hich\af39\dbch\af31505\loch\f39 Version 1.0.47
\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid3738219 {\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid8807737\charrsid8807737 \hich\af39\dbch\af31505\loch\f39 * YAY!}{
\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid8807737 \hich\af39\dbch\af31505\loch\f39 The long-awaited ctrl-z / ctrl-y works. Undo / redo.}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0
\f39\lang9\langfe1033\langnp9\insrsid8807737\charrsid8807737
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid1715044\charrsid1715044 \hich\af39\dbch\af31505\loch\f39 *}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid1715044 \hich\af39\dbch\af31505\loch\f39
Lock a device to a location
\par \hich\af39\dbch\af31505\loch\f39 * Add a tree. Wireless packets cannot go through a tree.
\par \hich\af39\dbch\af31505\loch\f39 * Add background shapes. So we can draw a building and have understandable line of sight.
\par \hich\af39\dbch\af31505\loch\f39 * Add a wireless line of sight puzzle.
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid7091827 \hich\af39\dbch\af31505\loch\f39 * Went through old puzzles and locked s\hich\af39\dbch\af31505\loch\f39
ome items in their locations. Makes some puzzles need to be solved the way the puzzle was intended to be solved.}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid7091827\charrsid1715044
\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid8154512 {\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid8154512 \hich\af39\dbch\af31505\loch\f39 Version 1.0.46
\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid3738219 {\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid3738219 \hich\af39\dbch\af31505\loch\f39
* Added a frozen device. Fix it with a reboot. (power off / power on)
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid14427571 \hich\af39\dbch\af31505\loch\f39 * Added a bad power-supply (device catches fire when powered on. Need to replace the device to fix)
\par \hich\af39\dbch\af31505\loch\f39 * Added bad electricity. (device continues to catch fire, even after being replaced, until a UPS is added)
\par \hich\af39\dbch\af31505\loch\f39 * Can right-c}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid7425313 \hich\af39\dbch\af31505\loch\f39 lick a network wire. Delete, }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0
\f39\lang9\langfe1033\langnp9\insrsid14427571 \hich\af39\dbch\af31505\loch\f39 edit}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid7425313 ,\hich\af39\dbch\af31505\loch\f39 replace}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0
\f39\lang9\langfe1033\langnp9\insrsid14427571 .
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid14746156 \hich\af39\dbch\af31505\loch\f39 * Added frozen device, bad power-supply and Needs UPS as ways to randomly break networks.
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid13122645 \hich\af39\dbch\af31505\loch\f39 * Optimize the redrawing of the screen packets. Speeded it up considerably
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid13783353 \hich\af39\dbch\af31505\loch\f39 * Add puzzles for frozen device, bad power-supply, and needs a UPS.}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0
\f39\lang9\langfe1033\langnp9\insrsid13783353\charrsid9005806
\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid9005806 {\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid9005806 \hich\af39\dbch\af31505\loch\f39 Version 1.0.
\hich\af39\dbch\af31505\loch\f39 45
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid9005806\charrsid9005806 \hich\af39\dbch\af31505\loch\f39 *}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid9005806 \hich\af39\dbch\af31505\loch\f39 }{
\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid9005806\charrsid9005806 \hich\af39\dbch\af31505\loch\f39 More infrastructure for translating the main program}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0
\f39\lang9\langfe1033\langnp9\insrsid9005806
\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid5902490 {\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid5902490 \hich\af39\dbch\af31505\loch\f39 Version 1.0.44
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid5902490\charrsid5902490 \hich\af39\dbch\af31505\loch\f39 *}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid5902490 \hich\af39\dbch\af31505\loch\f39
Added ability to add a video URL to a help topic
\par \hich\af39\dbch\af31505\loch\f39 * Added video URL for individual puzzles
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid2361093 \hich\af39\dbch\af31505\loch\f39 * Added some initial videos
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid14508595 \hich\af39\dbch\af31505\loch\f39 * More work on translation window}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12329139
\hich\af39\dbch\af31505\loch\f39 (most people\hich\af39\dbch\af31505\loch\f39 will not see this)}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid14508595
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12329139 \hich\af39\dbch\af31505\loch\f39 * Fix order of help-level radio-buttons.
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid8135144 \hich\af39\dbch\af31505\loch\f39 * Some puzzles are properly translated to French}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0
\f39\lang9\langfe1033\langnp9\insrsid8135144\charrsid5902490
\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid9076344 {\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid9076344 \hich\af39\dbch\af31505\loch\f39 Version 1.0.43
\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid13307397 {\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid13307397 \hich\af39\dbch\af31505\loch\f39 * }{\rtlch\fcs1 \ab\af39
\ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid9076344\charrsid9076344 \hich\af39\dbch\af31505\loch\f39 Added }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid9076344 \hich\af39\dbch\af31505\loch\f39 the title }{\rtlch\fcs1
\ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid9076344\charrsid9076344 \hich\af39\dbch\af31505\loch\f39 to the translation window}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid9076344 \hich\af39\dbch\af31505\loch\f39
. Puzzle titles can now be translated.
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid6243721 \hich\af39\dbch\af31505\loch\f39 * Use the translated titles for the puzzle names\hich\af39\dbch\af31505\loch\f39 on the puzzle selection box}{\rtlch\fcs1 \ab\af39
\ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid6243721\charrsid9076344
\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid4148115 {\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid14829014 \hich\af39\dbch\af31505\loch\f39 Version 1.0.42
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid14829014\charrsid14829014 \hich\af39\dbch\af31505\loch\f39 * Fixed some bugs with working in French}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid14829014
\hich\af39\dbch\af31505\loch\f39 \hich\f39 \endash \loch\f39 puzzles would not show
\par \hich\af39\dbch\af31505\loch\f39 * Fixed bug in French \hich\f39 \endash \loch\f39 \hich\f39 \'93\loch\f39 \hich\f39 Ping to\'94\loch\f39 would not work
\par \hich\af39\dbch\af31505\loch\f39 * Added a translation box when working on puzzles\hich\af39\dbch\af31505\loch\f39
. Ctrl-click the network message in the options window to pull up a translation box. Look at two languages simultaneously. Has save button to save your changes from there.}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0
\f39\lang9\langfe1033\langnp9\insrsid14829014\charrsid14829014
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid4148115 \hich\af39\dbch\af31505\loch\f39 Version 1.0.41
\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid14353560 {\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid14353560 \hich\af39\dbch\af31505\loch\f39
* Have the ability to randomly break a network. If you want to ju\hich\af39\dbch\af31505\loch\f39 st test your brain for fun, or if you are a teacher and just want to generate some homework of some sort. This can help.}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0
\f39\lang9\langfe1033\langnp9\insrsid14353560\charrsid4148115
\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid9664289 {\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid4148115\charrsid4148115 \hich\af39\dbch\af31505\loch\f39 * }{\rtlch\fcs1
\ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid4148115 \hich\af39\dbch\af31505\loch\f39 Added another solved }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12193239 \hich\af39\dbch\af31505\loch\f39 network (Internet}{
\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid14353560 \hich\af39\dbch\af31505\loch\f39 HomeAndOffice}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12193239 \hich\af39\dbch\af31505\loch\f39 )}{\rtlch\fcs1
\ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid4148115
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid4674322 \hich\af39\dbch\af31505\loch\f39 * Give us more options for viewing text under devices. This lets us see things\hich\af39\dbch\af31505\loch\f39 much more cleanly.
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12389542 \hich\af39\dbch\af31505\loch\f39 * Allow different captioning systems. Hostname only, IP only, host + IP, none, full
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid7089617 \hich\af39\dbch\af31505\loch\f39
* firewall rules can now affect VPN traffic. You can block from a VPN to the office VLAN, for example. Also, can block guest VLAN from pinging someth\hich\af39\dbch\af31505\loch\f39 ing across the VPN.
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid4984628 \hich\af39\dbch\af31505\loch\f39 Version 1.0.40
\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid4984628 {\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid4984628 \hich\af39\dbch\af31505\loch\f39
* Jumping ahead version numbers. Adding Educational Mode (see doc on the wiki for a description of the basic functionality added) }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid4984628\charrsid4984628
\hich\af39\dbch\af31505\loch\f39 https://git.solidcharity.com/timy/EduNetworkBuilder/wikis/Teacherdoc}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid4984628
\par \hich\af39\dbch\af31505\loch\f39 * Added the ability to make msi files for better deployment in multi-user settings
\par \hich\af39\dbch\af31505\loch\f39 * Adjusted drag functionality so we do not jostle devices around accidentally
\par \hich\af39\dbch\af31505\loch\f39 * Fixed bug when trying to ping wireless devices by name
\par \hich\af39\dbch\af31505\loch\f39 * Fixed a bug pinging 0.0.0.0
\par \hich\af39\dbch\af31505\loch\f39 * Fixed \hich\af39\dbch\af31505\loch\f39 lots of other bugs}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid4984628\charrsid4984628
\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid9664289 {\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid13454907 \hich\af39\dbch\af31505\loch\f39 Version 1.0.33}{\rtlch\fcs1
\ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid9664289
\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid14170698 {\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid3954092 \hich\af39\dbch\af31505\loch\f39
* Fixed a major bug in settings that would blow up new installs.
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid9664289\charrsid9664289 \hich\af39\dbch\af31505\loch\f39 *}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid9664289 \hich\af39\dbch\af31505\loch\f39 \hich\f39
ctrl-right-click a device to add \'93\loch\f39 \hich\f39 hide\'94\loch\f39 to the context menu.
\par \hich\af39\dbch\af31505\loch\f39 * From the puzzle menu you can ctrl-alt click items to mark them as solved.
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid16457871 \hich\af39\dbch\af31505\loch\f39 *}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid9125153 \hich\af39\dbch\af31505\loch\f39 }{\rtlch\fcs1 \ab\af39
\ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid16457871 \hich\af39\dbch\af31505\loch\f39 Display bad subn\hich\af39\dbch\af31505\loch\f39 et masks (that cannot be displayed using CIDR notation) as /?
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid9125153 \hich\af39\dbch\af31505\loch\f39 \hich\f39
* Allow pings from devices that are locked. A bug made it so we could not change the address we wanted to ping to; all ip-addresses were locked, even a \'93\loch\f39 \hich\f39 ping to\'94\loch\f39 address.
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12727249 \hich\af39\dbch\af31505\loch\f39 * Minor bug: If we pin\hich\af39\dbch\af31505\loch\f39
g a local IP that does not exist, the error message we were getting was the wrong error message. Fixed that.
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid4995504 \hich\af39\dbch\af31505\loch\f39 * When wireless device is powered off, remove all wireless links. Links connected to WLAN had been reconnected. Fixed that.
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid11235612 \hich\af39\dbch\af31505\loch\f39 * Cannot go into the\hich\af39\dbch\af31505\loch\f39 \hich\f39
network options if we have loaded the network from resources. This way we cannot \'93\loch\f39 \hich\f39 cheat\'94\loch\f39
by changing the network options. This is in preparation for setting this up for school use. Making it harder for students to cheat on homework assignments.}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid11235612\charrsid9664289
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid14170698 \hich\af39\dbch\af31505\loch\f39 Version\hich\af39\dbch\af31505\loch\f39 1.0.32
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid14170698\charrsid14170698 \hich\af39\dbch\af31505\loch\f39 *}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid14170698 \hich\af39\dbch\af31505\loch\f39
Allow dragging of items
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12727595 \hich\af39\dbch\af31505\loch\f39 * Select multiple items for dragging by using a nice big drag-box.}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0
\f39\lang9\langfe1033\langnp9\insrsid14170698
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12727595 \hich\af39\dbch\af31505\loch\f39 * Highlight the multiple items if selecting them
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid15677065 \hich\af39\dbch\af31505\loch\f39 * Allow the ESC key to clear the selected items.
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid16005564 \hich\af39\dbch\af31505\loch\f39 * Can right-click and delete of multiple selected items
\par \hich\af39\dbch\af31505\loch\f39 *\hich\af39\dbch\af31505\loch\f39 Can right-click and change color of multiple selected items
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid8871995 \hich\af39\dbch\af31505\loch\f39 * Fixed some tracert bugs
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid7431196 \hich\af39\dbch\af31505\loch\f39 * lots of minor fixes so is more stable on Linux
\par \hich\af39\dbch\af31505\loch\f39 * Saves settings in ~/.conf/EduNetworkbuilder_config.xml file on Linux
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid7475506 \hich\af39\dbch\af31505\loch\f39 * Cannot edit something that is powered off. Also, cannot ping, do DHCP refresh, etc.
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid4201155 \hich\af39\dbch\af31505\loch\f39 * Fixed losing the VPN password changes when editing VPN Info.
\par \hich\af39\dbch\af31505\loch\f39 * Fixed anchoring of puzzle filter box.
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid3230122 \hich\af39\dbch\af31505\loch\f39 * Added invisible items. Forgotten switches and unseen network wi\hich\af39\dbch\af31505\loch\f39
res. Right now, the only way to make something hidden is by editing the file and saying <invisible>true</invisible> on it.}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid3230122\charrsid14170698
\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid14577306 \hich\af39\dbch\af31505\loch\f39 Version 1.0.31
\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid14577306 {\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid14577306\charrsid14577306 \hich\af39\dbch\af31505\loch\f39 *}{
\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid14577306 \hich\af39\dbch\af31505\loch\f39 Added powering off switches, routers, and the like
\par \hich\af39\dbch\af31505\loch\f39 * Added traceroute
\par \hich\af39\dbch\af31505\loch\f39 * Added a few puzzles for those
\par \hich\af39\dbch\af31505\loch\f39 * Moved to a new git repository
\par \hich\af39\dbch\af31505\loch\f39 * Changed the default location of popups. They worked very strange in a multi-window environment.}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid14577306\charrsid14577306
\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 Version 1.0.30
\par }{\rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 * Another downloadable (zip only, stable) version.}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid12019296
\par \hich\af39\dbch\af31505\loch\f39 Version 1.0.29
\par }{\rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 * Lots of VLAN butfixes
\par \hich\af39\dbch\af31505\loch\f39 * Fixed ping-fail te\hich\af39\dbch\af31505\loch\f39 st
\par \hich\af39\dbch\af31505\loch\f39 * Lots more VLAN puzzles
\par \hich\af39\dbch\af31505\loch\f39 * Update VLAN documentation
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 Version 1.0.28
\par }{\rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 * Initial VLAN release
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 Version 1.0.27
\par }{\rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 * Made distribution easier by CD (does updates from web, but we also have a downloadable zip you can install from)
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 Version 1.0.26
\par }{\rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 * Major graphics \hich\af39\dbch\af31505\loch\f39 overhaul
\par \hich\af39\dbch\af31505\loch\f39 - Packets move on timer
\par \hich\af39\dbch\af31505\loch\f39 - Graphics drawn "smarter"
\par \hich\af39\dbch\af31505\loch\f39 - Result is that things flow smoother. Loopback2 also works much nicer.
\par \hich\af39\dbch\af31505\loch\f39 * Fixed minor issue with "help" puzzle
\par \hich\af39\dbch\af31505\loch\f39 * Made help "?" button turn red when it is part of the puzzle
\par \hich\af39\dbch\af31505\loch\f39 * Put checkmark\hich\af39\dbch\af31505\loch\f39 to display names and IPs of devices on front form.
\par \hich\af39\dbch\af31505\loch\f39 * Add a NetTest to show people to click on the "display Device names and IP" checkmark}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid12019296
\par \hich\af39\dbch\af31505\loch\f39 Version 1.0.25
\par }{\rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 * Minor changes to help file
\par \hich\af39\dbch\af31505\loch\f39 * Fixed size of labels on IP-Address editor box
\par \hich\af39\dbch\af31505\loch\f39 * Hide gateway label when\hich\af39\dbch\af31505\loch\f39 we do not need it. (ip-address editor)
\par \hich\af39\dbch\af31505\loch\f39 * rename "mixed network" puzzle to be "adding devices" (the puzzle was about adding devices)
\par \hich\af39\dbch\af31505\loch\f39 * Changed layout of many messages
\par \hich\af39\dbch\af31505\loch\f39 * Save the level we are working on. Allows us to finish level 5 before level 3 if we wan\hich\af39\dbch\af31505\loch\f39 t to.
\par \hich\af39\dbch\af31505\loch\f39 * Make network-loop puzzles sit next to each-other
\par \hich\af39\dbch\af31505\loch\f39 * Make it so network-loop2 puzzle asks for second ping after first one finishes
\par \hich\af39\dbch\af31505\loch\f39 * Lots of work towards the French translation}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid12019296
\par \hich\af39\dbch\af31505\loch\f39 Version 1.0.24
\par }{\rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 * Add sound when ctrl-s is pressed so we know we saved.
\par \hich\af39\dbch\af31505\loch\f39 * Add sound fail when save is canceled (will use it later if ctrl-s fails)
\par \hich\af39\dbch\af31505\loch\f39 * Added some wireless puzzles
\par \hich\af39\dbch\af31505\loch\f39 * Fix issue with WAP not forwarding packets correctly
\par \hich\af39\dbch\af31505\loch\f39 * Clear out old status message if we do something. So we do not say "saved" forever...
\par \hich\af39\dbch\af31505\loch\f39 * Fixed\hich\af39\dbch\af31505\loch\f39 bad gateway on wireless router issue
\par \hich\af39\dbch\af31505\loch\f39 * Fixed wbridge misbehaving. (issue with gateway)
\par \hich\af39\dbch\af31505\loch\f39 * Added wireless items to help and context help topics
\par \hich\af39\dbch\af31505\loch\f39 * Thanks to Peter Wilson for so much of the translation backbone.
\par \hich\af39\dbch\af31505\loch\f39 * Lots of translation string changes. The Fren\hich\af39\dbch\af31505\loch\f39 ch translation should be soon in coming.
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 Version 1.0.23 09/20/2015
\par }{\rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 * Fixed issues with broadcast packets
\par \hich\af39\dbch\af31505\loch\f39 * Fixed a network loop issue
\par \hich\af39\dbch\af31505\loch\f39 * Fixed issue with multiple interfaces and being able to go out a different interface than we came in on
\par \hich\af39\dbch\af31505\loch\f39 * Fixed many sm\hich\af39\dbch\af31505\loch\f39 all bugs that crept in when fixing other bugs. Now all puzzles seem to play correctly}{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid12019296
\par \hich\af39\dbch\af31505\loch\f39 Version 1.0.22 09/01/2015}{\rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12019296
\par \hich\af39\dbch\af31505\loch\f39 * Added ssid and keys for wireless links
\par \hich\af39\dbch\af31505\loch\f39 * Wireless will auto-disconnect if link is too long
\par \hich\af39\dbch\af31505\loch\f39 * Wireless will auto-connect if ssid and key matc\hich\af39\dbch\af31505\loch\f39 h, if link is short enough
\par \hich\af39\dbch\af31505\loch\f39 * Packets will drop on wireless links if distance is too great
\par \hich\af39\dbch\af31505\loch\f39 * wport has no interface (cannot edit IP address)
\par \hich\af39\dbch\af31505\loch\f39 * wireless router works properly - forwards broadcast packets
\par \hich\af39\dbch\af31505\loch\f39 * wireless router handles dhcp requests properly (both\hich\af39\dbch\af31505\loch\f39 responds to it but also passes it on)
\par \hich\af39\dbch\af31505\loch\f39 * right-clicking light and microwave no longer has ping, arp, edit, and other context menus
\par \hich\af39\dbch\af31505\loch\f39 * added net-test for DHCP server status (on/off)
\par \hich\af39\dbch\af31505\loch\f39 * If multiple DHCP servers, client randomly chooses which to keep.
\par \hich\af39\dbch\af31505\loch\f39 *Add Wire\hich\af39\dbch\af31505\loch\f39 less Puzzle
\par \hich\af39\dbch\af31505\loch\f39 *Fix many wireless device bugs\line }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 Version 1.0.21 08/15/2015}{\rtlch\fcs1 \af39 \ltrch\fcs0
\f39\lang9\langfe1033\langnp9\insrsid12019296
\par \hich\af39\dbch\af31505\loch\f39 * Added a microwave and fluorescent light. They corrupt data when packets run close to them.
\par \hich\af39\dbch\af31505\loch\f39 * Added some packet corruption puzzles
\par \hich\af39\dbch\af31505\loch\f39 * Fixed window resize-on-load issue where the help w\hich\af39\dbch\af31505\loch\f39 indow popped up first, then the builder window resized over to hide the help window.
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 Version 1.0.20 08/12/2015}{\rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12019296
\par \hich\af39\dbch\af31505\loch\f39 * wports do not display on tooltips or when printing the device info
\par \hich\af39\dbch\af31505\loch\f39 * Added ctrl-s to quick-save a network we are working on
\par \hich\af39\dbch\af31505\loch\f39 * commented out w\hich\af39\dbch\af31505\loch\f39 ireless devices for now - doing a big demo and wireless is not yet complete
\par \hich\af39\dbch\af31505\loch\f39 * added search box to help
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 Version 1.0.19 08/08/2015}{\rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12019296
\par \hich\af39\dbch\af31505\loch\f39 *Updated context help for most puzzles that introduce new ideas.
\par \hich\af39\dbch\af31505\loch\f39 * Sorted Help topics when adding them in net-tests.
\par \hich\af39\dbch\af31505\loch\f39 * Added some images to the help to help clarify things.
\par \hich\af39\dbch\af31505\loch\f39 * Start with the help windows being the same "height" as the network window.
\par \hich\af39\dbch\af31505\loch\f39 * Open Help so it can be kept open while the puzzles progress.
\par \hich\af39\dbch\af31505\loch\f39 * Deal with minimized state better (used to shrink window to\hich\af39\dbch\af31505\loch\f39 smallest possible state)
\par \hich\af39\dbch\af31505\loch\f39 * Remember size and location of main window between uses.
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 Version 1.0.18 08/08/2015}{\rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12019296
\par \hich\af39\dbch\af31505\loch\f39 * Added Context Help for puzzles.
\par \hich\af39\dbch\af31505\loch\f39 - Each puzzle can have context help
\par \hich\af39\dbch\af31505\loch\f39 - There is a net-test to have us read help
\par \hich\af39\dbch\af31505\loch\f39 * fixed minor problem with a "\hich\af39\dbch\af31505\loch\f39 ding" sound when we load a puzzle that has something locked.
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 Version 1.0.17 08/01/2015}{\rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12019296
\par \hich\af39\dbch\af31505\loch\f39 * Added more help
\par \hich\af39\dbch\af31505\loch\f39 * Much progress made in preparing for a French translation
\par \hich\af39\dbch\af31505\loch\f39 * allow for Puzzle's description to be in another language
\par \hich\af39\dbch\af31505\loch\f39 * Added more to help
\par \hich\af39\dbch\af31505\loch\f39 * Removed e\hich\af39\dbch\af31505\loch\f39 dit -> cut, paste, copy, undo. They never did anything. So why have them?
\par \hich\af39\dbch\af31505\loch\f39 * Save box starts in the directory of the file we opened (if we have one)
\par \hich\af39\dbch\af31505\loch\f39 * Choose a language at startup if one has never been chosen, and have option to change language.
\par \hich\af39\dbch\af31505\loch\f39 * Added a\hich\af39\dbch\af31505\loch\f39 nother puzzle, showing what happens (or does not happen) if we have two networks that use the same IP addresses, and we want to build a VPN between them.
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 Version 1.0.16 07/18/2015}{\rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12019296
\par \hich\af39\dbch\af31505\loch\f39 * Added ability to break links (bad network wire)
\par \hich\af39\dbch\af31505\loch\f39 * "connection lights" on \hich\af39\dbch\af31505\loch\f39 network cards / ports when we edit devices
\par \hich\af39\dbch\af31505\loch\f39 * Test for "needs link to" does not succeed if the link in question is a broken link
\par \hich\af39\dbch\af31505\loch\f39 * Added a puzzle to show you how to find broken links
\par \hich\af39\dbch\af31505\loch\f39 * Used broken links in other puzzles
\par \hich\af39\dbch\af31505\loch\f39 * Fixed bug: switches could not use \hich\af39\dbch\af31505\loch\f39 DHCP for many different reasons. Now it works for them.
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 Version 1.0.15 07/11/2015}{\rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12019296
\par \hich\af39\dbch\af31505\loch\f39 * Added ping time progress bar
\par \hich\af39\dbch\af31505\loch\f39 * Fixed issue with things timing out before they c\hich\af39\dbch\af31505\loch\f39
ompleted. If the network screen is too large, it makes it go just a tiny bit slower and various things would fail. When the first packet successfully makes it to the far end, it recomputes the time needed and gives extra time.
\par \hich\af39\dbch\af31505\loch\f39 * Added context menu ping. \hich\af39\dbch\af31505\loch\f39 If an item is supposed to ping something, right-clicking adds the ping test to the menu. Takes some of the guess-work out of things.
\par \hich\af39\dbch\af31505\loch\f39 * Fixed minor issue with this change log. Had two 1.0.11 versions & somehow was stating we were at version 10.x.x instea\hich\af39\dbch\af31505\loch\f39 d of 1.x.x (sigh)
\par \hich\af39\dbch\af31505\loch\f39 * Fixed the VPNify puzzle. Had a goof in it.
\par \hich\af39\dbch\af31505\loch\f39 * Made it so you cannot connect a link to a VPN. A VPN should be a virtual connection, not a physical connection.
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 Version 1.0.14 07/10/2015}{\rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12019296
\par \hich\af39\dbch\af31505\loch\f39 * When we finish a puzzle, allow us to auto-open\hich\af39\dbch\af31505\loch\f39 the "next puzzle" box.
\par \hich\af39\dbch\af31505\loch\f39 * Added lots more puzzles
\par \hich\af39\dbch\af31505\loch\f39 * Added more help & documentation
\par \hich\af39\dbch\af31505\loch\f39 * Made it so test for local IP also checked to make sure the subnet-masks matched
\par \hich\af39\dbch\af31505\loch\f39 * Made it so the test for a matching route compared netmasks
\par \hich\af39\dbch\af31505\loch\f39 * Added a printer object
\par \hich\af39\dbch\af31505\loch\f39 * Ad\hich\af39\dbch\af31505\loch\f39 ded a copier object
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 Version 1.0.13 06/21/2015}{\rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12019296
\par \hich\af39\dbch\af31505\loch\f39 * Fixed issues with arp - arp could go through routers. Now works correctly
\par \hich\af39\dbch\af31505\loch\f39 * Made it test for puzzle completion after adding devices
\par \hich\af39\dbch\af31505\loch\f39 * Made it test for completion after changing / deleting devices
\par \hich\af39\dbch\af31505\loch\f39 * Let you \hich\af39\dbch\af31505\loch\f39 delete / add NICs on PCs, primarily so we can solve the duplicate MAC puzzle
\par \hich\af39\dbch\af31505\loch\f39 * Replaced the "Network Loop" puzzle with the correct one.
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 Version 1.0.12 06/20/2015}{\rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12019296
\par \hich\af39\dbch\af31505\loch\f39 * Added VPN and TUN nic types
\par \hich\af39\dbch\af31505\loch\f39 * Fixed numerous small bugs
\par \hich\af39\dbch\af31505\loch\f39 * Fixed bug with early solution to \hich\af39\dbch\af31505\loch\f39 failed ping test
\par \hich\af39\dbch\af31505\loch\f39 * Added "ding" when a test is solved.
\par \hich\af39\dbch\af31505\loch\f39 * Added a "firewall" network that has a firewall and vpns
\par \hich\af39\dbch\af31505\loch\f39 * Added numerous firewall / vpn puzzles
\par \hich\af39\dbch\af31505\loch\f39 * Fixed a DNS issue. It now more intelligently finds the right IP address when you ping it
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 Version\hich\af39\dbch\af31505\loch\f39 1.0.11 06/14/2015}{\rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12019296
\par \hich\af39\dbch\af31505\loch\f39 * Added the ability to lock various important features to make puzzles better
\par \hich\af39\dbch\af31505\loch\f39 * Able to add interfaces (multiple IPs on a Network Card)
\par \hich\af39\dbch\af31505\loch\f39 * Right-click context menu to add net-tests.
\par \hich\af39\dbch\af31505\loch\f39 * Del key now deletes the last item we had clicked o\hich\af39\dbch\af31505\loch\f39 n
\par \hich\af39\dbch\af31505\loch\f39 * Can add NICs (on some devices)
\par \hich\af39\dbch\af31505\loch\f39 * Can delete NICs
\par \hich\af39\dbch\af31505\loch\f39 * Fixed minor bug with broadcast pinging solving ping test for individual computers
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 Version 1.0.10 06/13/2015}{\rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12019296
\par \hich\af39\dbch\af31505\loch\f39 * Renamed puzzles to manage them easier
\par \hich\af39\dbch\af31505\loch\f39 * Deal with duplicate IPs, and what happens when a \hich\af39\dbch\af31505\loch\f39 packet returns to a computer that did not send it.
\par \hich\af39\dbch\af31505\loch\f39 * Change to the help window so you can keep the window open while working with the puzzle.
\par \hich\af39\dbch\af31505\loch\f39 * Change to the donation link. Not that it will ever be used, but it makes me feel better having a few places for\hich\af39\dbch\af31505\loch\f39 people to donate to if they wish.
\par \hich\af39\dbch\af31505\loch\f39 * Minor change for how broadcast packets work, specifically dealing with duplicate IP addresses.
\par \hich\af39\dbch\af31505\loch\f39 * Added a "firewall" device & WAN port with masquerade
\par \hich\af39\dbch\af31505\loch\f39 * Added a FailedPing test so we can ping things that must fail (show \hich\af39\dbch\af31505\loch\f39 the firewall works)
\par \hich\af39\dbch\af31505\loch\f39 * added more to the help
\par \hich\af39\dbch\af31505\loch\f39 * added more puzzles
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 Version 1.0.0.9 05/29/2015}{\rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12019296
\par \hich\af39\dbch\af31505\loch\f39 * Add a grid to the network map. It makes things easier to straighten up
\par \hich\af39\dbch\af31505\loch\f39 * Sorted and organized the puzzles
\par \hich\af39\dbch\af31505\loch\f39 * Made a level for each puzzle.
\par \hich\af39\dbch\af31505\loch\f39 * Tracked the puzzle\hich\af39\dbch\af31505\loch\f39 s which have been completed
\par \hich\af39\dbch\af31505\loch\f39 * When we open the puzzle list, we now show the first level of puzzles that have an uncompleted puzzle.
\par \hich\af39\dbch\af31505\loch\f39 * Added more "tests", viewing help, pinging, arp, and dhcp.
\par \hich\af39\dbch\af31505\loch\f39 * Reset buttons when we load a new network.
\par \hich\af39\dbch\af31505\loch\f39 * Added a bunch more\hich\af39\dbch\af31505\loch\f39 puzzles
\par \hich\af39\dbch\af31505\loch\f39 * Sometimes the remembered IP gets annoying when it remembers odd gateways and numbers we cannot change. Fixed that in many cases.
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 Version 1.0.0.8 05/25/2015}{\rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12019296
\par \hich\af39\dbch\af31505\loch\f39 * Always Start with level0 puzzles for now
\par \hich\af39\dbch\af31505\loch\f39 * Fixed the icon when program running
\par \hich\af39\dbch\af31505\loch\f39 * Added an infrastructure for Puzzles (needs work)
\par \hich\af39\dbch\af31505\loch\f39 * Added a number of basic puzzles
\par \hich\af39\dbch\af31505\loch\f39 * Fixed DHCP Leases. Now it clears leases when you change the DHCP server range.
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 Version 1.0.0.7 05/16/2015}{\rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12019296
\par \hich\af39\dbch\af31505\loch\f39 * Added file association so we can double-click an enbx file
\par \hich\af39\dbch\af31505\loch\f39 * Fixed the icon so it looks right (removed left edge)
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 Version 1.0.0.6 05/16/2015}{\rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12019296
\par \hich\af39\dbch\af31505\loch\f39 * Able to delete a route (right click route and delete it)
\par \hich\af39\dbch\af31505\loch\f39 * Add map title as something we can load/save
\par \hich\af39\dbch\af31505\loch\f39 * Add message as something we can load and save
\par \hich\af39\dbch\af31505\loch\f39 * Changing size o\hich\af39\dbch\af31505\loch\f39 f items affects all items
\par \hich\af39\dbch\af31505\loch\f39 * Allow entering a hostname in the IP address field (ping / gateway)
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 Version 1.0.0.5 04/26/2015}{\rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12019296
\par \hich\af39\dbch\af31505\loch\f39 * Fixed ping from switch
\par \hich\af39\dbch\af31505\loch\f39 * Fixed error message when pinging IP that does not exist
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 Version 1.0.0.4 04/26/2015}{\rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12019296
\par \hich\af39\dbch\af31505\loch\f39 * Fixed broadcast pi\hich\af39\dbch\af31505\loch\f39 ng
\par \hich\af39\dbch\af31505\loch\f39 *Fixed dhcp request error
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 Version 1.0.0.3 04/15/2015
\par }{\rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 * Added "file" -> "new" to erase and start a clean new network
\par \hich\af39\dbch\af31505\loch\f39 * Fixed pc2 to have gateway on "solved"->"Two Networks"
\par \hich\af39\dbch\af31505\loch\f39 * Fixed - only machines capable of doing DHCP do dhcp request if we do DHCP req\hich\af39\dbch\af31505\loch\f39 uest on all
\par \hich\af39\dbch\af31505\loch\f39 * Changed - major overhaul to tcp-stack.
\par \hich\af39\dbch\af31505\loch\f39 * Downgrade - Arp temporarily removed from system while tcp-stack overhaul completed
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 Version 1.0.0.2 4/19/2015}{\rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12019296
\par \hich\af39\dbch\af31505\loch\f39 * Added IP-Phone
\par \hich\af39\dbch\af31505\loch\f39 * Packets terminate at the far end - \hich\af39\dbch\af31505\loch\f39 this makes it easier to see packets go both directions
\par \hich\af39\dbch\af31505\loch\f39 * Packets are randomized in transit - Allows packets to arrive at slightly different times
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 Version 1.0.0.1 4/11/2015}{\rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12019296
\par \hich\af39\dbch\af31505\loch\f39 * DHCP selection on nics is not functioning correctly
\par \hich\af39\dbch\af31505\loch\f39 * Various small bug-fixes
\par }{\rtlch\fcs1 \ab\af39 \ltrch\fcs0 \b\f39\lang9\langfe1033\langnp9\insrsid12019296 \hich\af39\dbch\af31505\loch\f39 Ve\hich\af39\dbch\af31505\loch\f39 rsion 1.0.0.0 4/10/2015}{\rtlch\fcs1 \af39 \ltrch\fcs0 \f39\lang9\langfe1033\langnp9\insrsid12019296
\par \hich\af39\dbch\af31505\loch\f39 This is the initial alpha build
\par \hich\af39\dbch\af31505\loch\f39 * basic pinging
\par \hich\af39\dbch\af31505\loch\f39 * basic arp
\par \hich\af39\dbch\af31505\loch\f39 * Routers
\par \hich\af39\dbch\af31505\loch\f39 * Switches/Hubs
\par \hich\af39\dbch\af31505\loch\f39 * PCs/Laptops
\par \hich\af39\dbch\af31505\loch\f39 * Network Links (ethernet)
\par \hich\af39\dbch\af31505\loch\f39 * Basic DHCP
\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a
9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad
5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6
b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0
0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6
a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f
c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512
0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462
a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865
6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b
4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b
4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210007b740aaca0600008f1a0000160000007468656d652f7468656d652f
7468656d65312e786d6cec595b8bdb46147e2ff43f08bd3bbe49be2cf1065bb69336bb49889d943cceda636bb2238dd18c776342a0244f7d2914d2d28706fad6
87521a68a0a12ffd310b1bdaf447f4cc489667ec71f6420aa1640d8b34face996fce39face48ba7aed51449d239c70c2e2965bbe52721d1c8fd898c4d3967b6f
d82f345c870b148f1165316eb90bccdd6bbb9f7e7215ed881047d801fb98efa0961b0a31db2916f9088611bfc26638866b13964448c069322d8e13740c7e235a
ac944ab5628448ec3a318ac0ededc9848cb033942edddda5f31e85d358703930a2c940bac68685c28e0fcb12c1173ca089738468cb8579c6ec78881f09d7a188
0bb8d0724beacf2dee5e2da29dcc888a2db69a5d5ffd657699c1f8b0a2e64ca607f9a49ee77bb576ee5f01a8d8c4f5eabd5aaf96fb5300341ac14a532eba4fbf
d3ec74fd0cab81d2438bef6ebd5b2d1b78cd7f758373db973f03af40a97f6f03dfef07104503af4029dedfc07b5ebd1278065e81527c6d035f2fb5bb5eddc02b
5048497cb8812ef9b56ab05c6d0e99307ac30a6ffa5ebf5ec99caf50500d7975c929262c16db6a2d420f59d2078004522448ec88c50c4fd008aa3840941c24c4
d923d3100a6f8662c661b85429f54b55f82f7f9e3a5211413b1869d6921730e11b43928fc34709998996fb39787535c8e9ebd7274f5f9d3cfdfde4d9b393a7bf
66732b5786dd0d144f75bbb73f7df3cf8b2f9dbf7ffbf1edf36fd3a9d7f15cc7bff9e5ab377ffcf92ef7b0e255284ebf7bf9e6d5cbd3efbffeebe7e716efed04
1de8f0218930776ee163e72e8b608116fef820b998c5304444b768c7538e622467b1f8ef89d040df5a208a2cb80e36e3783f01a9b101afcf1f1a8407613217c4
e2f1661819c07dc6688725d628dc947369611ecee3a97df264aee3ee2274649b3b40b191e5de7c061a4b6c2e83101b34ef50140b34c531168ebcc60e31b6acee
0121465cf7c928619c4d84f380381d44ac21199203a39a56463748047959d80842be8dd8ecdf773a8cda56ddc5472612ee0d442de487981a61bc8ee602453697
4314513de07b48843692834532d2713d2e20d3534c99d31b63ce6d36b71358af96f49b2033f6b4efd345642213410e6d3ef710633ab2cb0e831045331b7640e2
50c77ec60fa144917387091b7c9f9977883c873ca0786bbaef136ca4fb6c35b8070aab535a1588bc324f2cb9bc8e9951bf83059d20aca4061a80a1eb1189cf14
f93579f7ff3b7907113dfde1856545ef47d2ed8e8d7c5c50ccdb09b1de4d37d6247c1b6e5db803968cc987afdb5d348fef60b855369bd747d9fe28dbeeff5eb6
b7ddcfef5fac57fa0cd22db7ade9765d6ddea3ad7bf709a174201614ef71b57de7d095c67d189476eab915e7cf72b3100ee59d0c1318b86982948d9330f10511
e1204433d8e3975de964ca33d753eecc1887adbf1ab6fa96783a8ff6d9387d642d97e5e3692a1e1c89d578c9cfc7e17143a4e85a7df51896bb576ca7ea717949
40da5e8484369949a26a21515f0eca20a98773089a85845ad97b61d1b4b06848f7cb546db0006a795660dbe4c066abe5fa1e9880113c55218ac7324f69aa97d9
55c97c9f99de164ca302600fb1ac8055a69b92ebd6e5c9d5a5a5768e4c1b24b4723349a8c8a81ec64334c65975cad1f3d0b868ae9bab941af46428d47c505a2b
1af5c6bb585c36d760b7ae0d34d69582c6ce71cbad557d2899119ab5dc093cfac3613483dae172bb8be814de9f8d4492def097519659c24517f1300db8129d54
0d222270e25012b55cb9fc3c0d34561aa2b8952b20081f2cb926c8ca87460e926e26194f267824f4b46b2332d2e929287caa15d6abcafcf26069c9e690ee4138
3e760ee83cb98ba0c4fc7a5906704c38bc012aa7d11c1378a5990bd9aafed61a5326bbfa3b455543e938a2b310651d4517f314aea43ca7a3cef2186867d99a21
a05a48b2467830950d560faad14df3ae9172d8da75cf369291d34473d5330d55915dd3ae62c60ccb36b016cbcb35798dd532c4a0697a874fa57b5d729b4bad5b
db27e45d02029ec7cfd275cfd110346aabc90c6a92f1a60c4bcdce46cddeb15ce019d4ced32434d5af2dddaec52def11d6e960f0529d1fecd6ab168626cb7da5
8ab4faf6a17f9e60070f413cbaf022784e0557a9848f0f09820dd140ed4952d9805be491c86e0d3872e60969b98f4b7edb0b2a7e502835fc5ec1ab7aa542c36f
570b6ddfaf967b7eb9d4ed549e4063116154f6d3ef2e7d780d4517d9d71735bef105265abe69bb32625191a92f2c45455c7d812957b67f81710888cee35aa5df
ac363bb542b3daee17bc6ea7516806b54ea15b0beadd7e37f01bcdfe13d7395260af5d0dbc5aaf51a89583a0e0d54a927ea359a87b954adbabb71b3daffd24db
c6c0ca53f9c86201e155bc76ff050000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468656d652f7468656d652f5f72
656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4350d363f2451eced0dae2c08
2e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d262452282e3198720e274a939cd0
8a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe514173d9850528a2c6cce0239baa
4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0fbfff0000001c0200001300000000000000000000000000000000005b436f
6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b00000000000000000000000000300100005f72
656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c00000000000000000000000000190200007468656d652f746865
6d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210007b740aaca0600008f1a00001600000000000000000000000000d60200
007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b01000027000000000000000000000000
00d40900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000cf0a00000000}
{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d
617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169
6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363
656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e}
{\*\latentstyles\lsdstimax371\lsdlockeddef0\lsdsemihiddendef0\lsdunhideuseddef0\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 1;
\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 2;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4;
\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7;
\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 1;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 5;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 6;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 7;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 8;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 9;
\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 1;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 2;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 3;
\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 4;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 5;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 6;
\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 7;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 8;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 9;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Normal Indent;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footnote text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 header;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footer;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index heading;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 table of figures;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 envelope address;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 envelope return;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footnote reference;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation reference;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 line number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 page number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 endnote reference;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 endnote text;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 table of authorities;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 macro;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 toa heading;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 3;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 3;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 3;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 5;\lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Closing;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Signature;\lsdsemihidden1 \lsdunhideused1 \lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 4;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Message Header;\lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Salutation;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Date;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Note Heading;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent 3;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Block Text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Hyperlink;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 FollowedHyperlink;\lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;
\lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Document Map;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Plain Text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 E-mail Signature;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Top of Form;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Bottom of Form;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Normal (Web);\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Acronym;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Address;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Cite;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Code;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Definition;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Keyboard;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Preformatted;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Sample;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Typewriter;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Variable;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation subject;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 No List;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 1;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Balloon Text;\lsdpriority39 \lsdlocked0 Table Grid;
\lsdsemihidden1 \lsdlocked0 Placeholder Text;\lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdpriority60 \lsdlocked0 Light Shading;\lsdpriority61 \lsdlocked0 Light List;\lsdpriority62 \lsdlocked0 Light Grid;
\lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdpriority65 \lsdlocked0 Medium List 1;\lsdpriority66 \lsdlocked0 Medium List 2;\lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdpriority68 \lsdlocked0 Medium Grid 2;
\lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdpriority70 \lsdlocked0 Dark List;\lsdpriority71 \lsdlocked0 Colorful Shading;\lsdpriority72 \lsdlocked0 Colorful List;\lsdpriority73 \lsdlocked0 Colorful Grid;\lsdpriority60 \lsdlocked0 Light Shading Accent 1;
\lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;
\lsdsemihidden1 \lsdlocked0 Revision;\lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 1;
\lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdpriority62 \lsdlocked0 Light Grid Accent 2;
\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 2;
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;
\lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdpriority62 \lsdlocked0 Light Grid Accent 3;
\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;
\lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdpriority62 \lsdlocked0 Light Grid Accent 4;
\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 4;
\lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdpriority62 \lsdlocked0 Light Grid Accent 5;
\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 5;
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;
\lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdpriority62 \lsdlocked0 Light Grid Accent 6;
\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 6;
\lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis;
\lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority37 \lsdlocked0 Bibliography;
\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;\lsdpriority41 \lsdlocked0 Plain Table 1;\lsdpriority42 \lsdlocked0 Plain Table 2;\lsdpriority43 \lsdlocked0 Plain Table 3;\lsdpriority44 \lsdlocked0 Plain Table 4;
\lsdpriority45 \lsdlocked0 Plain Table 5;\lsdpriority40 \lsdlocked0 Grid Table Light;\lsdpriority46 \lsdlocked0 Grid Table 1 Light;\lsdpriority47 \lsdlocked0 Grid Table 2;\lsdpriority48 \lsdlocked0 Grid Table 3;\lsdpriority49 \lsdlocked0 Grid Table 4;
\lsdpriority50 \lsdlocked0 Grid Table 5 Dark;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 1;
\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 1;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 1;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 1;
\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 1;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 2;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 2;
\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 2;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 2;
\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 3;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 3;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 3;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 3;
\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 3;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 4;
\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 4;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 4;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 4;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 4;
\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 4;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 5;
\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 5;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 5;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 5;
\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 5;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 6;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 6;
\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 6;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 6;
\lsdpriority46 \lsdlocked0 List Table 1 Light;\lsdpriority47 \lsdlocked0 List Table 2;\lsdpriority48 \lsdlocked0 List Table 3;\lsdpriority49 \lsdlocked0 List Table 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark;
\lsdpriority51 \lsdlocked0 List Table 6 Colorful;\lsdpriority52 \lsdlocked0 List Table 7 Colorful;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 List Table 2 Accent 1;\lsdpriority48 \lsdlocked0 List Table 3 Accent 1;
\lsdpriority49 \lsdlocked0 List Table 4 Accent 1;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 1;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 1;
\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 List Table 2 Accent 2;\lsdpriority48 \lsdlocked0 List Table 3 Accent 2;\lsdpriority49 \lsdlocked0 List Table 4 Accent 2;
\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 2;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 3;
\lsdpriority47 \lsdlocked0 List Table 2 Accent 3;\lsdpriority48 \lsdlocked0 List Table 3 Accent 3;\lsdpriority49 \lsdlocked0 List Table 4 Accent 3;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 3;
\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 4;\lsdpriority47 \lsdlocked0 List Table 2 Accent 4;
\lsdpriority48 \lsdlocked0 List Table 3 Accent 4;\lsdpriority49 \lsdlocked0 List Table 4 Accent 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 4;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 4;
\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 List Table 2 Accent 5;\lsdpriority48 \lsdlocked0 List Table 3 Accent 5;
\lsdpriority49 \lsdlocked0 List Table 4 Accent 5;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 5;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 5;
\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 List Table 2 Accent 6;\lsdpriority48 \lsdlocked0 List Table 3 Accent 6;\lsdpriority49 \lsdlocked0 List Table 4 Accent 6;
\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 6;}}{\*\datastore 010500000200000018000000
4d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000060000
d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e5000000000000000000000000805d
474827b3d401feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000105000000000000}}

View File

@ -2129,72 +2129,40 @@
<value>Regression testing</value>
<comment>LBW_Regression_Testing = Regression testing</comment>
</data>
<data name="AC_AddDevice" xml:space="preserve">
<value>Add Device</value>
<comment>AC_AddDevice = Add Device</comment>
<data name="IPE_GatewayTooltip" xml:space="preserve">
<value>This is the gateway to use on this network. If a device exists with this IP, that device will be set up as the gateway.</value>
<comment>IPE_GatewayTooltip = This is the gateway to use on this network. If a device exists with this IP, that device will be set up as the gateway.</comment>
</data>
<data name="AC_ChangeDevice" xml:space="preserve">
<value>Change Device</value>
<comment>AC_ChangeDevice = Change Device</comment>
<data name="IPE_NetmaskTooltip" xml:space="preserve">
<value>This is the netmask we are using when renumbering the subnet.</value>
<comment>IPE_NetmaskTooltip = This is the netmask we are using when renumbering the subnet.</comment>
</data>
<data name="AC_ClearArp" xml:space="preserve">
<value>Clear ARP</value>
<comment>AC_ClearArp = Clear ARP</comment>
<data name="IPE_Network" xml:space="preserve">
<value>Network</value>
<comment>IPE_Network = Network</comment>
</data>
<data name="AC_DeleteDevice" xml:space="preserve">
<value>Delete Device</value>
<comment>AC_DeleteDevice = Delete Device</comment>
<data name="IPE_NetworkTooltip" xml:space="preserve">
<value>This is the network address to use. The gateway should be part of this network.</value>
<comment>IPE_NetworkTooltip = This is the network address to use. The gateway should be part of this network.</comment>
</data>
<data name="AC_DeleteLink" xml:space="preserve">
<value>Delete link</value>
<comment>AC_DeleteLink = Delete link</comment>
<data name="NB_ChooseGateway" xml:space="preserve">
<value>Choose a gateway device</value>
<comment>NB_ChooseGateway = Choose a gateway device</comment>
</data>
<data name="AC_DoPing" xml:space="preserve">
<value>Do ping</value>
<comment>AC_DoPing = Do ping</comment>
<data name="NB_Renumber" xml:space="preserve">
<value>Renumber IPs</value>
<comment>NB_Renumber = Renumber IPs</comment>
</data>
<data name="AC_DoTraceroute" xml:space="preserve">
<value>Do Traceroute</value>
<comment>AC_DoTraceroute = Do Traceroute</comment>
<data name="NB_Subnet" xml:space="preserve">
<value>New Subnet</value>
<comment>NB_Subnet = New Subnet</comment>
</data>
<data name="AC_MoveDevice" xml:space="preserve">
<value>Move Device</value>
<comment>AC_MoveDevice = Move Device</comment>
<data name="NB_ChooseVLANRenumber" xml:space="preserve">
<value>What VLAN to renumber?</value>
<comment>NB_ChooseVLANRenumber = What VLAN to renumber?</comment>
</data>
<data name="AC_Powering_OFF" xml:space="preserve">
<value>Powering Off</value>
<comment>AC_Powering_OFF = Powering Off</comment>
</data>
<data name="AC_Powering_ON" xml:space="preserve">
<value>Powering On</value>
<comment>AC_Powering_OFF - Powering On</comment>
</data>
<data name="AC_Replace_Device" xml:space="preserve">
<value>Replace Device</value>
<comment>AC_Replace_Device = Replace Device</comment>
</data>
<data name="AC_Replace_Link" xml:space="preserve">
<value>Replace Link</value>
<comment>AC_Replace_Link = Replace Link</comment>
</data>
<data name="AC_Replace_UPS" xml:space="preserve">
<value>Replace UPS</value>
<comment>AC_Replace_UPS = Replace UPS</comment>
</data>
<data name="AC_RequestARP" xml:space="preserve">
<value>Request ARP</value>
<comment>AC_RequestARP = Request ARP</comment>
</data>
<data name="AC_RequestDHCP" xml:space="preserve">
<value>Request DHCP</value>
<comment>AC_RequestDHCP = Request DHCP</comment>
</data>
<data name="AC_Resetting" xml:space="preserve">
<value>Resetting</value>
<comment>AC_Resetting = Resetting</comment>
</data>
<data name="NDUpdateComponent" xml:space="preserve">
<value>Updating Device</value>
<comment>NDUpdateComponent = Update Device</comment>
<data name="NB_ChooseVLANRenumberTitle" xml:space="preserve">
<value>VLAN to renumber</value>
<comment>NB_ChooseVLANRenumberTitle = VLAN to renumber</comment>
</data>
</root>

View File

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="WiX" version="3.11.2" targetFramework="net45" />
</packages>

View File

@ -12,7 +12,7 @@ should be well on your way to mastering networking.
EduNetworkBuilder is a Visual Studio program. You should be able to download the current free
edition of Visual Studio, open the project file, and make the project. You should also be able to
download pre-compiled versions from: http://tyounglightsys.com/EduNetworkBuilder
download pre-compiled versions from: http://tyounglightsys.ddns.info/EduNetworkBuilder
*** Building on Linux with Mono and XBuild ***