From bfa96f0035abe6447a6d8910f8fcbf399a5de7d7 Mon Sep 17 00:00:00 2001 From: HonkingGoose <34918129+HonkingGoose@users.noreply.github.com> Date: Sun, 9 Aug 2020 10:46:09 +0200 Subject: [PATCH 1/4] Remove TFS files --- .../sections/client-tfs.asc | 416 ------------------ .../sections/import-tfs.asc | 60 --- 2 files changed, 476 deletions(-) delete mode 100644 book/09-git-and-other-scms/sections/client-tfs.asc delete mode 100644 book/09-git-and-other-scms/sections/import-tfs.asc diff --git a/book/09-git-and-other-scms/sections/client-tfs.asc b/book/09-git-and-other-scms/sections/client-tfs.asc deleted file mode 100644 index 8f205058d..000000000 --- a/book/09-git-and-other-scms/sections/client-tfs.asc +++ /dev/null @@ -1,416 +0,0 @@ -==== Git and TFS - -(((Interoperation with other VCSs, TFS))) -(((TFS)))((("TFVC", see="TFS"))) -Git is becoming popular with Windows developers, and if you're writing code on Windows, there's a good chance you're using Microsoft's Team Foundation Server (TFS). -TFS is a collaboration suite that includes defect and work-item tracking, process support for Scrum and others, code review, and version control. -There's a bit of confusion ahead: *TFS* is the server, which supports controlling source code using both Git and their own custom VCS, which they've dubbed *TFVC* (Team Foundation Version Control). -Git support is a somewhat new feature for TFS (shipping with the 2013 version), so all of the tools that predate that refer to the version-control portion as ``TFS'', even though they're mostly working with TFVC. - -If you find yourself on a team that's using TFVC but you'd rather use Git as your version-control client, there's a project for you. - -===== Which Tool - -(((git-tf)))(((git-tfs))) -In fact, there are two: git-tf and git-tfs. - -Git-tfs (found at https://github.com/git-tfs/git-tfs[]) is a .NET project, and (as of this writing) it only runs on Windows. -To work with Git repositories, it uses the .NET bindings for libgit2, a library-oriented implementation of Git which is highly performant and allows a lot of flexibility with the guts of a Git repository. -Libgit2 is not a complete implementation of Git, so to cover the difference git-tfs will actually call the command-line Git client for some operations, so there are no artificial limits on what it can do with Git repositories. -Its support of TFVC features is very mature, since it uses the Visual Studio assemblies for operations with servers. -This does mean you'll need access to those assemblies, which means you need to install a recent version of Visual Studio (any edition since version 2010, including Express since version 2012), or the Visual Studio SDK. - -[CAUTION] -==== -Git-tf is End-of-Life (EOL), it will not get any updates. -It is also no longer supported by Microsoft. -==== - -Git-tf (whose home is at https://archive.codeplex.com/?p=gittf[]) is a Java project, and as such runs on any computer with a Java runtime environment. -It interfaces with Git repositories through JGit (a JVM implementation of Git), which means it has virtually no limitations in terms of Git functions. -However, its support for TFVC is limited as compared to git-tfs – it does not support branches, for instance. - -So each tool has pros and cons, and there are plenty of situations that favor one over the other. -We'll cover the basic usage of both of them in this book. - -[NOTE] -==== -You'll need access to a TFVC-based repository to follow along with these instructions. -These aren't as plentiful in the wild as Git or Subversion repositories, so you may need to create one of your own. -Codeplex (https://archive.codeplex.com/[]) or Visual Studio Online (https://visualstudio.microsoft.com[]) are both good choices for this. -==== - - -===== Getting Started: `git-tf` - -The first thing you do, just as with any Git project, is clone. -Here's what that looks like with `git-tf`: - -[source,console] ----- -$ git tf clone https://tfs.codeplex.com:443/tfs/TFS13 $/myproject/Main project_git ----- - -The first argument is the URL of a TFVC collection, the second is of the form `$/project/branch`, and the third is the path to the local Git repository that is to be created (this last one is optional). -Git-tf can only work with one branch at a time; if you want to make checkins on a different TFVC branch, you'll have to make a new clone from that branch. - -This creates a fully functional Git repository: - -[source,console] ----- -$ cd project_git -$ git log --all --oneline --decorate -512e75a (HEAD, tag: TFS_C35190, origin_tfs/tfs, master) Checkin message ----- - -This is called a _shallow_ clone, meaning that only the latest changeset has been downloaded. -TFVC isn't designed for each client to have a full copy of the history, so git-tf defaults to only getting the latest version, which is much faster. - -If you have some time, it's probably worth it to clone the entire project history, using the `--deep` option: - -[source,console] ----- -$ git tf clone https://tfs.codeplex.com:443/tfs/TFS13 $/myproject/Main \ - project_git --deep -Username: domain\user -Password: -Connecting to TFS... -Cloning $/myproject into /tmp/project_git: 100%, done. -Cloned 4 changesets. Cloned last changeset 35190 as d44b17a -$ cd project_git -$ git log --all --oneline --decorate -d44b17a (HEAD, tag: TFS_C35190, origin_tfs/tfs, master) Goodbye -126aa7b (tag: TFS_C35189) -8f77431 (tag: TFS_C35178) FIRST -0745a25 (tag: TFS_C35177) Created team project folder $/tfvctest via the \ - Team Project Creation Wizard ----- - -Notice the tags with names like `TFS_C35189`; this is a feature that helps you know which Git commits are associated with TFVC changesets. -This is a nice way to represent it, since you can see with a simple log command which of your commits is associated with a snapshot that also exists in TFVC. -They aren't necessary (and in fact you can turn them off with `git config git-tf.tag false`) – git-tf keeps the real commit-changeset mappings in the `.git/git-tf` file. - - -===== Getting Started: `git-tfs` - -Git-tfs cloning behaves a bit differently. -Observe: - -[source,powershell] ----- -PS> git tfs clone --with-branches \ - https://username.visualstudio.com/DefaultCollection \ - $/project/Trunk project_git -Initialized empty Git repository in C:/Users/ben/project_git/.git/ -C15 = b75da1aba1ffb359d00e85c52acb261e4586b0c9 -C16 = c403405f4989d73a2c3c119e79021cb2104ce44a -Tfs branches found: -- $/tfvc-test/featureA -The name of the local branch will be : featureA -C17 = d202b53f67bde32171d5078968c644e562f1c439 -C18 = 44cd729d8df868a8be20438fdeeefb961958b674 ----- - -Notice the `--with-branches` flag. -Git-tfs is capable of mapping TFVC branches to Git branches, and this flag tells it to set up a local Git branch for every TFVC branch. -This is highly recommended if you've ever branched or merged in TFS, but it won't work with a server older than TFS 2010 – before that release, ``branches'' were just folders, so git-tfs can't tell them from regular folders. - -Let's take a look at the resulting Git repository: - -[source,powershell] ----- -PS> git log --oneline --graph --decorate --all -* 44cd729 (tfs/featureA, featureA) Goodbye -* d202b53 Branched from $/tfvc-test/Trunk -* c403405 (HEAD, tfs/default, master) Hello -* b75da1a New project -PS> git log -1 -commit c403405f4989d73a2c3c119e79021cb2104ce44a -Author: Ben Straub -Date: Fri Aug 1 03:41:59 2014 +0000 - - Hello - - git-tfs-id: [https://username.visualstudio.com/DefaultCollection]$/myproject/Trunk;C16 ----- - -There are two local branches, `master` and `featureA`, which represent the initial starting point of the clone (`Trunk` in TFVC) and a child branch (`featureA` in TFVC). -You can also see that the `tfs` ``remote'' has a couple of refs too: `default` and `featureA`, which represent TFVC branches. -Git-tfs maps the branch you cloned from to `tfs/default`, and others get their own names. - -Another thing to notice is the `git-tfs-id:` lines in the commit messages. -Instead of tags, git-tfs uses these markers to relate TFVC changesets to Git commits. -This has the implication that your Git commits will have a different SHA-1 hash before and after they have been pushed to TFVC. - -===== Git-tf[s] Workflow - -[NOTE] -==== -Regardless of which tool you're using, you should set a couple of Git configuration values to avoid running into issues. - -[source,console] ----- -$ git config set --local core.ignorecase=true -$ git config set --local core.autocrlf=false ----- -==== - -The obvious next thing you're going to want to do is work on the project. -TFVC and TFS have several features that may add complexity to your workflow: - -. Feature branches that aren't represented in TFVC add a bit of complexity. - This has to do with the *very* different ways that TFVC and Git represent branches. -. Be aware that TFVC allows users to ``checkout'' files from the server, locking them so nobody else can edit them. - This obviously won't stop you from editing them in your local repository, but it could get in the way when it comes time to push your changes up to the TFVC server. -. TFS has the concept of ``gated'' checkins, where a TFS build-test cycle has to complete successfully before the checkin is allowed. - This uses the ``shelve'' function in TFVC, which we don't cover in detail here. - You can fake this in a manual fashion with git-tf, and git-tfs provides the `checkintool` command which is gate-aware. - -In the interest of brevity, what we'll cover here is the happy path, which sidesteps or avoids most of these issues. - -===== Workflow: `git-tf` - - -Let's say you've done some work, made a couple of Git commits on `master`, and you're ready to share your progress on the TFVC server. -Here's our Git repository: - -[source,console] ----- -$ git log --oneline --graph --decorate --all -* 4178a82 (HEAD, master) update code -* 9df2ae3 update readme -* d44b17a (tag: TFS_C35190, origin_tfs/tfs) Goodbye -* 126aa7b (tag: TFS_C35189) -* 8f77431 (tag: TFS_C35178) FIRST -* 0745a25 (tag: TFS_C35177) Created team project folder $/tfvctest via the \ - Team Project Creation Wizard ----- - -We want to take the snapshot that's in the `4178a82` commit and push it up to the TFVC server. -First things first: let's see if any of our teammates did anything since we last connected: - -[source,console] ----- -$ git tf fetch -Username: domain\user -Password: -Connecting to TFS... -Fetching $/myproject at latest changeset: 100%, done. -Downloaded changeset 35320 as commit 8ef06a8. Updated FETCH_HEAD. -$ git log --oneline --graph --decorate --all -* 8ef06a8 (tag: TFS_C35320, origin_tfs/tfs) just some text -| * 4178a82 (HEAD, master) update code -| * 9df2ae3 update readme -|/ -* d44b17a (tag: TFS_C35190) Goodbye -* 126aa7b (tag: TFS_C35189) -* 8f77431 (tag: TFS_C35178) FIRST -* 0745a25 (tag: TFS_C35177) Created team project folder $/tfvctest via the \ - Team Project Creation Wizard ----- - -Looks like someone else is working, too, and now we have divergent history. -This is where Git shines, but we have two choices of how to proceed: - -. Making a merge commit feels natural as a Git user (after all, that's what `git pull` does), and git-tf can do this for you with a simple `git tf pull`. - Be aware, however, that TFVC doesn't think this way, and if you push merge commits your history will start to look different on both sides, which can be confusing. - However, if you plan on submitting all of your changes as one changeset, this is probably the easiest choice. -. Rebasing makes our commit history linear, which means we have the option of converting each of our Git commits into a TFVC changeset. - Since this leaves the most options open, we recommend you do it this way; git-tf even makes it easy for you with `git tf pull --rebase`. - -The choice is yours. -For this example, we'll be rebasing: - -[source,console] ----- -$ git rebase FETCH_HEAD -First, rewinding head to replay your work on top of it... -Applying: update readme -Applying: update code -$ git log --oneline --graph --decorate --all -* 5a0e25e (HEAD, master) update code -* 6eb3eb5 update readme -* 8ef06a8 (tag: TFS_C35320, origin_tfs/tfs) just some text -* d44b17a (tag: TFS_C35190) Goodbye -* 126aa7b (tag: TFS_C35189) -* 8f77431 (tag: TFS_C35178) FIRST -* 0745a25 (tag: TFS_C35177) Created team project folder $/tfvctest via the \ - Team Project Creation Wizard ----- - -Now we're ready to make a checkin to the TFVC server. -Git-tf gives you the choice of making a single changeset that represents all the changes since the last one (`--shallow`, which is the default) and creating a new changeset for each Git commit (`--deep`). -For this example, we'll just create one changeset: - -[source,console] ----- -$ git tf checkin -m 'Updating readme and code' -Username: domain\user -Password: -Connecting to TFS... -Checking in to $/myproject: 100%, done. -Checked commit 5a0e25e in as changeset 35348 -$ git log --oneline --graph --decorate --all -* 5a0e25e (HEAD, tag: TFS_C35348, origin_tfs/tfs, master) update code -* 6eb3eb5 update readme -* 8ef06a8 (tag: TFS_C35320) just some text -* d44b17a (tag: TFS_C35190) Goodbye -* 126aa7b (tag: TFS_C35189) -* 8f77431 (tag: TFS_C35178) FIRST -* 0745a25 (tag: TFS_C35177) Created team project folder $/tfvctest via the \ - Team Project Creation Wizard ----- - -There's a new `TFS_C35348` tag, indicating that TFVC is storing the exact same snapshot as the `5a0e25e` commit. -It's important to note that not every Git commit needs to have an exact counterpart in TFVC; the `6eb3eb5` commit, for example, doesn't exist anywhere on the server. - -That's the main workflow. -There are a couple of other considerations you'll want to keep in mind: - -* There is no branching. - Git-tf can only create Git repositories from one TFVC branch at a time. -* Collaborate using either TFVC or Git, but not both. - Different git-tf clones of the same TFVC repository may have different commit SHA-1 hashes, which will cause no end of headaches. -* If your team's workflow includes collaborating in Git and syncing periodically with TFVC, only connect to TFVC with one of the Git repositories. - -===== Workflow: `git-tfs` - -Let's walk through the same scenario using git-tfs. -Here are the new commits we've made to the `master` branch in our Git repository: - -[source,powershell] ----- -PS> git log --oneline --graph --all --decorate -* c3bd3ae (HEAD, master) update code -* d85e5a2 update readme -| * 44cd729 (tfs/featureA, featureA) Goodbye -| * d202b53 Branched from $/tfvc-test/Trunk -|/ -* c403405 (tfs/default) Hello -* b75da1a New project ----- - -Now let's see if anyone else has done work while we were hacking away: - -[source,powershell] ----- -PS> git tfs fetch -C19 = aea74a0313de0a391940c999e51c5c15c381d91d -PS> git log --all --oneline --graph --decorate -* aea74a0 (tfs/default) update documentation -| * c3bd3ae (HEAD, master) update code -| * d85e5a2 update readme -|/ -| * 44cd729 (tfs/featureA, featureA) Goodbye -| * d202b53 Branched from $/tfvc-test/Trunk -|/ -* c403405 Hello -* b75da1a New project ----- - -Yes, it turns out our coworker has added a new TFVC changeset, which shows up as the new `aea74a0` commit, and the `tfs/default` remote branch has moved. - -As with git-tf, we have two fundamental options for how to resolve this divergent history: - -. Rebase to preserve a linear history. -. Merge to preserve what actually happened. - -In this case, we're going to do a ``deep'' checkin, where every Git commit becomes a TFVC changeset, so we want to rebase. - -[source,powershell] ----- -PS> git rebase tfs/default -First, rewinding head to replay your work on top of it... -Applying: update readme -Applying: update code -PS> git log --all --oneline --graph --decorate -* 10a75ac (HEAD, master) update code -* 5cec4ab update readme -* aea74a0 (tfs/default) update documentation -| * 44cd729 (tfs/featureA, featureA) Goodbye -| * d202b53 Branched from $/tfvc-test/Trunk -|/ -* c403405 Hello -* b75da1a New project ----- - -Now we're ready to complete our contribution by checking in our code to the TFVC server. -We'll use the `rcheckin` command here to create a TFVC changeset for each Git commit in the path from HEAD to the first `tfs` remote branch found (the `checkin` command would only create one changeset, sort of like squashing Git commits). - -[source,powershell] ----- -PS> git tfs rcheckin -Working with tfs remote: default -Fetching changes from TFS to minimize possibility of late conflict... -Starting checkin of 5cec4ab4 'update readme' - add README.md -C20 = 71a5ddce274c19f8fdc322b4f165d93d89121017 -Done with 5cec4ab4b213c354341f66c80cd650ab98dcf1ed, rebasing tail onto new TFS-commit... -Rebase done successfully. -Starting checkin of b1bf0f99 'update code' - edit .git\tfs\default\workspace\ConsoleApplication1/ConsoleApplication1/Program.cs -C21 = ff04e7c35dfbe6a8f94e782bf5e0031cee8d103b -Done with b1bf0f9977b2d48bad611ed4a03d3738df05ea5d, rebasing tail onto new TFS-commit... -Rebase done successfully. -No more to rcheckin. -PS> git log --all --oneline --graph --decorate -* ff04e7c (HEAD, tfs/default, master) update code -* 71a5ddc update readme -* aea74a0 update documentation -| * 44cd729 (tfs/featureA, featureA) Goodbye -| * d202b53 Branched from $/tfvc-test/Trunk -|/ -* c403405 Hello -* b75da1a New project ----- - -Notice how after every successful checkin to the TFVC server, git-tfs is rebasing the remaining work onto what it just did. -That's because it's adding the `git-tfs-id` field to the bottom of the commit messages, which changes the SHA-1 hashes. -This is exactly as designed, and there's nothing to worry about, but you should be aware that it's happening, especially if you're sharing Git commits with others. - -TFS has many features that integrate with its version control system, such as work items, designated reviewers, gated checkins, and so on. -It can be cumbersome to work with these features using only a command-line tool, but fortunately git-tfs lets you launch a graphical checkin tool very easily: - -[source,powershell] ----- -PS> git tfs checkintool -PS> git tfs ct ----- - -It looks a bit like this: - -.The git-tfs checkin tool -image::images/git-tfs-ct.png[The git-tfs checkin tool] - -This will look familiar to TFS users, as it's the same dialog that's launched from within Visual Studio. - -Git-tfs also lets you control TFVC branches from your Git repository. -As an example, let's create one: - -[source,powershell] ----- -PS> git tfs branch $/tfvc-test/featureBee -The name of the local branch will be : featureBee -C26 = 1d54865c397608c004a2cadce7296f5edc22a7e5 -PS> git log --oneline --graph --decorate --all -* 1d54865 (tfs/featureBee) Creation branch $/myproject/featureBee -* ff04e7c (HEAD, tfs/default, master) update code -* 71a5ddc update readme -* aea74a0 update documentation -| * 44cd729 (tfs/featureA, featureA) Goodbye -| * d202b53 Branched from $/tfvc-test/Trunk -|/ -* c403405 Hello -* b75da1a New project ----- - -Creating a branch in TFVC means adding a changeset where that branch now exists, and this is projected as a Git commit. -Note also that git-tfs *created* the `tfs/featureBee` remote branch, but `HEAD` is still pointing to `master`. -If you want to work on the newly-minted branch, you'll want to base your new commits on the `1d54865` commit, perhaps by creating a topic branch from that commit. - -===== Git and TFS Summary - -Git-tf and Git-tfs are both great tools for interfacing with a TFVC server. -They allow you to use the power of Git locally, avoid constantly having to round-trip to the central TFVC server, and make your life as a developer much easier, without forcing your entire team to migrate to Git. -If you're working on Windows (which is likely if your team is using TFS), you'll probably want to use git-tfs, since its feature set is more complete, but if you're working on another platform, you'll be using git-tf, which is more limited. -As with most of the tools in this chapter, you should choose one of these version-control systems to be canonical, and use the other one in a subordinate fashion – either Git or TFVC should be the center of collaboration, but not both. diff --git a/book/09-git-and-other-scms/sections/import-tfs.asc b/book/09-git-and-other-scms/sections/import-tfs.asc deleted file mode 100644 index 68a7f4cf9..000000000 --- a/book/09-git-and-other-scms/sections/import-tfs.asc +++ /dev/null @@ -1,60 +0,0 @@ -[[_git_tfs]] -==== TFS - -(((TFS)))(((Importing, from TFS))) -If your team is converting their source control from TFVC to Git, you'll want the highest-fidelity conversion you can get. -This means that, while we covered both git-tfs and git-tf for the interop section, we'll only be covering git-tfs for this part, because git-tfs supports branches, and this is prohibitively difficult using git-tf. - -[NOTE] -==== -This is a one-way conversion. -The resulting Git repository won't be able to connect with the original TFVC project. -==== - -The first thing to do is map usernames. -TFVC is fairly liberal with what goes into the author field for changesets, but Git wants a human-readable name and email address. -You can get this information from the `tf` command-line client, like so: - -[source,powershell] ----- -PS> tf history $/myproject -recursive > AUTHORS_TMP ----- - -This grabs all of the changesets in the history of the project and put it in the AUTHORS_TMP file that we will process to extract the data of the 'User' column (the 2nd one). -Open the file and find at which characters start and end the column and replace, in the following command-line, the parameters `11-20` of the `cut` command with the ones found: - -[source,powershell] ----- -PS> cat AUTHORS_TMP | cut -b 11-20 | tail -n+3 | sort | uniq > AUTHORS ----- - -The `cut` command keeps only the characters between 11 and 20 from each line. -The `tail` command skips the first two lines, which are field headers and ASCII-art underlines. -The result of all of this is piped to `sort` and `uniq` to eliminate duplicates, and saved to a file named `AUTHORS`. -The next step is manual; in order for git-tfs to make effective use of this file, each line must be in this format: - -[source,text] ----- -DOMAIN\username = User Name ----- - -The portion on the left is the ``User'' field from TFVC, and the portion on the right side of the equals sign is the user name that will be used for Git commits. - -Once you have this file, the next thing to do is make a full clone of the TFVC project you're interested in: - -[source,powershell] ----- -PS> git tfs clone --with-branches --authors=AUTHORS https://username.visualstudio.com/DefaultCollection $/project/Trunk project_git ----- - -Next you'll want to clean the `git-tfs-id` sections from the bottom of the commit messages. -The following command will do that: - -[source,powershell] ----- -PS> git filter-branch -f --msg-filter 'sed "s/^git-tfs-id:.*$//g"' '--' --all ----- - -That uses the `sed` command from the Git-bash environment to replace any line starting with ``git-tfs-id:'' with emptiness, which Git will then ignore. - -Once that's all done, you're ready to add a new remote, push all your branches up, and have your team start working from Git. From 68618b94ee0dbf7ff9eb79a94084b823c389e8e1 Mon Sep 17 00:00:00 2001 From: HonkingGoose <34918129+HonkingGoose@users.noreply.github.com> Date: Sun, 9 Aug 2020 10:46:37 +0200 Subject: [PATCH 2/4] Remove references to TF/TFS content --- C-git-commands.asc | 2 +- ch09-git-and-other-systems.asc | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/C-git-commands.asc b/C-git-commands.asc index fc6c8d5e3..65077c192 100644 --- a/C-git-commands.asc +++ b/C-git-commands.asc @@ -568,7 +568,7 @@ The `git filter-branch` command is used to rewrite loads of commits according to In <> we explain the command and explore several different options such as `--commit-filter`, `--subdirectory-filter` and `--tree-filter`. -In <> and <> we use it to fix up imported external repositories. +In <> we use it to fix up imported external repositories. === Plumbing Commands diff --git a/ch09-git-and-other-systems.asc b/ch09-git-and-other-systems.asc index 43b0b3590..7c4c9114b 100644 --- a/ch09-git-and-other-systems.asc +++ b/ch09-git-and-other-systems.asc @@ -24,8 +24,6 @@ include::book/09-git-and-other-scms/sections/client-bzr.asc[] include::book/09-git-and-other-scms/sections/client-p4.asc[] -include::book/09-git-and-other-scms/sections/client-tfs.asc[] - [[_migrating]] === Migrating to Git @@ -42,8 +40,6 @@ include::book/09-git-and-other-scms/sections/import-bzr.asc[] include::book/09-git-and-other-scms/sections/import-p4.asc[] -include::book/09-git-and-other-scms/sections/import-tfs.asc[] - include::book/09-git-and-other-scms/sections/import-custom.asc[] === Summary From 235af48f1546137f2f7f03ca9923f435fef1b14c Mon Sep 17 00:00:00 2001 From: HonkingGoose <34918129+HonkingGoose@users.noreply.github.com> Date: Sun, 9 Aug 2020 10:47:15 +0200 Subject: [PATCH 3/4] Manual edit: remove client-tfs + import-tfs --- status.json | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/status.json b/status.json index fc15757a8..61a6f2212 100644 --- a/status.json +++ b/status.json @@ -88,12 +88,10 @@ "sections/client-hg.asc": 0, "sections/client-p4.asc": 0, "sections/client-svn.asc": 0, - "sections/client-tfs.asc": 0, "sections/import-custom.asc": 0, "sections/import-hg.asc": 0, "sections/import-p4.asc": 0, - "sections/import-svn.asc": 0, - "sections/import-tfs.asc": 0 + "sections/import-svn.asc": 0 }, "10-git-internals": { "1-git-internals.asc": 0, From ce5fa2dba139e6d63defb24652679c75810feedf Mon Sep 17 00:00:00 2001 From: HonkingGoose <34918129+HonkingGoose@users.noreply.github.com> Date: Sun, 9 Aug 2020 15:33:16 +0200 Subject: [PATCH 4/4] Remove git-tfs checkin tool image --- images/git-tfs-ct.png | Bin 25154 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 images/git-tfs-ct.png diff --git a/images/git-tfs-ct.png b/images/git-tfs-ct.png deleted file mode 100644 index d081f27231f9fff7284376b9229a53c037d72b9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25154 zcmV)JK)b(*P)00004XF*Lt006O% z3;baP00001b5ch_0Itp)=>Px&08mU+Mey+O^Yioa^78rl`TF|${{H^>`1t?-|NHy< z@9*#N@$vru|Mm6t>FMeA_V)Dj^xfUv%gf8Xy}jb%;{E*m=H}+^?(gO0<+7?`fY7(sHmy?|NlfpM8?L(E0_OSSXw|pLI3{w*Vx(5=l{jx|N8y^ zSFZmxH8%hL^xWLsn3$OJ@$mBR@4(>yQc+U#{r~8llkPp`rxeR?(_co@Y2@TbdR{|{{Q>%-S_hE z!0-OV#KZXX=V*1T*|&_6!{$(Cd;9IsuGs#jc0@l;XmFp%UsH|!_rk#4^2ta><<-o| zpL*7;ddd3y-R=7O_V9l+Qh=PsrP2AG&g{&ni?x4j`TO*tU0BYuq^N9U_RN)#NL2Fc z;=GMt+{>kfXjjL1cXofYXnTTTI(We5mXE^_rx# zRZV&%mH%p_*R0*{yN61PxcXQ=IhnfHR&kWL+y2wv>3LOM<+pvY=lyD9f?O(9#E^BA zZgr4lK4D{?W0S_Hf?s`fX?s^i#@OdAGF$NOyl^f#G*X6cGGu5^aJA9sk5zelXqiPN zGIxHApdA3VmT)?p|Ju;LJZzey-~8n2@21Gzj)u5y%m2;M+up&q%=_Y%s>VX9|M2?R zf0m+uJBHlpy1vNTh)pw`gm9&igSqhR(!<28zRXaW|44?v-{tG8Z-|M9a9kT5tgy(Y zEDOAyvbd<7-TUbQ0Rb3}|Kj`6s-T>;ri-|Vi?huC$m!T`p#QPk*1Bs)*67R1ZezZ@ z(8A3Bu2nkT?%}h$o#ohn&j0{k;7LS5RCwC#S$#}X>lxR3PJ6ml=OrEkvT2reTu9tG zhaGR~x!z_SnKWR!#0Hu|$44nzUL1MlgMi83(Kq82Q zt%8;5iry$ewh?qVLH0@nk+4M?$WA}@Y^T>FNMq130ztmDmLTuDgP=ciNCinoZkcO; zg#-V~6Rj~(m|WLjh&6l+mm@cvtO#C0?2&Yf|8J4_M+6`6a%7iQey(OEqQh7@`Cl>^ zvMbm?uxT>Xk5F}_Uu$>_;6iG-@B4j|ZCizT2Ee=70 zPQr^vBYKB#3{5J+W5DO6-wAHzltD$n2PxkOLG~XybPOT&sAV03GP}~5cs1?c&s&?CYqowyyvnqHl1oRVm$oS*V<|VvqHS&hV^8vIG5reLb7uW} zVe=9k2=_CjBFr#nd#>BiJ!IOSdKt}1UE>nfR6Ko~%LJKyj*`HX+A;tid-G(rrx`O0 zQ}tnPkV#mEAeMf)TC-Ivxofudi$AI$D;YB?4oQ30ILtJE($C0k{bHRq2V{fu8j_xN zuYZ*(1=$&$Xqr@3&1cNy31QV!wKpT<^b9G3#icx!dLbPv$~Qs~YL7aWR;g4wsI-*zI!I%8bJLrq=I+ML(m}Wdw_306z37-bqE+FR zE0+_veI`tMe!roZv85c_U}>n*H@kLJn9kn;=c`M6H15c3ziTCK&49CQDzlj6Lym%{2sxX zXu&Ut)dt1|WQ3IS<~yUhiYI>{{Z;vqmmr!isP8o}a(_^y($jmGQxQznm2|)_`U>jY z>U8@EWp>vJD!D&7a!o}C1TomalE^rzX*N%}jtF9WkT4J-Nli&Q$UuaIrta<|s}Kk@ z@KkXgGwCXB-Bb}+whLsx%B2HAVD}(BTp%>kG1w2*V3{$yQMMVecUL?F_ZIWScu9Y@ zX=kchuQxGOuLsiYEqP4Elv-`SzY+se=T2AK8(0OwmrVDS)3$nb`q&7^b#@JpR!yZM zUXntipUFz+Efk%(O}t<-c~H@4>h*nYn+3JDVi3FW?QME*;=hELfw;T=RS-$Ae6LE!ykfm+B< z+$02H3>|$1kXnXyBs_aP)T05$SW=#qbDD~_6wCcT0YQvyFUvVh5bc7u&GND!m?7vU zRSGHwruDj4ut6r+-WJftr!&{)PqqzN1yJ_#5)ZmSHHQgu93IiMc`3IP2qG)(v{;sO z8obT~-+ZJozYdKy-eFwtal5xZ`Z^=+9}Aq}v^8`(n(6RM%);-ExW; z6cD5==9T5K4jzzDK4k?42*0%G+(q+?(aw}bC>*|cIc4Z@@r&akEAd%X+v0`E072@e zOr0r14XmbU>{DFcg84=AgNvN8&0-majwu$B_JV765fNm;GBm^TPS+WbB?TJP#PTX09{2)j8(#{kMOh^-h1r*B|ZsWz4 ze}85w*XGRr-s~1*IRDvkowjK9GN-MH*Z(owAL2iY#)lWZ9c2aDlD~}b?YfPlf;xh&1ZkCt(mN(p{Rd-D|zllPiL3QH+QDu zVRC#|bq|dR0?%TW^7MX+2vS-D#wJ^h7xXS4b|diNg{kW3%d4B}b>EaZlWVDBcQVq= z)=bYmc---4t8<`we#-8ft1Oy!CB&+t9%6?A9UzBFIz zS5%Sjve|vm-jd6~sAB6lcDC$?Q-|!PrmOaSb6>(ZBPW!e^tlAza4pOqnv(chw$xL7 zQSjW$Hs2j9j92#+&}O$Q-j`MEwjWr$#4_Mkyzg^Hsl@~V*X7Vb?1gFRV?ES_+I3)* zfnIU7<@JM$vXU43d}@;ptiVvnJ0Co|V=Avgvih+G%BdbZFshR^JNBVd8XS=WLC_+E zWP`k>O+V@v#9Rsl!B31eut??v5JY9TUY0GoReB}a)ipN4JI>CfJXRutsEk){{B^RG zXU)@DD26nMp=5G|XLH80lqGjYAKu6|daA8j&)_$Xfn$9Q6O&(16X$wlMO^_x6ZG+8+@ zn?)I(x7VAl=tp@@9I=e`!$-89dsfc>F@?pmK#|@)bV)GYzE?@X;a~q@*9>FYIL|o# z!H3V9wN09C+GGh$3yZcYJ73~V*AqF(U&0NfXu{eo*VdI{V`C%Bc2R6&j4=fVWE)8E zFfN|4!A=kmaAIJP*f`CY14Af8iOQm+O-M7XiYBen+J1WY)HCw>ONGOI_*9H zHm~1%p6A}*`~08hHGGyZAwW7V;hwX3yK?k(*Je9ziox;_K@HN;vUQsStq*|MEvuk# zR-Df^jJRV86^GJ_5+SL@9fK}*yU(ee?6{;J0u`tl%Gk|C4F?kImoXm)`?|7KA4#X0 za1a^dUM+4)=9xe#gsY}T%RVG_ArnF>IGeKL=EfP^EDPan@mXAW01DG1L1KmR$aK5> zSN(!N(#b}n6ckJ?MXLL@Y8leA7q5@s#&r)f20YSWRL@-nIof~vT+5RN=af1ME<2_$ zkre?_Zbdn~>z8m#3|#x9?cGDPb{SuPMej3@V~Z)sgKHL@v9+R zJ!I4C9<{7ZFF;M9spxx>3$GICg@NLP7%C>^&$k)b}fD%$K;_jg4y>@eTCo>#9TC(XGU2)!VJnF^2lqf?CU-k0Zfh&Qgq@#Fb-kX8a8&5dAGx8es$|fph z)Y0_>AMa!aH?@q^vR573Nm%w|vb(3ZZCcZak%O^>NDcVFYFAFK_edERa$;Br?eJWl z!+?N44vpKzEEMSxh^2^RM6kG>33)Sj$h3wA?X#c^m7CYmgW3!}ae@($V)4 z(a#@$T{1{1%wialSX(FMp#05^6Nj3c|J1sgvWrBd!#lseM7#h*(*zq6yg^!bKW>Jy z0og5rjNRbV0Z1Z7w=sJFNKkJLthY-1jw6{UH6-t4?Sq=-9F_^ zuowv{{LqC52oTUJ!RQz3Jfj-j5Gm zxQ4(b;6|O4RG7If2bHp!ehqbiM5>YC*fa_jMC)6ee^t|l%z{@HKu|>VsEZ{+fKcKZ zEYkhd`%ZOr`grD=>(u>2$(@AbuTXQD=ew$p&Ug8~H#fs!>OrVb#5H7FY4+aUGIC;A z2rX*zNtCY5XRF|nWHIyMBE%BzEgxI6^(&~d4-l{BA8p*_!7O-I(XM78nlPObwlO*S z=W38IRU}r$2NJU33@$0;x%hx4}+F{fAAge_ggBapl6k!mpbA zR{`-{$v4R*gk&EOzO;nQGL1O36iGO|_mkOn;-3L|Nn%L|zy-v{GmucQwz^RUsq(M- z5Fkp(AXOA=8nM}h=F)zVE|yj@NTB5Ibal6r>XmUV#YSK;5tb`PUCao=D5pWGj36ipL9zY~4ay({ zNmKyYmsoj%MP?9$go#W)z4?PSt zjd==rJD)Qu1HTmjk+)uP8XPxkU1{U_(?7oqn=fkf$}y}ANWRHZOlhr;A6TB(s!`Jy zJ2=jOMF;zACsYD|$QYP`DCj^-5(*Ci5Zi~*?rVHV!N)?8`BcBEa5WJr&01Z@^IU*7 zg4N$G`=B1Yqopv3=WNzs4ZKHH7AItPx`{-M`hdZ_EmF`(}p?k^Nd!qNbT@{6r49ptV^12r!vq@K zinb!uASjmKzZ}gPlr`v>NjL@)*I1G%{pmt?k5zYqFXpxC$L|h*=dy&)6fy>7 zG@C%r1$;Pxd=OqIQ4bkM63d^<=&h5}Aq0qNWGBJ6Xg5dwACQ*_87tB>ZPN#~P9Q)y z-4&YdFp>j(X`0rcE|%^}_7YJBq;QZyUbK0~(sVo=s1XkEwQCwWe=+Gw{3KEURTx>%GhR@bq$27uIumJ z>UBaOdoZ2t@oy}!kp{XU*i>orRe7a;jMt3c+WUIH1US8sh zbUGduv8@Go6(TX^i#D&ri$(@H^-7vf+Y*#WT!TcE(v_yOd)b7%a+oPX&Dqm)XsoSC z2}Y+=J%pzKPRM*5Rz3%buhDg>CQ`MHKAQOlduP|1ICjQyz{W2G3kjrAn(*CDKSUS4gW$tCgm`?ryFsReRG9u$5?) z&oCdM_dT|cZ6M@rLZoSO{x^WlbNrmc`Eh)F{+Rc9xh?u0CJ#WA*fj2DhX z$)s@NIw%Z|a|Q4?w&wl%Q~+;WC@g>guFq2J+3CeFJfsH095@#NWuNazWeJLB<;*J^ z9tOjm!eEHAg(Jate(>%{+C4F@zuWx)TIDP{%u&?B2`6;-SEv&&=*WX1zy6B*a0;>n zeg5C4!Z`?i#a(;|4ygq>YgmWp(orOP)IdD{*LT0kE72TuZLlY&7yG~Sex3s%QrU{7 zV|c_}ya$=QcFUfVm0bbk&%U(jq^a`}Wz^htK-VKHz15n(6 z6S#fp6c6lm@33bn;rz1?yk0x+aSoe!Z($%;LRk;OK`PQteBlHf8q}GU+mZn971YKo zoJjF=1xiZm{2(W_?)ZI*T(D?2$*CAALH>x;fzU+@v^P%Cl}3lh&!`CX|( z>Xw)NbaS%JO)}(32D_ThIoH=W}wUNzIG6V1|p?>m!Ts1!!Jmq0NA0Rb#*cypUto z+hoqHEbW_NYe;+Z%0bMdE=###;hPrVdtoIg7zG#a*X7WHl8Z7+Q!S)wlfy)EN|tkK zW9eCf$FVxVwQ{L}a!M8D=Sp>F+8O6=E$UMRWYq4CRxxK+2F8?HO7bq6@Ed#&+le)$o{yYAf9a+E@_xnCdtutJO+R6UaXQjPuNUn-StpJsEvq7EaO>2CP@+1;P)L5Us5FoR^Onr+9 z<+@q9dnFPA1nH__9<>4j1PSRe1A=bujr5dt6CillhJ^HVMX=Wb!t$x8D}aRbB;^W- z_L~54(CB9QNKaK3$IXBQ4M<2&RP-$X@mNqhAt68zAV^3E5F{i72oe$k1PKWNf`o(s zK|(@+AR#>gKSgs`TnosH{^gLhXZtJY=fOxbk^P>4glBUl%b)dX z0U-Un&1u%^h$%m$w_tZ^7|dcb8bM&#LTG?EgJw)e4!=8dNC=RTPH*Q4O}z0|fNZax zXNsD#uD$|@&jbJ=%uDrRvkCV#lRQqyfb1VOi|W>5GuGdh0TD>OuSXj|RnBx3AtwDt z`8@3Om?0*FxoSGy@Yz&CC?Bl=LSaUO#b7mBc!UT7ZV zWDjIOc&CXaFrG{oUA04pyl#?8HyMmq0BJU2&oH+jB;C9%qql}Vx>4xX+8|Ya39S|PYKNFFW1YlY%xJ&NRL|&1_*7pWGcG+ zB5t}BAX^#I%FD8n4gUlnA>(0|jsiK{^F*2*Gapm-m)8+O>^J#)G3igaG*%Ksu`sNe<>fgDPcT87C$x9%7%~Qk2O>tPfG|!IC6#63Gg;D~#)7nmcNQ5!1;poS zx=gY&3#%z3$O-@iL|`6=C~i91=}06NaQAvvWkQ6>_sD~@BX>6%fP4Tztnd#W?Y&OC z6QB3mOp`IMZT_qVf=fG*Aa3% zKp3(U;)+?J-EJ?%M*t~R>y2JpQmoh*1%#jz>1sRCbGXDr%+`j0VD_lX8?`At+wK-! znsh*nP5{+>z)l#PlYlVhUaQj1gaRzzYn5r7N4*FEayLL|3)WfO(9|lKFaU@|i199f zT^dUqBr1{ zrbAYA1Q5(*lP)b7d3!1nPXxySArl+5aEv1Z9w!0>0rD|`7#aUYC|OgKtXE1*q_Qj# za@Dmg9gt3j3VUQ5dl;`y07CFQnN5=+fi#oi$Oz)F7mYCAWco57>69z#b~aKG2ndfG z8gY?TI<`$z4aHz0qK_cz#pzTdUJ{L$07-^vyM+r25JZf1U1`sm0#G-a+ zh9YZDvgjr^0U!(n#Dx`knD1eF1Q1>V#2fH(y~I+lR1H{pwKr=|2tJ(BhLBVj00Q^$ zgx%&W#sA0N*#I?>-2r@e`ABxV$r1w_kdPn&1|mu#keG0QCL)B7T*T=q12~7Gpw^0@ zfOy`GTBwR=>M4$2JwXwRTF{=OXQwiHhaV%y;Wy&-!yCn(6U28w z5O5^{L$KhuR|*0QDJ=X+dRBD7yu!kHg^6rmtQ1l}c=Kg^7K$5^6=4clpvdCO$P`OU zx+2{)-V*Udq-NR#@dqo*=(H%FNXQGGAmPO;)BI5Dhu9$_gww1<`uPd%)}RBG?`B3K zcB=|-F1s7P5~(6NIz1yV&oG;G{7A@{LB9 zHf^h=>pCk41q30jyG;5Dl+l^dN@W?CPdUN}63-;q5Na7gVl9I3>9pwZw6rv7bO6PR zkB-8e90QUVfazfMB7+D`3-_~6U<4s8`#@^a`~=d>v_Nm@$C!o;mAFq3oRBlQlqPLl z_&9?)bVPyxMG68n+JWBdj3B6h@Om-0%DQX*BuTM?Xln}X09#rGVa8!eG?s2%fjp85 z(1=jJv%y+}kH`x!zhG?8iUQo*HayIm!yY0o1;=fVW%yL28wC-w-P~~+1=V)0LLEFp zK@zn!+Qb<{1$l8LqE>8zI2kZi6Dx}HXSTpl>o(v@r_djJHKXX@qa~mR1OXpLfqj5} zjB!v6&s~BDh!BH86%%g&sKR}-MkI)n5rseyOn~{Klp`oB2s^H7;9nvmNJFeB(4Sdj zVE710jUF-x_d+Si8w803x=#?q5SOY>FN-soOmUgqtdW->g8+gom5aRx$_;z4r9cqJ zEoLM&)FK2Ibva^hJ_>o0pa=mEbK7m+&}l(}Kuw@V5F`*%BdKEbtahX|2?)YgXB?3O zL0TO*+0@fOq9o;p!$rYM<_!}Bi4Sm}ApBsJ$&@!ys!knQ39`2*$q7BHYl)Y=Q?YiF z(@m1PQG$T4oP>-XWP%$@5F#`rOJN8rQyEm_yk9AZ2t}4SMNYgNx${j32*f2|?rcfN zB@^P~<0q6w5;Tszx{5_fggVsd$gqYRouPxjd=S@w2aDZyo0m^$)J$*pj2JGBSOm%9 z46$HML4KjuWK?rVGTyk=T z1qSn5lKn zI%Ah1hi~15{ND+JU@{-h5MCO83>5^I7k}Oxt!(NePznQC1co9Qssl3wrIVvf$%3L7 zyNKcQHYl~F&=H8o3xd-_-goHag`t-5Avoe#)v^~ve&@oj`5bQ%jf;YLa=kXun;Z+;z)*;jis0zdyR>m@)qkdFSte#f-|<6W_dj{`tkT zMyLqHlLe8NM+$CqzoM!miHr)m(HA<67WU!8336gzM=dTduiJC%-&-!;`fvNO{p}mg zf2vq@>CCFeuAf!!`y!z*`qi%ada>A+>%0WXUcUYTHgjA0)rY%sw{^8vRTr7> zt|%FQn6tmvoR^W8eBj%=D`q{sn7cnlTPlWnKs;FxJbUr+WzXubcB7MgVs!|~*UR}N zA@hpW$w5LXE}JqH{KOmUPZkM<5;47S>&p4MNj@ohHrFu*DLK9@ck+kpt~{8>**5;^ z!)v+4T_03cSD5eqV)5m}J}tfG%Bx2CPr)K1NK5bh<(h7IDj}XNNaLBAwIFOThdrt( zUl+Bc{OcQ%uge}aFbNIiU;MqP4Wo_qpMA-hT)XbZ9U#bZkgW-%#y1J?{ zuClchA0h}aq_|OisH40tPQ81^tbaT@nE&41?N_eeyf(iitb)5ism)iZQ;Tk1Ybbx* zlv}d1EBxA744zAfCkN@casAQr9r@>qQZ}UCvkCIxVDZr+FLGgZdvA4DM=gj!)TYXN ztRP>VI~23?z>f2YlO3yAOf5^s+!I56*(rv|DIG%TFeAdWf}kiO=ll9Hi_AR1=c5#C zb%%JiAefG-I(?vS&(nGNr#AyZ76L(jImftu&pq*ys;$W?)q%EBP{rCb#dnrfkT{j< zz51QIoA&CR2x4hBu}v*4=mY<8YfJjTJRD^O@o+)17q$I7rKRin$+?_WpWoZ@$%^+I zKL&yvTy=6YXVSv0pXPEVmohO(1y0)pIXs0kb>`IlrX#gD0(|+od0`Vje zR|VihJ|x9cM=-#&=jRk7fMm>?eZTr5|0HJQobq=1qH)SL8(d=kf>OUk{BmV{DT#^Fo_ zadfs96HN1c^)kL*{uYN53(`N-zX;MpmE#}~k0M+t!dxNKK=yF-oIj}^r-J*g-Hn4+)lHVAa8NzCiL|5bS4a?lS%6A>1=LJa7w3b zo9e}!$?$g&^14`iEfKD02azZrd`?b~^Q= zIcfF3pdb(z2}018s?jI~;Yo3SuD?sLD?zURaKC2-&;eAJ*a=Xjxt|pT(0~0&C*w}D zC7sP~X4eEu>>?BdGI~KYK{SDnz66m5V7SYg^alh13NSh(C^CgtRSS{0bGB}ivd z&zIUGj3GTaIrp2JJ9GZW-nj=gb>(sV-UI^oZXUc6P+|%M9E|L&G(uLGq?V8xA}`|z zNW|eG#mBM*6e<;T1_TsQSt=ci^0a`WQcF?Px~QmSM^7MT-HzzmAnR9Z^C%@nCoSSnDQXP?&HU&s~dUW6;JrEEmGXcSog-+hS z#Io+Q00=VsfCRN@_v!<*p{=jtuG4Z6o^L;Q*-- zkWf7cLkQn0Kphuk&<5)R+D3Ys)N#oz(oBOisb#2l_}>r^D6;^eah+B>aF=>7L@{at zGTZ}hy5!*8R<*8oBy(7oYltCZke7f2XoEumAj1JMal?8dO#q?|HGroO5GZp2$y$zs z!yEx((lWcR0;1Qo8bF*rG&B@90-|z#Z%d3WXdDm_f;8!h^tw<$gubbFL>FWLF$)9) zYL)=OSq?aYq0X+fxd4RNOcS3OARx#9&Xcw%cUY|r8qOR6$=2K?5)g2j90Jy5wzdWt zbZtR2RPlMCP%TPaV=_nlQd4<2D~vM-J{lnSDU0#7^Fj)Jn12r;Dv=@(qnG8rwfQf1X&Q0U#L0M467_6r3qc)cE5l+eAQSBwJh9qEJ=|2+m~KvceT& zKMul3lqdpyT`!e(1T$XijtjuiVt`;A#u80f_)B^5 zoZWnvG1({t1d8H-(728)9LIbud8rA;p)ZjvWAetgUSncPu~E?f9xxz2JURyg0%Zk&U^JFH$%SPB zS;(LfLPaziZ_&7G!*FM2i9<#Jwakg_FI&Mj^=y}mKX zYlF&&34jpKn8ex+B6bL3Ey6fU0U#{mtHDG<8+r!9jGSQ>JOU8%&t<^R8ml_WloQ_s z6GfojNt@0dAT%O@f_9~aO!TwH8hScI^AZq{{Xkj6*BO!VKkvfFsKUsfWn}C~VL&iu zd`I+-*nwwvisabK0#7XbTkC+20)lPbS05c+Q%?BVqJd}sIwm)sdwFO?=UoCK+L~Q|*XyURo>y#3&McW8EONG(^Mk>%agNSY(I z-#pp5CrM6SKtx;jRb^)Ic@e1Lp)ZJ3dJrCIFJZ zYxyH=UA;=YfdFJ2L&i9`^^Idnt)03))b@7)}JNAZPZv*6B$p%2z z=l^_h=6wHP=bc(rL)K?k`wP1E+&o=cj8PYmPxhTZ0-o|xJ3yg3b0Yu#qPnsFL}y-M zXYA#{nyik_<3t_4e6tQ?fbdpbjFPD?{AX~R=gr3B1y%P?G@dHxzHqPP=r7gHwcU9h zn_<_rMnEw3iKCw1Ke+hd=EF6I+H=-js(CVa>#vnveqU^OG-^R=j#OSrfBIeQAyr=5 z$*VuscHS$}@TlZLXff<4kfIKPLbL^XL8SpsD8Z$xn zS-Yv^RCaXw50e0rw6P<+{nxVm{<81;4;)SceeD?NTxE^-1yqkg2AkL0Zea}^I1B)} zv#;^~zH4KET)X~3Vf$otm>7d37jpn0@4o^_du(4H;c-C+%Sv4=(WWK!d5_W**Y>8C z=kNaGiKEXe_5eV3G}IN30uuXCc6%wCxr*#AM4#WV{*x2pmW;Q!SS9I68EKC@Z(qFn z;!=Kp1!+N!Ww#$MJXy2i!T;E~_L!!!G)`MDmvVW?Qo&JRK+vpUZ?zJ*ZW_AK-j9}_lPUAR8fpqy zow+NMAZGN0Q#Wnmhx5TAs?vzm#|}@owM1PjiuyXg#Q|OiIdksuzvbt4Dy49`yadx{ zdNeywloczOpJF+}iz9S+h0qfKqtR#q)EV83X+~!K$+ zOl^Kgf-qy>8^9bT^Znu7AipPdsj!R=7Y2N8u@QZQ% zrp;D=UcV|PHm18iU(UOEjf;UG!TUF?PzetA`oekXD)0wtOX;_-Sm*zs0>*TkcbL5i z5yUGv$m1QETM)EBYfAE)=z@ZNqe_^^s+iiCn%EBFzxrs{RWT{C-fB_=@nX#r3zo-D zuPuhm+-_T-$O{y$%Bn1%IGPwi=0Dw?h5A4D*{FY}u;ZRDgwK6Y76JrAQTPUG;8cA> z84eHnH-q{e(d(B=*De`e(Kb4puK|Gv;sfQAQ5EqLz z790*@m64GV0tiwmaB(70BF)Lgfrp}m4LIQX6TFhfgJ20;HdK4^7L1j-`|_~}w_$Sv z$d5ARJGn$~QJe$OQkX$o3xLn48F;A^hzQ3D1c2eromYjyfM$dMHfLOjIaWk~`+S{X z2~*siy;x~!1kbohB^;J_4DmD@Y%UBu?I6^1W=89+`-dFd=ZAo648@H04@i(b&Te!E zc$vg;*9H$j5Ni&D!vWc#<=TzgeNgf7TYjP6rs(?o{FFyKt*2Mq&h|5 zt{W`E5WLirjU;sg_bpga02ft7T&+%lEpiWE?v-+(A29R7*`TqKvRkK#aIbQF&RxLkKXdCI2n> z+Zs@OIPdSEU0^1zNlu}xJGJ|4=0uaPYAoq$NI3(h05(6Nq&7}fWBOvLCbIH(koER9 z2Ddoq2#yeEu7YvJ*_lrc zWjBxrMUc1}DH-qmSu|cd_2w+GckOs|ytkcGMKX^?5kv~=&k!Va%KI!&GLq55Oqoluse1RLP;?%)x74|4hTF_o@cI(UahGCD|pamK?+c~%U-SUc5Wf6!vDQ?@q0 z31L}qbTtLP)c2ik;uL$2$AAJNs;s@0EgA9d;TA{2s62*YeuWQsP(4_};+MJkF@DIt~7>$;0tW-6=s=8R7bo(a8 ziH||k97)0{0tc1{&_k|U{#wykk~$ufI^}k@(!O?TJO<5#rWC4UaG1_wE0Z99a^B*z z8SvwI$VO*C5FbZ#8^93wF~lYu>>$+_f2wG2O6p4vdPwqBr(RrZ;}(`FNKD>+x9e)~ zSfsexe;`K=)Z-+Ah^uad+&Vw034Kf^=J|zaKQ%!REVV08lvR?{?H8_<>dG!m2zwPD zvS#7jxNFHEokEDt{*tI`cV`Kr>y|0MJbYXvN`6))>JR%GoIy23koK@QGdsw$VT~-m zCHtJH;8Av;QeE*~2^v?G`_lpRaGgx1EEiWbq=4lls!y5qOr?>Xj+OsYbg?|X8sw>o z%>Z)pi<&RUHxC5u>Z)3?w$QN!H9F^ z1CLZU`~ixdE_F)gaDb zbZ#1!dt*3OSfE!Ld(EUPhUB(0O`&wemO|T^mf+=4DVAU{6!3y&Kw7Bnc%?$s@e(NI z(N+cx5hR}Tfdo%+D+GrEr7iBk-HI10 z6pFSKcMo1@fC9yfyB8=>;8$AQ-QC^YZaC+B-?{g>|0QehH8X3inRmVO?AdE;SEIp9 z91_2HH&M%6y~OiG7TjfKHbNx>6&jzw9o1OsPhPeyV|{#|<*F00q}Gg7fgJ?~E~ zCRCJYnmOb*{ZjmNCjg2Clux)J{Ysp6J(OCb`;IWEkz6rb8!Z~}%17wfY)=TDxBR;v zY{cJEUb`hk^dh*NoZ%>CkJQ0nL!i9Qk_`Zj=?U4%ig0*uBcu6l-&;N*s;k_tTYZv~ zU1m{*$$dKRom2rVc>1~CMs&dDLrx{Fwh(sWl~;bQn=(dC*~=KyPloLl4EVllZMnK1 z!^bV&bqkg6*kG4iF|&7!H$3f9=N^M6fxC=_(>iMLKU+#@gMzK z)B_ckQ+v_q%9(?}I8*>_ayq}YHp!qliLlkqz^rgTw;FDH3;_K}Z)QBqm;7soe#4bG zk8KWS|8#M$v_}jvqj|h1=`V^1fzI-Xwo1&oG}rMt?L>>h8G2)WO`P`IO8^$OtjWU7 zmJZ-}Ee2I$p+MbE91WQfvd;{yiX)UZhpq&@LNi!m!*t^rof8=qRhKkJ772g9$}Q_M zzQcA0{KN^AgqdYoRoB{>+j|iN#_2UYc@DbNM?;sn%OZShuEbBTk(*IyhRANs_*<|n zf2kWn^d&F@Unhn6V2&nyExI(GP5anJbHzbc`x~MYHrOf|KBl^~u&+lAMsjrfm`aM!|*Ep4jEe zT#j@x0N6j2ZXh&9!youitndlmCv=ozBReOhl)CpNmSBFIea{H}+(>jRcN=@TcYELS z5%k-t&@%@)YR&Z6!%wZsf=nr$doy^*KcRk(hmk=o*XA8Mp2&g9uWJQO#EJlzH~}6# zv?}OWff@}dE!Dw>5z%`)MC72M!4Mdq1!84T+j#$c6(1Mu|DyB5`Zwp7?E`6{zNFR3*ct3o*rQod)sQ#S zSt36Q8jkC3hiKw!2dZAvrM*$}l&;ea*vJ3jU@#ayitU2{#$XP79Pf>1nZh|M|4KmBAvVJb-)ecOlI?&n(YL{TYZmj(UivD*x3d8FV)a)1 zgTKz}KxJIu_|zm!yqrG{&k!GIjSF70G5GMg_&R=z6ebH`)C_*7BUdFfk<+qZOPZr2 zF!}3a;h<*kV7((UZ*}BEvy4>Pbz@2!>?(sLNI3RI+-gyr6fWuK%JH0yjct3?Qn(g? zCL>J*UC1V5;||qT@q-@*Q>L| zuJJiDd-2)oW$22R>l!_yJrGva?;6BzX=xN&c76GN+ zb}S1g;>&chd|ToO>G4Uf5Q^0MCK<)`^#x^>>3%Ms^pe5Ws^$+JhQnC0^ z$eSJ1cd6112vORI#5IB%e8rO?Eajq?>Cf9W4cVMO}iFrzm zmZHsDVpEKspb=j4DlIN*zq#t!UNl=Lto6mSCQ#a<_{Q|GBd^v0LsH!|&qQxu<7b>u zrmD7-epWQo#C2wy;!3pH+P?HZU5%Dexw)xDj$;HGtzSY;GHjK{&?l-zD1;hwN!8YH z@fxavNA@vZ!qhLuIys6*Tiu^EhR;yEW*r>V|LbSHrE1th@yiR8BO`jMnSvtk* zMcXcQ?Vxoi<-BxJG2l&=th zX7V)dne*I6xylKx9Lr{$+5EF8=C^Tc+*r4-ub+Hr{+&TvwgTs2iF<3hwsU+Bc~T?w zWmL9Rn%kpAD#zY@NSK*^@z?@#J^V}!yGf%LTvp-y{kduUeJRo;T6$63#nax$smnV6 zsw^rc{CXsPovc`{?+WR4Y<%;MoZb`rgTNCz8@)~?W~p|0THcEVzpezX!6-9H-^Jpg z2c${~4n3Ogy42mLxz&?MoZIkYVjZ1b2q1c%KiojWNrUjIkY@)t23V?D-_gnom zGzpl9S~MFsrtGb&hmZNOA>J|kZ^$0hu-nI^cKv3+9s?T0GHq5t>!R)aKJOg7&-3Zq2%m%vFa^eo|*VG7KmXJ@LG8z9x7%%!y(&O2YXvzyXgh$T7{Vn@X+LcL^`Et)XkMLAE+hXV+mbk4?Z> z+_T_Ihi@bzsb%rVf0)Ur4H@q_keAjIQ$08HR!|mIjjN7g^UU1q-NosNEJ&>8OM2bB3VANKM?I(w&`8QM!4MIJEe>@2e;ZE?Vs*5;I#&=wX~7P z^oyM1=~UEl{k`>@Pp7FNx{By>-YXy6U+J$#@Q*>?QtaWREw& z*9ya5%(q#GCbQiUu{jkn1TmNL&C+ng0eo}mk=GN_DiP;=Y&Ly42R_UTJ!uZh^X4Ji)9P%w^YaX$0sL5j9lG}|}PMG?a zX}Fg75m7BfHFAwn+ z*wzi06LP+cv7fw3eJ<<|1011M3S?{Dehd{Ei)GC=d$+~rih~kUV8#|QXd%o@-x#t! za1~;pT4wOKvWmd=5Pk1j^=a43bM;O$_^ z0{JBxRKMniFvJD$@hT1ifNBLLS``e~+*-Pj{yXvu0+&V8C^8Q?twhNg$>o2zc7KXl z+IswBRh9K(Nt87o3#ALnYi#6Ta58NW2103($iJuc+0|;=Xb>Ruh^fxg(asay*fA0y zEn@xWG6oRHh=(vE523e8{w~`d7AlSSvY3bliDiXG@P<!S9D zSpze9_9I_r)RAcW)qKc7HkaS%hSyab=+xP*06+>)AZ?seqWny`ho;(=W!mofZ%{6! zaCMSd!d@b!>1;}1X7>}ufXSP|S(Ci(V)&)}uE$$!BAmD{KRn}OGfRx8kE8#ZVvD2O z=@u>(Hq~kEO!s6B5SYUkD1a?=ziYbbai!g{G0Dg0kwD`@$}hM*Ab>+VM(V3seSj@j zDHCrp`_K_ZywT2%8ma=CY2^4v8}*|UEuWo6$_cml)Z!1nUe@F+DzEg;ER2$-i_Oc% zy>k8Cuc8~;&}_I+^G5<@I5|?3UohG1q!_*&0o9cX$3z3CIM<~8 zv*rQxB{vNnS97jvAS8BFEbQG@(k~B6aGHsBs#i34_-Ji+=8KIGnbYq2&IwmtVxwit z^a2au2`M@xmJ(XK|4G;NGIs)DS?La&=+9^%QusP`+&2Nc^`y5m&N;? z0YD-a!>n_WH89@m*4PR)#R&@v8gl2Pezu79T>tu= zRf()#U`t-=coLF{YK%r+WoHeiF+pp!kD)KKYd5f{zb)NEVH-C(jU;&&4a#`+WVKq2 zvaYnG(`l5phL`W_T%V2D&H4OkKjwwC!3rsA5i>f#+Ro&v%e7ZIn|xR8Zz3Ojnr&CI zlUKr92JUY{{w84JGeBa6ko~g@d@Zksbf%6P2VdRvB`>$JAH1!JO4`A?V%2MCr{ zZ=Z2{J5t*%%5V8}#-~8`+x+~uYuT2@>)r+v&x-Ki99#rpfO~XJ|A2v)*g#YDiH-Kg zw$nsPiU?2N*Qt|kltFj;CCi3or~n(!we6RnlQ|n4+%HK=*e2w96!$ph{EkrJV6=vT zUV6Mzfx2L!0;DmtccSHz>sP<55a!!-2Ob*Qd$t<{D@3OY*8E)M8U5Bpu_?Y~)Bzz| zI2wnUiw?$)Sq->kKEmwVVDjFe_h|*m0wi7ok7pm3H!1``6r2D+Xb==Ap+OM<5FJ1Q zf~u(lMdSd?|K7}^4kI9AShmNyLN#L_VFOj-%=P#y{LRxx7z&&xOukO)+v56Q^Bz^Y z3VXUr2A@mJZSx>=MCd|s??1BFLb1*elr024;mK2St(JPB1eNiW!WZvk&+eDqwMYc zR;^1_5~-*}CbMn+sQ#J2Vk|Si(yz z3$&zAzC$kdj-iV-W2$ztg^>OUkOaY6-;{8xp5ls#sIH``C1`X%t`*-FSR&KnNIHYJ_8~VgM7^Us?JC1v^3PF$%F&;r%IM)_ z%5;V3FMkH5w_%qkvVyqkWdQV==lEBcNSi3*JZ$NLPs5lX7-D|#=G#IyCHd~yj<$dY zFA%BGa^Sg^H9SAB6v-^I!0HbR2QJlB;jU9~_hOQuJvykF9P!@j!HecFQO)B79UwtC z1C9yp6nyYhXj067wEey$*Ot`RtK%YI_6K6J;9MIu?!RupxZAT6BmJ9Xfe2G_PZSOk z*kbGIS%+j=-8&5tqYxC`^rTqG>B|Qzr;7DKTy_F;7eNJe%o+{04Tz5JW5D=y?M&92 z`J2`{M35I=H@bq`mg}c2!~NrT6(*Q4`DJ(nS@~|~zVNPdURpzo)5uuS@@$P|>UlyO zIPt;eLIRA+1=DclmMK4vp5bW1cS(Cl$m-CUW{di-#+s9rZb5rbR95j~X)5wE+Q8_T z7JV>mK3&CsB7c|vf!6lvnO}p?yBh&?)NC*OU}o{j5KTO=K_C_K!p)MrmL1Aqor6A(F&%+a?xFtVuT#%O-UsM%U+J zeoX~J4(k}ckvlA?{KJTkc(Hl^XMV1O&w=I>b<4?((LnPrAs)fqx9CMG?ha3xUTEu> z^}wm^MCf`9dUN1X{_6j{B_zj!8Ozp&e2s;EJ+4(JA_1`)Q6)zu=%OX%Rrq6)tXTwv zy?!QCSd#pV2Wzk2Rg##n6s`Pc`Fx@v#@Iz{HS?XWJ zw%B|S!y+AZkzu{+U(G7kjp`v0d!?@_b*of_$Lk{4Qw{b&EhRu>82jd%9 zP8y7nQQ}*0lmx#QSy}2Uc4B;hgc*ipyc^LEp~gU~-hCRz9Ea&d^gLrgpfu#~tozTr zR^7TAX!T`N6_b!EyZ<2egsQ{34B2f#^@ER5>dRlPF6s{VM1&?m=D}sY2 z(W@v0gDbXp7t|iq?WW#F%_MMSL7v`uo(q-YIF0T3hsK|| zt1(MewMQQn4-DKk$UPgS+-64I8aeX#rmK%M?DrR*m5EiQ@}NTqpFksKCpE@SyAY8N z*Et?j>jSBl1E|N3O?CNBXEB-|C4^$A;VVw8n2VA6Vm?_*ssv5NY0f&*Q=5 zmEo5%ok_n;I3AQX<~fDm6qE8?ru1ve`2XStboRTPTs<*wc0AhiB5?&s&;upwd+al& z)muEyn+~&#=IMPS#*Ej5X)x$ZByN|w&s(00sNY#{6qTt(9^aBYhK*8Uv%R>9WZ&_w z3pO`;5?ok%Ynqa8E334*-I8I~a<;mpFwh?AB{^f6kZ$Wc%YCAV6U9bKNCFLfF;0Xq zpj_oQPI|_mP?+|X*tNPcUFXI7!qB(5t`}6@Pvva#^4apIE9K?P&?T*d#arjf1)}|+ z_(^j31w@rBsrg&g-V>Fg(VZU6sCk09+Om+_;N7^jQ)~HL35>#-p_y}4<&^7P?MF_U zbI^Y9X7(J6*4g#<7sF_2e!@4#cT$!cGQ9zR3LG=#q%qDY1RKS8KTek63dRyxT#e?J*8u@NQDmIVfUWA*Tf14Ps zT!A%c)UOEs+myn=!AgcLgzWESc_ARuw7-qew-_Jgi!E@h*{JoEb9<$+lylslDb#l3 z+JE&~(x%HMhxk~8F)}>?gu?tRI7fCnqnsCSz5P4PM;98$(Nu^U{1a?D{KQ|~IhoCA zUELyKxr`YCm(NxdbGH7;MM@|Nm26cEiHrw82!)YL_I<*$eI96_a4g9Fel%bejGp-z zpk3ZrroA9z1_jh{cgDxH0haVo6atR5;B}Bv#mIzu4K;7i-()QO`ZT(?X%dQS9EoZU z9jU$+klVIEJqzXG<`91?&xosV<$G|pU}xp)SQkaBL_VzR=HNTn`|7bpbjcW|I@|TG zL>||f5uDft>*u0Pu;S(G#!^~NE35R4#g;JwLpbLN#pkoc_gOnlWNFbcRo@leQzH6W^NXqL1mFoWq1qch*2+%wLW3&w4U1$x4XAE zJRB~YuDb4PJg_sUqsK-(aID-5J~$7RjWwAhqkLwMSLK)PsBpa%qTM5DYujK`?CpXc z@PpP6_#G#F(tPQ)vsS-n(X6uPR$J5VFS4&^ z$bNE488fKL&dQd{_G2?(NPv}vE^>M=s^@pLR85%_L zKR^FJH{OpkgO$p&L*gu075d61oQu%2x64! zYTFYQEv*GWuKiNX9FDwb(fYUZnsBF{lwC~$H z@5@ldB@$@Zkj+L5*l{^&4>vz5EPW?h)8)r^iyJF3;ObfEM|Ld^Rt>Wb*RAn><_@4f z3k$cAAJ5t2iTur-ap3Kxi_R4Kvta?3mqriyO*eQSvT+v$eBBhv-0FIaY=%!wdY75y zMw&mFR+Pb*@;VK9tt~Fiy1tq^L}k&BPYr8dWOcTWXDWmH@wV)gzt?%%m%)oE9G*%Eb{Z#6>8JXID|5 z>eK0yo%nlh@m{s(y#ua>EK*?bdV*Mri6jh3!YvO^k;pT_>uCN^juR}~EHcxWVoKlf z5m)qvGUJCi*N%3tpKBGP8 z5QLaZzz|k1!oK#ZuT_1?(hpi?C&RPzr$1nf8CD&(NX}a2mD_vRW=z9X!8FtFVgY$? zPu27Bm^9D*bNwk6f9i?+vN4Boqu?`#6XFcde4q5&7kBW4P~(?|j@~pEW)cY?NBd9w zTremISWn!Ep2u-1OV=ESf5C|qNgoP_3qOI}E+pv5sO=A_9m`RD=3v?klYo6P>C9|m z5_Ud)+e8{Rr?)<}Jw7lV#FRi1pbi1?VQ?MX)~lM(HU4w5{D;ZYDVJus3nw;G7FNMl zbnK#&YvfY(jI=zRSZO@I~rD z?kopbe-!($>Tpy7#$z^vURNl9_3{bcXx+HmWdumU0B&2^S<0=rzzSnp z&quaL5#<2K#cu=33NV`9OlZ!zM&|iaAt8UN1T_TY_=BMCXXWYupP1a|}v zT-B8PIE#pD>T*E0QlK9b`RC^u`b&pXM;Jg*6;Jv_@;Hb-AwKyt01jl!JAfcKpY?L1 z`Lhk^b2!*0=w=FeAf$l+Mua&HI}puZm<|d60sY|sCS+PfdDATs7jYfz7708<;YZB