Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 8a397f9168 |
@@ -1,16 +0,0 @@
|
||||
BasedOnStyle: WebKit
|
||||
Standard: Cpp03
|
||||
AlignAfterOpenBracket: false
|
||||
AlignEscapedNewlinesLeft: true
|
||||
AlwaysBreakAfterDefinitionReturnType: None
|
||||
BreakBeforeBraces: Allman
|
||||
BreakConstructorInitializersBeforeComma: false
|
||||
BreakTemplateDeclarations: Yes
|
||||
ColumnLimit: 80
|
||||
ConstructorInitializerAllOnOneLineOrOnePerLine: true
|
||||
ConstructorInitializerIndentWidth: 0
|
||||
IndentCaseLabels: false
|
||||
SortIncludes: false
|
||||
AlignTrailingComments: false
|
||||
|
||||
SpacesInAngles: true
|
||||
@@ -1,49 +0,0 @@
|
||||
# Use, modification, and distribution are
|
||||
# subject to the Boost Software License, Version 1.0. (See accompanying
|
||||
# file LICENSE.txt)
|
||||
#
|
||||
# Copyright Rene Rivera 2020.
|
||||
|
||||
# For Drone CI we use the Starlark scripting language to reduce duplication.
|
||||
# As the yaml syntax for Drone CI is rather limited.
|
||||
#
|
||||
#
|
||||
globalenv={'ADD_UBUNTU_TOOLCHAIN_PPA': 'true'}
|
||||
linuxglobalimage="cppalliance/droneubuntu1604:1"
|
||||
windowsglobalimage="cppalliance/dronevs2019"
|
||||
|
||||
def main(ctx):
|
||||
return [
|
||||
linux_cxx("g++-7 14", "g++-7", packages="g++-7", buildtype="boost", image=linuxglobalimage, environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-7', 'CXXSTD': '14', }, globalenv=globalenv),
|
||||
linux_cxx("g++-7 17", "g++-7", packages="g++-7", buildtype="boost", image=linuxglobalimage, environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-7', 'CXXSTD': '17', }, globalenv=globalenv),
|
||||
|
||||
linux_cxx("g++-8 14", "g++-8", packages="g++-8", buildtype="boost", image=linuxglobalimage, environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-8', 'CXXSTD': '14', }, globalenv=globalenv),
|
||||
linux_cxx("g++-8 17", "g++-8", packages="g++-8", buildtype="boost", image=linuxglobalimage, environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-8', 'CXXSTD': '17', }, globalenv=globalenv),
|
||||
|
||||
linux_cxx("g++-9 14", "g++-9", packages="g++-9", buildtype="boost", image="cppalliance/droneubuntu1404:1", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-9', 'CXXSTD': '14', }, globalenv=globalenv),
|
||||
linux_cxx("g++-9 17", "g++-9", packages="g++-9", buildtype="boost", image="cppalliance/droneubuntu1404:1", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-9', 'CXXSTD': '17', }, globalenv=globalenv),
|
||||
linux_cxx("g++-9 2a", "g++-9", packages="g++-9", buildtype="boost", image="cppalliance/droneubuntu1404:1", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-9', 'CXXSTD': '2a', }, globalenv=globalenv),
|
||||
|
||||
linux_cxx("g++-10 14", "g++-10", packages="g++-10", image="cppalliance/droneubuntu2004:1", buildtype="boost", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': '14', }, globalenv=globalenv),
|
||||
linux_cxx("g++-10 17", "g++-10", packages="g++-10", image="cppalliance/droneubuntu2004:1", buildtype="boost", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': '17', }, globalenv=globalenv),
|
||||
linux_cxx("g++-10 20", "g++-10", packages="g++-10", image="cppalliance/droneubuntu2004:1", buildtype="boost", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': '20', }, globalenv=globalenv),
|
||||
|
||||
linux_cxx("clang++-7 14", "clang++-7", packages="clang-7", llvm_os="xenial", llvm_ver="7", buildtype="boost", image="cppalliance/droneubuntu1804:1", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-7', 'CXXSTD': '14', }, globalenv=globalenv),
|
||||
linux_cxx("clang++-7 17", "clang++-7", packages="clang-7", llvm_os="xenial", llvm_ver="7", buildtype="boost", image="cppalliance/droneubuntu1804:1", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-7', 'CXXSTD': '17', }, globalenv=globalenv),
|
||||
|
||||
linux_cxx("clang++-8 14", "clang++-8", packages="clang-8", llvm_os="xenial", llvm_ver="8", buildtype="boost", image="cppalliance/droneubuntu1804:1", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-8', 'CXXSTD': '14', }, globalenv=globalenv),
|
||||
linux_cxx("clang++-8 17", "clang++-8", packages="clang-8", llvm_os="xenial", llvm_ver="8", buildtype="boost", image="cppalliance/droneubuntu1804:1", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-8', 'CXXSTD': '17', }, globalenv=globalenv),
|
||||
|
||||
linux_cxx("clang++-9 14", "clang++-9", packages="clang-9", llvm_os="xenial", llvm_ver="9", buildtype="boost", image="cppalliance/droneubuntu1804:1", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-9', 'CXXSTD': '14', }, globalenv=globalenv),
|
||||
linux_cxx("clang++-9 17", "clang++-9", packages="clang-9", llvm_os="xenial", llvm_ver="9", buildtype="boost", image="cppalliance/droneubuntu1804:1", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-9', 'CXXSTD': '17', }, globalenv=globalenv),
|
||||
|
||||
linux_cxx("clang++-10 14", "clang++-10", packages="clang-10", llvm_os="xenial", llvm_ver="10", buildtype="boost", image="cppalliance/droneubuntu1804:1", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': '14', }, globalenv=globalenv),
|
||||
linux_cxx("clang++-10 17", "clang++-10", packages="clang-10", llvm_os="xenial", llvm_ver="10", buildtype="boost", image="cppalliance/droneubuntu1804:1", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': '17', }, globalenv=globalenv),
|
||||
linux_cxx("clang++-10 20", "clang++-10", packages="clang-10", llvm_os="xenial", llvm_ver="10", buildtype="boost", image="cppalliance/droneubuntu1804:1", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': '20', }, globalenv=globalenv),
|
||||
|
||||
osx_cxx("XCode-11.7 14", "clang++", packages="", buildtype="boost", xcode_version="11.7", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': '14', }, globalenv=globalenv),
|
||||
osx_cxx("XCode-11.7 17", "clang++", packages="", buildtype="boost", xcode_version="11.7", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': '17', }, globalenv=globalenv),
|
||||
]
|
||||
|
||||
# from https://github.com/boostorg/boost-ci
|
||||
load("@boost_ci//ci/drone/:functions.star", "linux_cxx","windows_cxx","osx_cxx","freebsd_cxx")
|
||||
@@ -1,3 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -ex
|
||||
export TRAVIS_BUILD_DIR=$(pwd)
|
||||
export DRONE_BUILD_DIR=$(pwd)
|
||||
export TRAVIS_BRANCH=$DRONE_BRANCH
|
||||
export VCS_COMMIT_ID=$DRONE_COMMIT
|
||||
export GIT_COMMIT=$DRONE_COMMIT
|
||||
export PATH=~/.local/bin:/usr/local/bin:$PATH
|
||||
|
||||
echo '==================================> BEFORE_INSTALL'
|
||||
|
||||
. .drone/before-install.sh
|
||||
|
||||
echo '==================================> INSTALL'
|
||||
|
||||
cd ..
|
||||
git clone -b $TRAVIS_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
|
||||
cd boost-root
|
||||
git submodule update --init tools/build
|
||||
git submodule update --init libs/config
|
||||
git submodule update --init tools/boost_install
|
||||
git submodule update --init libs/headers
|
||||
git submodule update --init tools/boostdep
|
||||
cp -r $TRAVIS_BUILD_DIR/* libs/graph
|
||||
python tools/boostdep/depinst/depinst.py graph
|
||||
./bootstrap.sh
|
||||
./b2 headers
|
||||
|
||||
echo '==================================> BEFORE_SCRIPT'
|
||||
|
||||
. $DRONE_BUILD_DIR/.drone/before-script.sh
|
||||
|
||||
echo '==================================> SCRIPT'
|
||||
|
||||
echo "using $TOOLSET : : $COMPILER : $OPTIONS ;" > ~/user-config.jam
|
||||
(cd libs/config/test && ../../../b2 cxxstd=$CXXSTD config_info_travis_install toolset=$TOOLSET && ./config_info_travis)
|
||||
(cd libs/graph/test && ../../../b2 -j3 cxxstd=$CXXSTD toolset=$TOOLSET define=CI_SUPPRESS_KNOWN_ISSUES)
|
||||
|
||||
echo '==================================> AFTER_SUCCESS'
|
||||
|
||||
. $DRONE_BUILD_DIR/.drone/after-success.sh
|
||||
@@ -1,42 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -ex
|
||||
export TRAVIS_BUILD_DIR=$(pwd)
|
||||
export DRONE_BUILD_DIR=$(pwd)
|
||||
export TRAVIS_BRANCH=$DRONE_BRANCH
|
||||
export VCS_COMMIT_ID=$DRONE_COMMIT
|
||||
export GIT_COMMIT=$DRONE_COMMIT
|
||||
export PATH=~/.local/bin:/usr/local/bin:$PATH
|
||||
|
||||
echo '==================================> BEFORE_INSTALL'
|
||||
|
||||
. .drone/before-install.sh
|
||||
|
||||
echo '==================================> INSTALL'
|
||||
|
||||
cd ..
|
||||
git clone -b $TRAVIS_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
|
||||
cd boost-root
|
||||
git submodule update --init tools/build
|
||||
git submodule update --init libs/config
|
||||
git submodule update --init tools/boost_install
|
||||
git submodule update --init libs/headers
|
||||
git submodule update --init tools/boostdep
|
||||
cp -r $TRAVIS_BUILD_DIR/* libs/graph
|
||||
python tools/boostdep/depinst/depinst.py graph
|
||||
./bootstrap.sh
|
||||
./b2 headers
|
||||
|
||||
echo '==================================> BEFORE_SCRIPT'
|
||||
|
||||
. $DRONE_BUILD_DIR/.drone/before-script.sh
|
||||
|
||||
echo '==================================> SCRIPT'
|
||||
|
||||
echo "using $TOOLSET : : $COMPILER : $OPTIONS ;" > ~/user-config.jam
|
||||
(cd libs/config/test && ../../../b2 cxxstd=$CXXSTD config_info_travis_install toolset=$TOOLSET && ./config_info_travis)
|
||||
(cd libs/graph/test && ../../../b2 -j3 cxxstd=$CXXSTD toolset=$TOOLSET define=CI_SUPPRESS_KNOWN_ISSUES)
|
||||
|
||||
echo '==================================> AFTER_SUCCESS'
|
||||
|
||||
. $DRONE_BUILD_DIR/.drone/after-success.sh
|
||||
@@ -1,19 +0,0 @@
|
||||
# Code owners for Boost.Graph
|
||||
#
|
||||
# When a PR is opened, GitHub automatically requests review from the matching
|
||||
# owners listed below. The order of rules matters: later, more specific rules
|
||||
# override earlier, more general ones.
|
||||
#
|
||||
# Authoritative maintainer list: meta/libraries.json
|
||||
# Contact details: CONTRIBUTING.md#maintainers
|
||||
|
||||
# Default reviewers for everything
|
||||
* @jeremy-murphy @becheler
|
||||
|
||||
# Documentation, contributor-facing files, and CI configuration
|
||||
/doc/ @becheler
|
||||
/README.md @becheler
|
||||
/CONTRIBUTING.md @becheler
|
||||
/SECURITY.md @becheler
|
||||
/CODE_OF_CONDUCT.md @becheler
|
||||
/.github/ @becheler
|
||||
@@ -1,84 +0,0 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Report a defect or unexpected behavior in Boost.Graph
|
||||
title: ''
|
||||
labels: ''
|
||||
type: Bug
|
||||
assignees: ''
|
||||
---
|
||||
|
||||
<!--
|
||||
Thank you for taking the time to file a bug report. Please fill in as much
|
||||
of the template below as you can. Reports without a reproducer or
|
||||
environment details are very hard to triage.
|
||||
-->
|
||||
|
||||
### Before filing
|
||||
|
||||
- [ ] I searched the [existing issues](https://github.com/boostorg/graph/issues?q=is%3Aissue) and did not find a duplicate.
|
||||
- [ ] I have reproduced the bug against the `develop` branch or the latest Boost release.
|
||||
- [ ] I have a minimal reproducer (or I will paste my full failing code below).
|
||||
|
||||
### Boost version
|
||||
|
||||
<!--
|
||||
You can find the version number in `<boost/version.hpp>`, or by running
|
||||
`git log -1` in your local Boost.Graph checkout.
|
||||
-->
|
||||
|
||||
### Compiler family
|
||||
|
||||
- [ ] GCC / g++
|
||||
- [ ] Clang / clang++
|
||||
- [ ] MSVC (Visual Studio)
|
||||
- [ ] Intel / oneAPI
|
||||
- [ ] Other (specify below)
|
||||
|
||||
Exact compiler version: <!-- e.g. g++ 13.2.0, clang 17.0.6, MSVC 19.39 -->
|
||||
|
||||
### Standard library
|
||||
|
||||
- [ ] libstdc++
|
||||
- [ ] libc++
|
||||
- [ ] MSVC STL
|
||||
- [ ] Other (specify below)
|
||||
|
||||
### Operating system
|
||||
|
||||
- [ ] Linux
|
||||
- [ ] macOS
|
||||
- [ ] Windows
|
||||
- [ ] Other (specify below)
|
||||
|
||||
### Kind of component affected
|
||||
|
||||
- [ ] Graph data structure (e.g. `adjacency_list`, `adjacency_matrix`)
|
||||
- [ ] Algorithm (e.g. `dijkstra_shortest_paths`, `breadth_first_search`)
|
||||
- [ ] Property map
|
||||
- [ ] I/O or file-format reader (e.g. `read_graphml`, `read_graphviz`)
|
||||
- [ ] Visitor / event hooks
|
||||
- [ ] Other (specify below)
|
||||
|
||||
Exact name of the affected component: <!-- e.g. dijkstra_shortest_paths -->
|
||||
|
||||
### Steps to reproduce
|
||||
|
||||
<!--
|
||||
A minimal compiling program that demonstrates the problem is ideal.
|
||||
A [Compiler Explorer](https://godbolt.org/z/9Esszr9Ga) link is even better.
|
||||
-->
|
||||
|
||||
### Expected behavior
|
||||
|
||||
### Actual behavior
|
||||
|
||||
<!--
|
||||
Include compiler error messages or runtime output verbatim, with file and
|
||||
line numbers where applicable.
|
||||
-->
|
||||
|
||||
### Are you willing to help?
|
||||
|
||||
- [ ] I'd like to submit a fix as a pull request.
|
||||
- [ ] I can help diagnose or test a candidate fix.
|
||||
- [ ] I'm only reporting the issue.
|
||||
@@ -1,9 +0,0 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: Design discussion or open-ended question
|
||||
url: https://github.com/boostorg/graph/discussions
|
||||
about: |
|
||||
For "should we...?" questions, design exploration, or anything not
|
||||
yet a concrete proposal, please start a GitHub Discussion. Issues
|
||||
are reserved for bugs, feature requests with a concrete proposal,
|
||||
and documentation problems.
|
||||
@@ -1,59 +0,0 @@
|
||||
---
|
||||
name: Documentation issue
|
||||
about: Report missing, incorrect, or unclear documentation
|
||||
title: ''
|
||||
labels: docs
|
||||
type: Task
|
||||
assignees: ''
|
||||
---
|
||||
|
||||
<!--
|
||||
Documentation problems are real issues. Thanks for taking the time to
|
||||
report one.
|
||||
-->
|
||||
|
||||
### Before filing
|
||||
|
||||
- [ ] I searched the [existing issues](https://github.com/boostorg/graph/issues?q=is%3Aissue+label%3Adocs) and did not find a duplicate.
|
||||
- [ ] I checked the latest version of the documentation on `develop`.
|
||||
|
||||
### Kind of problem
|
||||
|
||||
- [ ] Documentation is missing entirely
|
||||
- [ ] Documentation is incorrect or out of date
|
||||
- [ ] Explanation is unclear or confusing
|
||||
- [ ] Example does not compile
|
||||
- [ ] Example compiles but does not produce the documented result
|
||||
- [ ] Dead link or broken cross-reference
|
||||
- [ ] Other (specify below)
|
||||
|
||||
### Where is the issue?
|
||||
|
||||
<!--
|
||||
A link to the page, or the path to the file (for example,
|
||||
`doc/quick_tour.html` or `include/boost/graph/dijkstra_shortest_paths.hpp`).
|
||||
-->
|
||||
|
||||
### What is wrong, missing, or unclear?
|
||||
|
||||
<!--
|
||||
For example: an example does not compile, an algorithm's complexity is
|
||||
not stated, a parameter is undocumented, an explanation is confusing.
|
||||
-->
|
||||
|
||||
### What did you expect to find?
|
||||
|
||||
<!-- What information would have helped you? -->
|
||||
|
||||
### Suggested wording (optional)
|
||||
|
||||
<!--
|
||||
If you already have an idea of what the docs should say, paste a draft
|
||||
here.
|
||||
-->
|
||||
|
||||
### Are you willing to help?
|
||||
|
||||
- [ ] I'd like to submit a docs pull request.
|
||||
- [ ] I can review a candidate fix.
|
||||
- [ ] I'm only reporting the issue.
|
||||
@@ -1,72 +0,0 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Suggest a new algorithm, API addition, or enhancement
|
||||
title: ''
|
||||
labels: ''
|
||||
type: Feature
|
||||
assignees: ''
|
||||
---
|
||||
|
||||
<!--
|
||||
Thanks for proposing an addition to Boost.Graph.
|
||||
|
||||
If you want to explore an idea or discuss whether a feature would be
|
||||
worthwhile before committing to a concrete proposal, please start a
|
||||
GitHub Discussion instead:
|
||||
https://github.com/boostorg/graph/discussions
|
||||
|
||||
This template is for requests with a clear, actionable proposal: a
|
||||
specific algorithm, API, or enhancement that a maintainer could
|
||||
reasonably implement or review.
|
||||
-->
|
||||
|
||||
### Before filing
|
||||
|
||||
- [ ] I searched the [existing issues](https://github.com/boostorg/graph/issues?q=is%3Aissue) and did not find a duplicate.
|
||||
- [ ] This is a concrete proposal, not an open-ended design question.
|
||||
|
||||
### Kind of addition
|
||||
|
||||
- [ ] New algorithm
|
||||
- [ ] New data structure
|
||||
- [ ] New property map or utility
|
||||
- [ ] New I/O format reader or writer
|
||||
- [ ] Extension to an existing component
|
||||
- [ ] Performance improvement
|
||||
- [ ] Other (specify below)
|
||||
|
||||
### Motivation
|
||||
|
||||
<!--
|
||||
What problem does this feature solve? Who would use it, and in what
|
||||
context?
|
||||
-->
|
||||
|
||||
### Proposed addition
|
||||
|
||||
<!--
|
||||
A new algorithm, a new data structure, an extension to an existing
|
||||
component, or something else? If you have a rough API sketch, paste it
|
||||
here.
|
||||
-->
|
||||
|
||||
### Relation to existing Boost.Graph components
|
||||
|
||||
<!--
|
||||
Does this overlap with or build on something that already exists in the
|
||||
library (for example, an existing algorithm or property map)?
|
||||
-->
|
||||
|
||||
### Prior art
|
||||
|
||||
- [ ] Reference paper or textbook (cite below)
|
||||
- [ ] Implementation in another library (link below)
|
||||
- [ ] None / original idea
|
||||
|
||||
References: <!-- paste DOI, ISBN, or URL -->
|
||||
|
||||
### Are you willing to contribute?
|
||||
|
||||
- [ ] I'd like to submit the implementation as a pull request.
|
||||
- [ ] I can help with review or testing, but not the implementation.
|
||||
- [ ] I'm only proposing the idea.
|
||||
@@ -1,50 +0,0 @@
|
||||
<!--
|
||||
Thanks for contributing to Boost.Graph! A few notes before you fill this in:
|
||||
|
||||
* Target the `develop` branch.
|
||||
* New contributions must be licensed under the
|
||||
[Boost Software License 1.0](https://www.boost.org/LICENSE_1_0.txt).
|
||||
* Please link any related issue with `Fixes #N` or `Refs #N`.
|
||||
-->
|
||||
|
||||
### Before submitting
|
||||
|
||||
- [ ] This PR targets the `develop` branch.
|
||||
- [ ] I searched for an existing PR or issue covering the same change.
|
||||
- [ ] My contribution is licensed under the Boost Software License 1.0.
|
||||
|
||||
### Type of change
|
||||
|
||||
- [ ] Bug fix
|
||||
- [ ] New feature or API addition
|
||||
- [ ] Refactor (no behavior change)
|
||||
- [ ] Documentation
|
||||
- [ ] Build, CI, or tooling
|
||||
- [ ] Other (specify below)
|
||||
|
||||
### Does this PR introduce a breaking change?
|
||||
|
||||
- [ ] Yes (describe migration impact below)
|
||||
- [ ] No
|
||||
|
||||
### What this PR does
|
||||
|
||||
<!-- A short summary of the change. -->
|
||||
|
||||
### Motivation
|
||||
|
||||
<!-- Why is this needed? Link related issue with `Fixes #N` or `Refs #N`. -->
|
||||
|
||||
### Testing
|
||||
|
||||
<!--
|
||||
How did you verify the change? Which compilers and standard libraries did
|
||||
you build against? Were new tests added under `test/`?
|
||||
-->
|
||||
|
||||
### Checklist
|
||||
|
||||
- [ ] Existing tests pass (`b2` in the `test/` directory).
|
||||
- [ ] New behavior is covered by a test, or this is a docs / build / refactor change.
|
||||
- [ ] Documentation was updated if user-facing behavior changed.
|
||||
- [ ] No new compiler warnings on the platforms I built against.
|
||||
@@ -1,131 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Print a markdown table of Boost dependency changes between two CI log archives.
|
||||
|
||||
Usage: dep_table.py BASELINE.zip AFTER.zip
|
||||
|
||||
Each archive is a GitHub Actions run-log zip. The `deps` job of the
|
||||
dependency-report workflow prints two marker-delimited boostdep reports into
|
||||
its log:
|
||||
|
||||
===DEP-BRIEF-START=== boostdep --brief graph ===DEP-BRIEF-END===
|
||||
===DEP-PRIMARY-START=== boostdep graph (primary) ===DEP-PRIMARY-END===
|
||||
|
||||
From those it derives two metrics and prints their delta vs the baseline:
|
||||
- the set of transitive Boost modules graph depends on (from --brief:
|
||||
Primary + Secondary sections = the full transitive closure), and
|
||||
- the header-inclusion weight of each direct dependency (from the primary
|
||||
report: how many distinct boost/graph files pull that dependency in).
|
||||
Weights are the live signal, they drop toward zero as coupling is removed;
|
||||
the module count is the coarse target that only moves when a dep hits zero.
|
||||
"""
|
||||
import re
|
||||
import sys
|
||||
import zipfile
|
||||
|
||||
BRIEF = ("===DEP-BRIEF-START===", "===DEP-BRIEF-END===")
|
||||
PRIMARY = ("===DEP-PRIMARY-START===", "===DEP-PRIMARY-END===")
|
||||
# Module names as boostdep prints them, e.g. "numeric~conversion".
|
||||
MODULE = re.compile(r"[A-Za-z0-9_.~-]+")
|
||||
TIMESTAMP = re.compile(r"^\d{4}-\d\d-\d\dT[\d:.]+Z\s?") # GitHub log line prefix
|
||||
ANSI = re.compile(r"\x1b\[[0-9;]*m")
|
||||
|
||||
|
||||
def read_clean_lines(zip_path):
|
||||
"""Top-level per-job logs, with GitHub timestamp and ANSI prefixes stripped."""
|
||||
lines = []
|
||||
with zipfile.ZipFile(zip_path) as z:
|
||||
for entry in z.namelist():
|
||||
if "/" in entry or not entry.endswith(".txt"):
|
||||
continue
|
||||
for ln in z.read(entry).decode("utf-8", "replace").splitlines():
|
||||
lines.append(TIMESTAMP.sub("", ANSI.sub("", ln)))
|
||||
return lines
|
||||
|
||||
|
||||
def block(lines, markers):
|
||||
"""Lines strictly between the marker lines, matched exactly.
|
||||
|
||||
Exact matching is what skips the echoed `echo "<marker>"` command lines
|
||||
GitHub prepends to a run step, so we capture boostdep's real stdout.
|
||||
"""
|
||||
start, end = markers
|
||||
out, capturing = [], False
|
||||
for ln in lines:
|
||||
s = ln.strip()
|
||||
if s == start:
|
||||
capturing = True
|
||||
continue
|
||||
if s == end and capturing:
|
||||
break
|
||||
if capturing:
|
||||
out.append(ln)
|
||||
return out
|
||||
|
||||
|
||||
def parse_brief(lines):
|
||||
"""--brief output -> set of module names (one bare name per line)."""
|
||||
mods = set()
|
||||
for ln in lines:
|
||||
s = ln.strip()
|
||||
if not s or s.startswith("#") or s.lower().startswith("brief dependency"):
|
||||
continue
|
||||
if MODULE.fullmatch(s):
|
||||
mods.add(s)
|
||||
return mods
|
||||
|
||||
|
||||
def parse_weights(lines):
|
||||
"""Primary report -> {dependency: number of distinct graph files that pull it in}."""
|
||||
weights, cur = {}, None
|
||||
for ln in lines:
|
||||
head = re.match(r"^([A-Za-z0-9_.~-]+):\s*$", ln) # "module:" at column 0
|
||||
if head:
|
||||
cur = head.group(1)
|
||||
weights.setdefault(cur, set())
|
||||
continue
|
||||
frm = re.match(r"^\s+from\s+(.+?)\s*$", ln)
|
||||
if frm and cur is not None:
|
||||
weights[cur].add(frm.group(1))
|
||||
return {k: len(v) for k, v in weights.items()}
|
||||
|
||||
|
||||
def main(base_zip, pr_zip):
|
||||
bl, pl = read_clean_lines(base_zip), read_clean_lines(pr_zip)
|
||||
base_mods = parse_brief(block(bl, BRIEF))
|
||||
pr_mods = parse_brief(block(pl, BRIEF))
|
||||
base_w = parse_weights(block(bl, PRIMARY))
|
||||
pr_w = parse_weights(block(pl, PRIMARY))
|
||||
|
||||
# Header-inclusion weights: the live signal. Only rows that changed, most-reduced first.
|
||||
print("**Header-inclusion weights** (graph files pulling each direct dependency in):")
|
||||
print()
|
||||
changed = []
|
||||
for dep in base_w.keys() | pr_w.keys():
|
||||
b, p = base_w.get(dep, 0), pr_w.get(dep, 0)
|
||||
if b != p:
|
||||
changed.append((p - b, dep, b, p))
|
||||
if changed:
|
||||
print("| Dependency | develop | PR | Δ |")
|
||||
print("|-----|--------:|---:|----:|")
|
||||
for d, dep, b, p in sorted(changed): # reductions (negative delta) first
|
||||
print(f"| {dep} | {b} | {p} | {d:+d} |")
|
||||
else:
|
||||
print("_No header-inclusion-weight changes._")
|
||||
print()
|
||||
|
||||
# Transitive module set: the coarse target.
|
||||
added = sorted(pr_mods - base_mods)
|
||||
removed = sorted(base_mods - pr_mods)
|
||||
nb, np_ = len(base_mods), len(pr_mods)
|
||||
diff = np_ - nb
|
||||
print(f"**Transitive Boost modules:** {nb} → {np_} ({f'{diff:+d}' if diff else '0'})")
|
||||
if added:
|
||||
print(f"- added: {', '.join(added)}")
|
||||
if removed:
|
||||
print(f"- removed: {', '.join(removed)}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
if len(sys.argv) != 3:
|
||||
sys.exit("usage: dep_table.py BASELINE.zip AFTER.zip")
|
||||
main(sys.argv[1], sys.argv[2])
|
||||
@@ -1,48 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Print a markdown table comparing compiler-warning counts between two CI log archives.
|
||||
|
||||
Usage: warn_table.py BASELINE.zip AFTER.zip
|
||||
|
||||
A warning is a line matching 'file:line:col: warning:' (clang/gcc) or 'warning Cxxxx'
|
||||
(msvc). Linker, "N warnings generated" summary, and CI-runner lines are not counted.
|
||||
"""
|
||||
import re
|
||||
import sys
|
||||
import zipfile
|
||||
|
||||
WARNING = re.compile(r":\d+:\d+: warning:|warning C\d+")
|
||||
|
||||
|
||||
def counts(zip_path):
|
||||
"""Map each CI job to its warning count, read from the run's log archive."""
|
||||
result = {}
|
||||
with zipfile.ZipFile(zip_path) as archive:
|
||||
for entry in archive.namelist():
|
||||
# Top-level per-job logs are named like "12_ubuntu (gcc-14, 14).txt".
|
||||
if "/" in entry or not entry.endswith(".txt"):
|
||||
continue
|
||||
job = re.sub(r"^\d+_", "", entry[:-4])
|
||||
log = archive.read(entry).decode("utf-8", "replace")
|
||||
result[job] = sum(1 for line in log.splitlines() if WARNING.search(line))
|
||||
return result
|
||||
|
||||
|
||||
def main(baseline_zip, after_zip):
|
||||
baseline = counts(baseline_zip)
|
||||
after = counts(after_zip)
|
||||
print("| Job | Baseline | After | Delta |")
|
||||
print("|-----|---------:|------:|------:|")
|
||||
for job in sorted(baseline.keys() | after.keys()):
|
||||
if "cmake" in job: # cmake jobs build only the library, they never warn
|
||||
continue
|
||||
before = baseline.get(job, 0)
|
||||
now = after.get(job, 0)
|
||||
diff = now - before
|
||||
delta = f"{diff:+d}" if diff else "0"
|
||||
print(f"| {job} | {before} | {now} | {delta} |")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
if len(sys.argv) != 3:
|
||||
sys.exit("usage: warn_table.py BASELINE.zip AFTER.zip")
|
||||
main(sys.argv[1], sys.argv[2])
|
||||
@@ -1,359 +0,0 @@
|
||||
# Copyright 2020 Evan Miller
|
||||
# Copyright 2020 Matt Borland
|
||||
# Copyright 2021 John Maddock
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
|
||||
|
||||
name: CI
|
||||
on: [ push, pull_request ]
|
||||
jobs:
|
||||
ubuntu:
|
||||
runs-on: ubuntu-24.04
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
compiler: [ gcc-14, clang-19 ]
|
||||
cxxstd: [ 14, 17, 20, 23 ]
|
||||
steps:
|
||||
- uses: actions/checkout@master
|
||||
with:
|
||||
fetch-depth: '0'
|
||||
- uses: mstachniuk/ci-skip@v1
|
||||
with:
|
||||
commit-filter: '[skip ci];[ci skip];[CI SKIP];[SKIP CI];***CI SKIP***;***SKIP CI***;[windows];[Windows];[WINDOWS];[apple];[Apple];[APPLE]'
|
||||
commit-filter-separator: ';'
|
||||
fail-fast: true
|
||||
- name: Set ENV
|
||||
run: |
|
||||
echo ${{ matrix.compiler }} | awk '/^gcc/ { print "TOOLSET=gcc" } /^clang/ { print "TOOLSET=clang" }' >> $GITHUB_ENV
|
||||
echo ${{ matrix.compiler }} | awk '/^gcc/ { gsub(/gcc/,"CXX=g++"); print; } /^clang/ { gsub(/clang/,"CXX=clang++"); print; }' >> $GITHUB_ENV
|
||||
- name: Install packages
|
||||
run: sudo apt install ${{ matrix.compiler }}
|
||||
- name: Checkout main boost
|
||||
run: git clone -b develop --depth 1 https://github.com/boostorg/boost.git ../boost-root
|
||||
- name: Update tools/boostdep
|
||||
run: git submodule update --init tools/boostdep
|
||||
working-directory: ../boost-root
|
||||
- name: Copy files
|
||||
run: cp -r $GITHUB_WORKSPACE/* libs/graph
|
||||
working-directory: ../boost-root
|
||||
- name: Install deps
|
||||
run: python tools/boostdep/depinst/depinst.py graph
|
||||
working-directory: ../boost-root
|
||||
- name: Bootstrap
|
||||
run: ./bootstrap.sh
|
||||
working-directory: ../boost-root
|
||||
- name: Generate headers
|
||||
run: ./b2 headers
|
||||
working-directory: ../boost-root
|
||||
- name: Generate user config
|
||||
run: 'echo "using $TOOLSET : : $CXX ;" > ~/user-config.jam'
|
||||
working-directory: ../boost-root
|
||||
- name: Config info
|
||||
run: ../../../b2 print_config_info toolset=$TOOLSET cxxstd=${{ matrix.cxxstd }}
|
||||
working-directory: ../boost-root/libs/config/test
|
||||
- name: Test
|
||||
run: ../../../b2 toolset=$TOOLSET cxxstd=${{ matrix.cxxstd }}
|
||||
working-directory: ../boost-root/libs/graph/test
|
||||
macos:
|
||||
runs-on: macos-15
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
toolset: [ clang ]
|
||||
cxxstd: [ 14, 17, 20 ]
|
||||
steps:
|
||||
- uses: actions/checkout@master
|
||||
with:
|
||||
fetch-depth: '0'
|
||||
- uses: mstachniuk/ci-skip@v1
|
||||
with:
|
||||
commit-filter: '[skip ci];[ci skip];[CI SKIP];[SKIP CI];***CI SKIP***;***SKIP CI***;[windows];[Windows];[WINDOWS];[linux];[Linux];[LINUX]'
|
||||
commit-filter-separator: ';'
|
||||
fail-fast: true
|
||||
- name: Print pinned AppleClang version
|
||||
run: clang++ --version
|
||||
- name: Checkout main boost
|
||||
run: git clone -b develop --depth 1 https://github.com/boostorg/boost.git ../boost-root
|
||||
- name: Update tools/boostdep
|
||||
run: git submodule update --init tools/boostdep
|
||||
working-directory: ../boost-root
|
||||
- name: Copy files
|
||||
run: cp -r $GITHUB_WORKSPACE/* libs/graph
|
||||
working-directory: ../boost-root
|
||||
- name: Install deps
|
||||
run: python tools/boostdep/depinst/depinst.py graph
|
||||
working-directory: ../boost-root
|
||||
- name: Bootstrap
|
||||
run: ./bootstrap.sh
|
||||
working-directory: ../boost-root
|
||||
- name: Generate headers
|
||||
run: ./b2 headers
|
||||
working-directory: ../boost-root
|
||||
- name: Config info
|
||||
run: ../../../b2 print_config_info toolset=${{ matrix.toolset }} cxxstd=${{ matrix.cxxstd }}
|
||||
working-directory: ../boost-root/libs/config/test
|
||||
- name: Test
|
||||
run: ../../../b2 toolset=${{ matrix.toolset }} cxxstd=${{ matrix.cxxstd }} define=CI_SUPPRESS_KNOWN_ISSUES
|
||||
working-directory: ../boost-root/libs/graph/test
|
||||
windows_msvc_14_3:
|
||||
runs-on: windows-2022
|
||||
defaults:
|
||||
run:
|
||||
shell: cmd
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
toolset: [ msvc-14.3 ]
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: '0'
|
||||
- uses: mstachniuk/ci-skip@v1
|
||||
with:
|
||||
commit-filter: '[skip ci];[ci skip];[CI SKIP];[SKIP CI];***CI SKIP***;***SKIP CI***;[apple];[Apple];[APPLE];[linux];[Linux];[LINUX]'
|
||||
commit-filter-separator: ';'
|
||||
fail-fast: true
|
||||
- name: Checkout main boost
|
||||
run: git clone -b develop --depth 1 https://github.com/boostorg/boost.git ../boost-root
|
||||
- name: Update tools/boostdep
|
||||
run: git submodule update --init tools/boostdep
|
||||
working-directory: ../boost-root
|
||||
- name: Copy files
|
||||
run: xcopy /s /e /q %GITHUB_WORKSPACE% libs\graph
|
||||
working-directory: ../boost-root
|
||||
- name: Install deps
|
||||
run: python tools/boostdep/depinst/depinst.py graph
|
||||
working-directory: ../boost-root
|
||||
- name: Bootstrap
|
||||
run: bootstrap
|
||||
working-directory: ../boost-root
|
||||
- name: Generate headers
|
||||
run: b2 headers
|
||||
working-directory: ../boost-root
|
||||
- name: Config info
|
||||
run: ..\..\..\b2 print_config_info cxxstd=14,17,20 address-model=64 toolset=msvc-14.3
|
||||
working-directory: ../boost-root/libs/config/test
|
||||
- name: Test
|
||||
run: ..\..\..\b2 --hash address-model=64 cxxstd=14,17,20 toolset=msvc-14.3
|
||||
working-directory: ../boost-root/libs/graph/test
|
||||
|
||||
posix-cmake-subdir:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- os: ubuntu-22.04
|
||||
- os: ubuntu-24.04
|
||||
- os: macos-14
|
||||
- os: macos-15
|
||||
|
||||
runs-on: ${{matrix.os}}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install packages
|
||||
if: matrix.install
|
||||
run: sudo apt-get -y install ${{matrix.install}}
|
||||
|
||||
- name: Setup Boost
|
||||
run: |
|
||||
echo GITHUB_REPOSITORY: $GITHUB_REPOSITORY
|
||||
LIBRARY=${GITHUB_REPOSITORY#*/}
|
||||
echo LIBRARY: $LIBRARY
|
||||
echo "LIBRARY=$LIBRARY" >> $GITHUB_ENV
|
||||
echo GITHUB_BASE_REF: $GITHUB_BASE_REF
|
||||
echo GITHUB_REF: $GITHUB_REF
|
||||
REF=${GITHUB_BASE_REF:-$GITHUB_REF}
|
||||
REF=${REF#refs/heads/}
|
||||
echo REF: $REF
|
||||
BOOST_BRANCH=develop && [ "$REF" == "master" ] && BOOST_BRANCH=master || true
|
||||
echo BOOST_BRANCH: $BOOST_BRANCH
|
||||
cd ..
|
||||
git clone -b $BOOST_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
|
||||
cd boost-root
|
||||
cp -r $GITHUB_WORKSPACE/* libs/$LIBRARY
|
||||
git submodule update --init tools/boostdep
|
||||
python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" $LIBRARY
|
||||
|
||||
- name: Use library with add_subdirectory
|
||||
run: |
|
||||
cd ../boost-root/libs/$LIBRARY/test/cmake_subdir_test
|
||||
mkdir __build__ && cd __build__
|
||||
cmake ..
|
||||
cmake --build .
|
||||
ctest --output-on-failure --no-tests=error
|
||||
|
||||
posix-cmake-install:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- os: ubuntu-22.04
|
||||
- os: ubuntu-24.04
|
||||
- os: macos-14
|
||||
- os: macos-15
|
||||
|
||||
runs-on: ${{matrix.os}}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install packages
|
||||
if: matrix.install
|
||||
run: sudo apt-get -y install ${{matrix.install}}
|
||||
|
||||
- name: Setup Boost
|
||||
run: |
|
||||
echo GITHUB_REPOSITORY: $GITHUB_REPOSITORY
|
||||
LIBRARY=${GITHUB_REPOSITORY#*/}
|
||||
echo LIBRARY: $LIBRARY
|
||||
echo "LIBRARY=$LIBRARY" >> $GITHUB_ENV
|
||||
echo GITHUB_BASE_REF: $GITHUB_BASE_REF
|
||||
echo GITHUB_REF: $GITHUB_REF
|
||||
REF=${GITHUB_BASE_REF:-$GITHUB_REF}
|
||||
REF=${REF#refs/heads/}
|
||||
echo REF: $REF
|
||||
BOOST_BRANCH=develop && [ "$REF" == "master" ] && BOOST_BRANCH=master || true
|
||||
echo BOOST_BRANCH: $BOOST_BRANCH
|
||||
cd ..
|
||||
git clone -b $BOOST_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
|
||||
cd boost-root
|
||||
cp -r $GITHUB_WORKSPACE/* libs/$LIBRARY
|
||||
git submodule update --init tools/boostdep
|
||||
python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" $LIBRARY
|
||||
|
||||
- name: Configure
|
||||
run: |
|
||||
cd ../boost-root
|
||||
mkdir __build__ && cd __build__
|
||||
cmake -DBOOST_INCLUDE_LIBRARIES=$LIBRARY -DCMAKE_INSTALL_PREFIX=~/.local ..
|
||||
|
||||
- name: Install
|
||||
run: |
|
||||
cd ../boost-root/__build__
|
||||
cmake --build . --target install
|
||||
|
||||
- name: Use the installed library
|
||||
run: |
|
||||
cd ../boost-root/libs/$LIBRARY/test/cmake_install_test && mkdir __build__ && cd __build__
|
||||
cmake -DCMAKE_INSTALL_PREFIX=~/.local ..
|
||||
cmake --build .
|
||||
ctest --output-on-failure --no-tests=error
|
||||
|
||||
windows-cmake-subdir:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- os: windows-2022
|
||||
- os: windows-2025
|
||||
|
||||
runs-on: ${{matrix.os}}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Boost
|
||||
shell: cmd
|
||||
run: |
|
||||
echo GITHUB_REPOSITORY: %GITHUB_REPOSITORY%
|
||||
for /f %%i in ("%GITHUB_REPOSITORY%") do set LIBRARY=%%~nxi
|
||||
echo LIBRARY: %LIBRARY%
|
||||
echo LIBRARY=%LIBRARY%>>%GITHUB_ENV%
|
||||
echo GITHUB_BASE_REF: %GITHUB_BASE_REF%
|
||||
echo GITHUB_REF: %GITHUB_REF%
|
||||
if "%GITHUB_BASE_REF%" == "" set GITHUB_BASE_REF=%GITHUB_REF%
|
||||
set BOOST_BRANCH=develop
|
||||
for /f %%i in ("%GITHUB_BASE_REF%") do if "%%~nxi" == "master" set BOOST_BRANCH=master
|
||||
echo BOOST_BRANCH: %BOOST_BRANCH%
|
||||
cd ..
|
||||
git clone -b %BOOST_BRANCH% --depth 1 https://github.com/boostorg/boost.git boost-root
|
||||
cd boost-root
|
||||
xcopy /s /e /q %GITHUB_WORKSPACE% libs\%LIBRARY%\
|
||||
git submodule update --init tools/boostdep
|
||||
python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" %LIBRARY%
|
||||
|
||||
- name: Use library with add_subdirectory (Debug)
|
||||
shell: cmd
|
||||
run: |
|
||||
cd ../boost-root/libs/%LIBRARY%/test/cmake_subdir_test
|
||||
mkdir __build__ && cd __build__
|
||||
cmake ..
|
||||
cmake --build . --config Debug
|
||||
ctest --output-on-failure --no-tests=error -C Debug
|
||||
|
||||
- name: Use library with add_subdirectory (Release)
|
||||
shell: cmd
|
||||
run: |
|
||||
cd ../boost-root/libs/%LIBRARY%/test/cmake_subdir_test/__build__
|
||||
cmake --build . --config Release
|
||||
ctest --output-on-failure --no-tests=error -C Release
|
||||
|
||||
windows-cmake-install:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- os: windows-2022
|
||||
- os: windows-2025
|
||||
|
||||
runs-on: ${{matrix.os}}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Boost
|
||||
shell: cmd
|
||||
run: |
|
||||
echo GITHUB_REPOSITORY: %GITHUB_REPOSITORY%
|
||||
for /f %%i in ("%GITHUB_REPOSITORY%") do set LIBRARY=%%~nxi
|
||||
echo LIBRARY: %LIBRARY%
|
||||
echo LIBRARY=%LIBRARY%>>%GITHUB_ENV%
|
||||
echo GITHUB_BASE_REF: %GITHUB_BASE_REF%
|
||||
echo GITHUB_REF: %GITHUB_REF%
|
||||
if "%GITHUB_BASE_REF%" == "" set GITHUB_BASE_REF=%GITHUB_REF%
|
||||
set BOOST_BRANCH=develop
|
||||
for /f %%i in ("%GITHUB_BASE_REF%") do if "%%~nxi" == "master" set BOOST_BRANCH=master
|
||||
echo BOOST_BRANCH: %BOOST_BRANCH%
|
||||
cd ..
|
||||
git clone -b %BOOST_BRANCH% --depth 1 https://github.com/boostorg/boost.git boost-root
|
||||
cd boost-root
|
||||
xcopy /s /e /q %GITHUB_WORKSPACE% libs\%LIBRARY%\
|
||||
git submodule update --init tools/boostdep
|
||||
python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" %LIBRARY%
|
||||
|
||||
- name: Configure
|
||||
shell: cmd
|
||||
run: |
|
||||
cd ../boost-root
|
||||
mkdir __build__ && cd __build__
|
||||
cmake -DBOOST_INCLUDE_LIBRARIES=%LIBRARY% -DCMAKE_INSTALL_PREFIX=C:/cmake-prefix ..
|
||||
|
||||
- name: Install (Debug)
|
||||
shell: cmd
|
||||
run: |
|
||||
cd ../boost-root/__build__
|
||||
cmake --build . --target install --config Debug
|
||||
|
||||
- name: Install (Release)
|
||||
shell: cmd
|
||||
run: |
|
||||
cd ../boost-root/__build__
|
||||
cmake --build . --target install --config Release
|
||||
|
||||
- name: Use the installed library (Debug)
|
||||
shell: cmd
|
||||
run: |
|
||||
cd ../boost-root/libs/%LIBRARY%/test/cmake_install_test && mkdir __build__ && cd __build__
|
||||
cmake -DCMAKE_INSTALL_PREFIX=C:/cmake-prefix ..
|
||||
cmake --build . --config Debug
|
||||
ctest --output-on-failure --no-tests=error -C Debug
|
||||
|
||||
- name: Use the installed library (Release)
|
||||
shell: cmd
|
||||
run: |
|
||||
cd ../boost-root/libs/%LIBRARY%/test/cmake_install_test/__build__
|
||||
cmake --build . --config Release
|
||||
ctest --output-on-failure --no-tests=error -C Release
|
||||
@@ -1,61 +0,0 @@
|
||||
name: dependency-count-comment
|
||||
|
||||
on:
|
||||
workflow_run:
|
||||
workflows: ["dependency-report"]
|
||||
types: [completed]
|
||||
|
||||
permissions:
|
||||
actions: read
|
||||
pull-requests: write
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
comment:
|
||||
if: github.event.workflow_run.event == 'pull_request'
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
REPO: ${{ github.repository }}
|
||||
PR_RUN: ${{ github.event.workflow_run.id }}
|
||||
HEAD_SHA: ${{ github.event.workflow_run.head_sha }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Download this PR run's log archive
|
||||
run: gh api "repos/$REPO/actions/runs/$PR_RUN/logs" > pr-logs.zip
|
||||
|
||||
- name: Download latest successful develop run's log archive
|
||||
run: |
|
||||
DEV=$(gh run list --workflow dependency-report --branch develop --status success \
|
||||
--limit 1 --json databaseId --jq '.[0].databaseId')
|
||||
if [ -z "$DEV" ]; then echo "no develop baseline run found" >&2; exit 1; fi
|
||||
echo "DEV_RUN=$DEV" >> "$GITHUB_ENV"
|
||||
gh api "repos/$REPO/actions/runs/$DEV/logs" > base-logs.zip
|
||||
|
||||
- name: Generate table
|
||||
run: |
|
||||
{
|
||||
echo "Boost dependency footprint vs \`develop\` (auto-generated)."
|
||||
echo "PR run \`$PR_RUN\` vs develop run \`$DEV_RUN\` (\`${HEAD_SHA:0:10}\`)."
|
||||
echo
|
||||
python3 .github/scripts/dep_table.py base-logs.zip pr-logs.zip
|
||||
} > table.md
|
||||
|
||||
- name: Resolve PR number
|
||||
id: pr
|
||||
run: |
|
||||
num=$(gh api "repos/$REPO/pulls?state=open&per_page=100" \
|
||||
--jq "map(select(.head.sha==\"$HEAD_SHA\"))[0].number")
|
||||
if [ -z "$num" ]; then
|
||||
echo "no open PR found with head $HEAD_SHA" >&2
|
||||
exit 1
|
||||
fi
|
||||
echo "num=$num" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Post or update sticky comment
|
||||
uses: marocchino/sticky-pull-request-comment@v2
|
||||
with:
|
||||
header: dependency-counts
|
||||
number: ${{ steps.pr.outputs.num }}
|
||||
path: table.md
|
||||
@@ -1,42 +0,0 @@
|
||||
name: dependency-report
|
||||
|
||||
# Computes graph's Boost dependency footprint with boostdep and prints a
|
||||
# marker-delimited report into the job log, on every push and PR. The
|
||||
# dependency-count-comment workflow reads these logs (this PR's run and the
|
||||
# latest develop run) and posts the diff as a PR comment. Kept separate from
|
||||
# CI so ci.yml is untouched.
|
||||
|
||||
on: [ push, pull_request ]
|
||||
|
||||
jobs:
|
||||
deps:
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Set up Boost tree and build boostdep
|
||||
run: |
|
||||
git clone -b develop --depth 1 https://github.com/boostorg/boost.git ../boost-root
|
||||
cd ../boost-root
|
||||
cp -r $GITHUB_WORKSPACE/* libs/graph
|
||||
git submodule update --init tools/boostdep
|
||||
# depinst pulls graph's deps; also ensure boostdep's own dep
|
||||
# (Boost.Filesystem) is present since boostdep links against it.
|
||||
python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" graph
|
||||
python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" filesystem
|
||||
./bootstrap.sh
|
||||
./b2 headers
|
||||
# boostdep #includes <boost/filesystem.hpp> and links the compiled
|
||||
# library, so build it with b2 (a bare c++ compile can't resolve that).
|
||||
./b2 tools/boostdep/build
|
||||
- name: Boostdep dependency report
|
||||
working-directory: ../boost-root
|
||||
run: |
|
||||
BOOSTDEP=$(find "$PWD" -type f -name boostdep -perm -u+x 2>/dev/null | grep -v '/src/' | head -1)
|
||||
if [ -z "$BOOSTDEP" ]; then echo "boostdep executable not found after build" >&2; exit 1; fi
|
||||
echo "using boostdep: $BOOSTDEP"
|
||||
echo "===DEP-BRIEF-START==="
|
||||
"$BOOSTDEP" --boost-root . --track-sources --no-track-tests --brief graph
|
||||
echo "===DEP-BRIEF-END==="
|
||||
echo "===DEP-PRIMARY-START==="
|
||||
"$BOOSTDEP" --boost-root . --track-sources --no-track-tests graph
|
||||
echo "===DEP-PRIMARY-END==="
|
||||
@@ -1,62 +0,0 @@
|
||||
name: docs-check
|
||||
|
||||
# PR-time sanity check for the Antora documentation:
|
||||
# - b2 builds every example .cpp and regenerates its .txt sidecar
|
||||
# (catches broken examples; failures here fail the job)
|
||||
# - Antora renders the full site (catches broken .adoc, missing
|
||||
# includes, broken xrefs)
|
||||
#
|
||||
# No deployment. The real publishing path is boostorg/release-tools,
|
||||
# which auto-detects doc/build_antora.sh and ships to
|
||||
# www.boost.org/doc/libs/<version>/libs/graph/.
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: ["develop", "documentation"]
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
docs-check:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Install Node 20
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '20'
|
||||
|
||||
# Set up boost-root so b2 can build the example .cpp files (needs
|
||||
# the full Boost build tree, not just the headers we ship in this
|
||||
# repo).
|
||||
- name: Set up boost-root
|
||||
run: |
|
||||
git clone -b develop --depth 1 https://github.com/boostorg/boost.git ../boost-root
|
||||
cd ../boost-root
|
||||
git submodule update --init tools/boostdep
|
||||
rm -rf libs/graph
|
||||
cp -r "$GITHUB_WORKSPACE" libs/graph
|
||||
python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" graph
|
||||
git submodule update --init --depth 1 libs/static_assert
|
||||
./bootstrap.sh
|
||||
./b2 headers
|
||||
|
||||
- name: Snapshot example outputs (b2)
|
||||
working-directory: ../boost-root
|
||||
run: ./b2 -j$(nproc) libs/graph/doc/modules/ROOT/examples
|
||||
|
||||
# Mirror the regenerated .txt sidecars back into the workspace so
|
||||
# the Antora build below renders pages against fresh outputs.
|
||||
- name: Mirror generated .txt back to workspace
|
||||
run: rsync -a ../boost-root/libs/graph/doc/modules/ROOT/examples/ doc/modules/ROOT/examples/
|
||||
|
||||
# Build the site exactly as boostorg/release-tools will at release
|
||||
# time: invoke doc/build_antora.sh, which runs npm ci + npx antora
|
||||
# against the committed package-lock.json.
|
||||
- name: Build the site (release-tools entry point)
|
||||
working-directory: doc
|
||||
run: ./build_antora.sh playbook.yml
|
||||
@@ -1,61 +0,0 @@
|
||||
name: warning-count-comment
|
||||
|
||||
on:
|
||||
workflow_run:
|
||||
workflows: ["CI"]
|
||||
types: [completed]
|
||||
|
||||
permissions:
|
||||
actions: read
|
||||
pull-requests: write
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
comment:
|
||||
if: github.event.workflow_run.event == 'pull_request'
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
REPO: ${{ github.repository }}
|
||||
PR_RUN: ${{ github.event.workflow_run.id }}
|
||||
HEAD_SHA: ${{ github.event.workflow_run.head_sha }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Download this PR run's log archive
|
||||
run: gh api "repos/$REPO/actions/runs/$PR_RUN/logs" > pr-logs.zip
|
||||
|
||||
- name: Download latest successful develop run's log archive
|
||||
run: |
|
||||
DEV=$(gh run list --workflow CI --branch develop --status success \
|
||||
--limit 1 --json databaseId --jq '.[0].databaseId')
|
||||
if [ -z "$DEV" ]; then echo "no develop baseline run found" >&2; exit 1; fi
|
||||
echo "DEV_RUN=$DEV" >> "$GITHUB_ENV"
|
||||
gh api "repos/$REPO/actions/runs/$DEV/logs" > base-logs.zip
|
||||
|
||||
- name: Generate table
|
||||
run: |
|
||||
{
|
||||
echo "Compiler-warning counts vs \`develop\` (auto-generated)."
|
||||
echo "PR run \`$PR_RUN\` vs develop run \`$DEV_RUN\` (\`${HEAD_SHA:0:10}\`)."
|
||||
echo
|
||||
python3 .github/scripts/warn_table.py base-logs.zip pr-logs.zip
|
||||
} > table.md
|
||||
|
||||
- name: Resolve PR number
|
||||
id: pr
|
||||
run: |
|
||||
num=$(gh api "repos/$REPO/pulls?state=open&per_page=100" \
|
||||
--jq "map(select(.head.sha==\"$HEAD_SHA\"))[0].number")
|
||||
if [ -z "$num" ]; then
|
||||
echo "no open PR found with head $HEAD_SHA" >&2
|
||||
exit 1
|
||||
fi
|
||||
echo "num=$num" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Post or update sticky comment
|
||||
uses: marocchino/sticky-pull-request-comment@v2
|
||||
with:
|
||||
header: warning-counts
|
||||
number: ${{ steps.pr.outputs.num }}
|
||||
path: table.md
|
||||
@@ -1,20 +0,0 @@
|
||||
cube-fr.dot
|
||||
cube.dot
|
||||
disconnected-fr.dot
|
||||
graphml_test_out.xml
|
||||
kevin-bacon2.dat
|
||||
random.dot
|
||||
triangular-fr.dot
|
||||
triangular-kk.dot
|
||||
test/*.dot
|
||||
example/routing-table.dat
|
||||
example/figs/ospf-sptree.dot
|
||||
CMakeFiles/
|
||||
|
||||
# Antora docs build artifacts
|
||||
doc/build/
|
||||
doc/node_modules/
|
||||
|
||||
# macOS
|
||||
.DS_Store
|
||||
**/.DS_Store
|
||||
@@ -1,74 +0,0 @@
|
||||
# Copyright 2020, 2021 Peter Dimov
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# https://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
cmake_minimum_required(VERSION 3.8...3.16)
|
||||
|
||||
project(boost_graph VERSION "${BOOST_SUPERPROJECT_VERSION}" LANGUAGES CXX)
|
||||
|
||||
add_library(boost_graph
|
||||
src/graphml.cpp
|
||||
src/read_graphviz_new.cpp
|
||||
)
|
||||
|
||||
add_library(Boost::graph ALIAS boost_graph)
|
||||
|
||||
target_include_directories(boost_graph PUBLIC include)
|
||||
|
||||
target_link_libraries(boost_graph
|
||||
PUBLIC
|
||||
Boost::algorithm
|
||||
Boost::any
|
||||
Boost::array
|
||||
Boost::assert
|
||||
Boost::bimap
|
||||
Boost::concept_check
|
||||
Boost::config
|
||||
Boost::container_hash
|
||||
Boost::core
|
||||
Boost::detail
|
||||
Boost::function
|
||||
Boost::integer
|
||||
Boost::iterator
|
||||
Boost::lexical_cast
|
||||
Boost::mp11
|
||||
Boost::mpl
|
||||
Boost::multi_index
|
||||
Boost::multiprecision
|
||||
Boost::optional
|
||||
Boost::parameter
|
||||
Boost::preprocessor
|
||||
Boost::property_map
|
||||
Boost::property_tree
|
||||
Boost::random
|
||||
Boost::range
|
||||
Boost::serialization
|
||||
Boost::smart_ptr
|
||||
Boost::spirit
|
||||
Boost::throw_exception
|
||||
Boost::tuple
|
||||
Boost::type_traits
|
||||
Boost::unordered
|
||||
Boost::utility
|
||||
Boost::xpressive
|
||||
PRIVATE
|
||||
Boost::regex
|
||||
)
|
||||
|
||||
target_compile_definitions(boost_graph
|
||||
PUBLIC BOOST_GRAPH_NO_LIB
|
||||
# Source files already define BOOST_GRAPH_SOURCE
|
||||
# PRIVATE BOOST_GRAPH_SOURCE
|
||||
)
|
||||
|
||||
if(BUILD_SHARED_LIBS)
|
||||
target_compile_definitions(boost_graph PUBLIC BOOST_GRAPH_DYN_LINK)
|
||||
else()
|
||||
target_compile_definitions(boost_graph PUBLIC BOOST_GRAPH_STATIC_LINK)
|
||||
endif()
|
||||
|
||||
if(BUILD_TESTING AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/test/CMakeLists.txt")
|
||||
|
||||
add_subdirectory(test)
|
||||
|
||||
endif()
|
||||
@@ -1,84 +0,0 @@
|
||||
|
||||
# Contributor Covenant Code of Conduct
|
||||
|
||||
## Our Pledge
|
||||
|
||||
We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation.
|
||||
|
||||
We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to a positive environment for our community include:
|
||||
|
||||
* Demonstrating empathy and kindness toward other people
|
||||
* Being respectful of differing opinions, viewpoints, and experiences
|
||||
* Giving and gracefully accepting constructive feedback
|
||||
* Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
|
||||
* Focusing on what is best not just for us as individuals, but for the overall community
|
||||
|
||||
Examples of unacceptable behavior include:
|
||||
|
||||
* The use of sexualized language or imagery, and sexual attention or advances of any kind
|
||||
* Trolling, insulting or derogatory comments, and personal or political attacks
|
||||
* Public or private harassment
|
||||
* Publishing others' private information, such as a physical or email address, without their explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a professional setting
|
||||
|
||||
## Enforcement Responsibilities
|
||||
|
||||
Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.
|
||||
|
||||
Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at `arnaud.becheler -at- gmail.com`. All complaints will be reviewed and investigated promptly and fairly.
|
||||
|
||||
All community leaders are obligated to respect the privacy and security of the reporter of any incident.
|
||||
|
||||
## Enforcement Guidelines
|
||||
|
||||
Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:
|
||||
|
||||
### 1. Correction
|
||||
|
||||
**Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.
|
||||
|
||||
**Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.
|
||||
|
||||
### 2. Warning
|
||||
|
||||
**Community Impact**: A violation through a single incident or series of actions.
|
||||
|
||||
**Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.
|
||||
|
||||
### 3. Temporary Ban
|
||||
|
||||
**Community Impact**: A serious violation of community standards, including sustained inappropriate behavior.
|
||||
|
||||
**Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.
|
||||
|
||||
### 4. Permanent Ban
|
||||
|
||||
**Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.
|
||||
|
||||
**Consequence**: A permanent ban from any sort of public interaction within the community.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.1, available at [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
|
||||
|
||||
Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder][Mozilla CoC].
|
||||
|
||||
For answers to common questions about this code of conduct, see the FAQ at [https://www.contributor-covenant.org/faq][FAQ]. Translations are available at [https://www.contributor-covenant.org/translations][translations].
|
||||
|
||||
[homepage]: https://www.contributor-covenant.org
|
||||
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
|
||||
[Mozilla CoC]: https://github.com/mozilla/diversity
|
||||
[FAQ]: https://www.contributor-covenant.org/faq
|
||||
[translations]: https://www.contributor-covenant.org/translations
|
||||
@@ -1,182 +0,0 @@
|
||||
# Contributing to Boost.Graph
|
||||
|
||||
## We are welcoming contributions
|
||||
|
||||
- Bug fixes and test cases for them
|
||||
- New algorithms (with tests, documentation, complexity notes, and a reference)
|
||||
- Documentation, examples, performance work
|
||||
- Concept refinements (handle with care as these are API-visible)
|
||||
|
||||
## Maintainers
|
||||
|
||||
| Maintainer | Role | Focus | Availability | Contact |
|
||||
|---|---|---|---|---|
|
||||
| **Jeremy W. Murphy** | Principal maintainer. Holds merge authority and final say on design decisions. | Algorithms, technical review, library architecture. 10+ years on BGL. | Part-time, best-effort. | `jeremy.william.murphy -at- gmail.com` |
|
||||
| **Arnaud Becheler** | Assistant maintainer. Triage, review, and contributor support; defers to Jeremy on merge decisions. | Documentation, modernization, contributor onboarding. | Full-time, funded by the [C++ Alliance](https://cppalliance.org) to assist Jeremy. | `arnaud.becheler -at- gmail.com` |
|
||||
|
||||
The authoritative maintainer list lives in [meta/libraries.json](meta/libraries.json); keep this section in sync with it. Maintainers aim to provide first-pass review on new PRs within two weeks.
|
||||
|
||||
## Getting set up
|
||||
|
||||
Clone the [Boost superproject](https://github.com/boostorg/boost):
|
||||
|
||||
```bash
|
||||
git clone --depth 1 https://github.com/boostorg/boost
|
||||
cd boost
|
||||
git submodule update --init --depth 1
|
||||
./bootstrap.sh
|
||||
./b2 headers
|
||||
```
|
||||
|
||||
Then replace `libs/graph/` with your fork:
|
||||
|
||||
```bash
|
||||
rm -rf libs/graph
|
||||
git clone https://github.com/<you>/graph libs/graph
|
||||
cd libs/graph
|
||||
git remote add upstream https://github.com/boostorg/graph
|
||||
```
|
||||
|
||||
## Building and testing
|
||||
|
||||
- Headers only: `./b2 headers` from boost root
|
||||
- Compiled components: `./b2` from `libs/graph`
|
||||
- All tests: `./b2` from `libs/graph/test` (takes ~10 min)
|
||||
- Single test: `./b2 cycle_canceling_test` from `libs/graph/test`
|
||||
- Different C++ standard: `./b2 cxxstd=20`
|
||||
- Different compiler: `./b2 toolset=clang`
|
||||
|
||||
### Naming conventions
|
||||
|
||||
BGL follows the standard Boost / STL conventions:
|
||||
|
||||
| Kind | Style | Example |
|
||||
|---|---|---|
|
||||
| Functions, types, variables, files | `snake_case` | `dijkstra_visitor`, `add_edge`, `adjacency_list.hpp` |
|
||||
| Member functions / methods | `snake_case` (same as free functions) | `get_edge`, `out_edges` |
|
||||
| Private member variables | `m_` prefix + `snake_case` | `m_matrix`, `m_num_edges`, `m_property` |
|
||||
| Concept names | `PascalCase` | `IncidenceGraph`, `VertexListGraph` |
|
||||
| Template parameters | `PascalCase` | `template <class Graph, class WeightMap>` |
|
||||
| Tag-dispatch types | `snake_case` + `S` suffix | `vecS`, `directedS` |
|
||||
| Macros | `BOOST_GRAPH_` prefix, `SCREAMING_SNAKE_CASE` | `BOOST_GRAPH_DECLARE_EDGE_PROPERTY` |
|
||||
|
||||
### Formatting
|
||||
|
||||
Low-level formatting (braces, column width, spaces in angle brackets, etc.) is captured by the [`.clang-format`](.clang-format) file at the repo root (WebKit preset with BGL-specific overrides: Allman braces, 80-column limit, `Cpp03`). It is **not** enforced by CI, but contributors are encouraged to run `clang-format -i` on files they touch before opening a PR.
|
||||
|
||||
## Using other Boost libraries
|
||||
|
||||
When writing new code:
|
||||
|
||||
- **Prefer `std::`** when the supported C++ standard has an equivalent. Use `std::function`, `std::shared_ptr`, `std::tuple` over their Boost counterparts. Exceptions are welcome with justification in the PR description, in particular Boost containers with no std equivalent in our standard window (e.g. `boost::unordered_flat_map`, `boost::bimap`, `boost::multi_index_container`).
|
||||
- **Avoid pulling in new heavy dependencies** (Spirit, property_tree, xpressive, etc.) without justification: BGL is gradually migrating away from heavy Boost dependencies. Open a discussion before adding one.
|
||||
- **Concept checks** (`boost::concept`) are encouraged for any new public template. New public APIs should respect the existing concept hierarchy.
|
||||
- Track BGL's position in the Boost dependency DAG via [boostdep](https://github.com/boostorg/boostdep)'s hosted reports. The long-term goal is to reduce BGL's level over time:
|
||||
- **[Module levels](https://pdimov.github.io/boostdep-report/master/module-levels.html#graph)** shows BGL's depth in the global DAG. A rising level means new transitive Boost dependencies have been pulled in.
|
||||
- **[Per-library page](https://pdimov.github.io/boostdep-report/develop/graph.html)** shows BGL's direct deps and per-dep `#include` counts.
|
||||
|
||||
## Boost macro usage
|
||||
|
||||
BGL has accumulated a wide vocabulary of `BOOST_*` macros from its pre-C++14 days. The table below captures the current guidance for each one used in the codebase: **Keep** as-is, **Replace** with a language or std equivalent, or **Remove** along with the dead `#if defined(...)` branch the macro guards. When in doubt, follow the recommendation here or ask before introducing new uses.
|
||||
|
||||
| Macro | Recommendation |
|
||||
|---|---|
|
||||
| `BOOST_ASSERT` | Keep, more useful and configurable than `assert` |
|
||||
| `BOOST_BORLANDC` | Remove |
|
||||
| `BOOST_CONCEPT_ASSERT` | Keep (pre C++20) |
|
||||
| `BOOST_CONCEPT_REQUIRES` | Keep (pre C++20) |
|
||||
| `BOOST_CONCEPT_USAGE` | Keep (pre C++20) |
|
||||
| `BOOST_DEDUCED_TYPENAME` | Remove |
|
||||
| `BOOST_FOREACH` | Replace with an appropriate algorithm or range-based `for` loop |
|
||||
| `BOOST_FWD_REF` | Replace with `T&&` |
|
||||
| `BOOST_JOIN` | Keep |
|
||||
| `BOOST_MPL_HAS_XXX_TRAIT_DEF` | Consider writing the same utility without dependency on MPL |
|
||||
| `BOOST_MSVC` | Keep |
|
||||
| `BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP` | Remove |
|
||||
| `BOOST_NO_AUTO_PTR` | Remove and assume `auto_ptr` is not available |
|
||||
| `BOOST_NO_CXX11_ALLOCATOR` | Remove |
|
||||
| `BOOST_NO_CXX11_RVALUE_REFERENCES` | Remove |
|
||||
| `BOOST_NO_CXX11_SMART_PTR` | Remove |
|
||||
| `BOOST_NO_CXX17_STRUCTURED_BINDINGS` | Keep |
|
||||
| `BOOST_NO_MEMBER_TEMPLATE_FRIENDS` | Remove |
|
||||
| `BOOST_NO_SFINAE` | Remove |
|
||||
| `BOOST_NO_STDC_NAMESPACE` | Possibly keep |
|
||||
| `BOOST_NO_STD_ALLOCATOR` | Remove |
|
||||
| `BOOST_NO_STD_ITERATOR_TRAITS` | Remove |
|
||||
| `BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS` | Remove |
|
||||
| `BOOST_OVERRIDE` | Possibly remove |
|
||||
| `BOOST_PARAMETER_KEYWORD` | Keep |
|
||||
| `BOOST_PARAMETER_NAME` | Keep |
|
||||
| `BOOST_PP_CAT` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PP_COMMA_IF` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PP_DEC` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PP_ENUM_BINARY_PARAMS` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PP_ENUM_BINARY_PARAMS_Z` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PP_ENUM_PARAMS` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PP_ENUM_PARAMS_Z` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_Z` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PP_ENUM_TRAILING_PARAMS_Z` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PP_EXPR_IF` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PP_INC` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PP_LPAREN_IF` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PP_REPEAT` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PP_REPEAT_FROM_TO` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PP_RPAREN_IF` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PP_SEQ_ELEM` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PP_SUB` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PP_TUPLE_EAT` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PREVENT_MACRO_SUBSTITUTION` | Keep |
|
||||
| `BOOST_SERIALIZATION_NVP` | Consider removing if you can eliminate the dependency on Boost.Serialization via `<boost/core/serialization.hpp>` |
|
||||
| `BOOST_SPIRIT_CLOSURE_LIMIT` | Keep |
|
||||
| `BOOST_SPIRIT_DEBUG` | Keep |
|
||||
| `BOOST_SPIRIT_DEBUG_RULE` | Keep |
|
||||
| `BOOST_STATIC_ASSERT` | Replace with `static_assert(..., msg)` |
|
||||
| `BOOST_STATIC_ASSERT_MSG` | Replace with `static_assert(..., msg)` |
|
||||
| `BOOST_STATIC_CONSTANT` | Remove in favour of in-class `static constexpr` initialization |
|
||||
| `BOOST_SYMBOL_EXPORT` | Keep |
|
||||
| `BOOST_SYMBOL_IMPORT` | Keep |
|
||||
| `BOOST_SYMBOL_VISIBLE` | Keep |
|
||||
| `BOOST_TESTED_AT` | Keep |
|
||||
| `BOOST_THROW_EXCEPTION` | Keep |
|
||||
| `BOOST_TTI_HAS_MEMBER_FUNCTION` | Consider writing the same utility without dependency on TTI |
|
||||
| `BOOST_USING_STD_MAX` | Replace with `(std::max)(...)` |
|
||||
| `BOOST_USING_STD_MIN` | Replace with `(std::min)(...)` |
|
||||
| `BOOST_WORKAROUND` | Keep |
|
||||
|
||||
When you mark a `BOOST_NO_*` flag as **Remove**, also delete the `#if defined(...)` block it gates — the alternate branch is always taken on the supported toolchains.
|
||||
|
||||
## Pull request process
|
||||
|
||||
- Fork, branch from `develop`, PR back to `develop`
|
||||
- One logical change per PR; rebase before requesting review
|
||||
- Tests required for new features and bug fixes
|
||||
- **Open (non-draft) PRs are assumed ready for review.** Use GitHub's Draft state while iterating, then mark the PR as *Ready for review* when you want maintainers to look at it.
|
||||
- A maintainer will review within ~2 weeks (see Maintainers below)
|
||||
- Squash on merge by default
|
||||
|
||||
## Merge criteria
|
||||
|
||||
Before a PR is merged, all of the following must hold:
|
||||
|
||||
1. CI is green on the full matrix (gcc-14 + clang-19, C++14/17/20/23).
|
||||
2. New behavior has tests.
|
||||
3. Bug fixes have a regression test.
|
||||
4. Documentation under [doc/](doc/) is updated if the public API changed.
|
||||
5. No new compiler warnings on the supported toolchains.
|
||||
6. The PR is rebased on current `develop` with a clean commit history.
|
||||
7. The principal maintainer has approved.
|
||||
|
||||
## Reporting bugs
|
||||
|
||||
1. Search [existing issues](https://github.com/boostorg/graph/issues) first
|
||||
2. Note compiler, version, OS, Boost version
|
||||
3. Minimal reproducer on [Compiler Explorer](https://godbolt.org/z/37dPWd5bs)
|
||||
4. Expected Output versus Actual Output is explained.
|
||||
|
||||
## Security
|
||||
|
||||
See [SECURITY.md](SECURITY.md).
|
||||
|
||||
## License
|
||||
|
||||
By contributing, you agree your contribution is licensed under the [Boost Software License 1.0](https://www.boost.org/LICENSE_1_0.txt).
|
||||
@@ -0,0 +1,100 @@
|
||||
COPYRIGHT NOTICE:
|
||||
|
||||
Copyright 1997-2000, University of Notre Dame.
|
||||
Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek
|
||||
|
||||
The Boost Graph Library "Artistic License"
|
||||
|
||||
Preamble
|
||||
|
||||
The intent of this document is to state the conditions under which a
|
||||
Package may be copied, such that the Copyright Holder maintains some
|
||||
semblance of artistic control over the development of the package,
|
||||
while giving the users of the package the right to use and distribute
|
||||
the Package in a more-or-less free fashion, plus the right to make
|
||||
reasonable modifications.
|
||||
|
||||
Definitions
|
||||
|
||||
"Package" refers to the collection of files distributed by the
|
||||
Copyright Holder, and derivatives of that collection of files created
|
||||
through textual modification.
|
||||
|
||||
"Standard Version" refers to such a Package if it has not been
|
||||
modified, or has been modified in accordance with the wishes of the
|
||||
Copyright Holder as specified below.
|
||||
|
||||
"Copyright Holder" is whoever is named in the copyright or copyrights for the package.
|
||||
|
||||
"You" is you, if you're thinking about copying or distributing this Package.
|
||||
|
||||
"Reasonable copying fee" is whatever you can justify on the basis of
|
||||
media cost, duplication charges, time of people involved, and so
|
||||
on. (You will not be required to justify it to the Copyright Holder,
|
||||
but only to the computing community at large as a market that must
|
||||
bear the fee.)
|
||||
|
||||
"Freely Available" means that no fee is charged for the item itself,
|
||||
though there may be fees involved in handling the item. It also means
|
||||
that recipients of the item may redistribute it under the same
|
||||
conditions they received it.
|
||||
|
||||
1. You may make and give away verbatim copies of the source form of
|
||||
the Standard Version of this Package without restriction, provided
|
||||
that you duplicate all of the original copyright notices and
|
||||
associated disclaimers.
|
||||
|
||||
2. You may apply bug fixes, portability fixes and other modifications
|
||||
derived from the Public Domain or from the Copyright Holder. A Package
|
||||
modified in such a way shall still be considered the Standard Version.
|
||||
|
||||
3. You may otherwise modify your copy of this Package in any way,
|
||||
provided that you insert a prominent notice in each changed file
|
||||
stating how and when you changed that file, and provided that you do
|
||||
at least ONE of the following:
|
||||
|
||||
a. place your modifications in the Public Domain or otherwise make
|
||||
them Freely Available, such as by posting said modifications to Usenet
|
||||
or an equivalent medium, or placing the modifications on a major
|
||||
archive site such as uunet.uu.net, or by allowing the Copyright Holder
|
||||
to include your modifications in the Standard Version of the Package.
|
||||
b. use the modified Package only within your corporation or organization.
|
||||
c. rename any non-standard types and functions so the names do not
|
||||
conflict with Standard Vibrary, which must also be provided, and
|
||||
provide a separate documentation for each non-standard type of function
|
||||
that clearly documents how it differs from the Standard Version.
|
||||
d. make other distribution arrangements with the Copyright Holder.
|
||||
|
||||
4. You may charge a reasonable copying fee for any distribution of this
|
||||
Package. You may charge any fee you choose for support of this
|
||||
Package. You may not charge a fee for this Package itself. However,
|
||||
you may distribute this Package in aggregate with other (possibly
|
||||
commercial) programs as part of a larger (possibly commercial)
|
||||
software distribution provided that you do not advertise this Package
|
||||
as a product of your own.
|
||||
|
||||
5. The name of the Copyright Holder may not be used to endorse or
|
||||
promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
DISCLAIMER:
|
||||
|
||||
LICENSOR MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED.
|
||||
By way of example, but not limitation, Licensor MAKES NO
|
||||
REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY
|
||||
PARTICULAR PURPOSE OR THAT THE USE OF THE LICENSED SOFTWARE COMPONENTS
|
||||
OR DOCUMENTATION WILL NOT INFRINGE ANY PATENTS, COPYRIGHTS, TRADEMARKS
|
||||
OR OTHER RIGHTS.
|
||||
|
||||
The Authors and the University of Notre Dame du Lac shall not be held
|
||||
liable for any liability nor for any direct, indirect or consequential
|
||||
damages with respect to any claim by LICENSEE or any third party on
|
||||
account of or arising from this Agreement or use of this software.
|
||||
|
||||
Any disputes arising out of this Agreement or LICENSEE'S use of the
|
||||
software at any time shall be resolved by the courts of the state of
|
||||
Indiana. LICENSEE hereby consents to the jurisdiction of the Indiana
|
||||
courts and waives the right to challenge the jurisdiction thereof in
|
||||
any dispute arising out of this Agreement or Licensee's use of the
|
||||
software.
|
||||
|
||||
@@ -1,106 +0,0 @@
|
||||
# Boost Graph Library
|
||||
|
||||
[](https://www.boost.org/doc/libs/release/libs/graph/doc/index.html)
|
||||
[](https://en.cppreference.com/w/cpp/14)
|
||||
[](https://github.com/boostorg/graph/actions/workflows/ci.yml)
|
||||
[](https://www.boost.org/LICENSE_1_0.txt)
|
||||
[](https://github.com/boostorg/boost/releases)
|
||||
|
||||
The Boost Graph Library (BGL) is a generic library that allows users to:
|
||||
|
||||
1. Represent graph data using different structures (adjacency matrix, adjacency list, compressed sparse row, vectors of vectors, user-defined data structures).
|
||||
2. Attach user-defined data to vertices, edges, or the graph itself.
|
||||
3. Run a large number of algorithms on the graph.
|
||||
4. Inject user logic into algorithms using visitor hooks.
|
||||
|
||||
## Example
|
||||
|
||||
[Try it on Compiler Explorer](https://godbolt.org/z/9Esszr9Ga)
|
||||
|
||||
```cpp
|
||||
#include <boost/graph/adjacency_list.hpp>
|
||||
#include <boost/graph/dijkstra_shortest_paths.hpp>
|
||||
#include <boost/graph/visitors.hpp>
|
||||
#include <iostream>
|
||||
#include <limits>
|
||||
#include <vector>
|
||||
|
||||
struct City {};
|
||||
struct Road { int cost; };
|
||||
|
||||
using namespace boost;
|
||||
using Graph = adjacency_list<vecS, vecS, directedS, City, Road>;
|
||||
using Vertex = graph_traits<Graph>::vertex_descriptor;
|
||||
|
||||
int main() {
|
||||
Graph g(4);
|
||||
add_edge(0, 1, Road{1}, g);
|
||||
add_edge(1, 2, Road{2}, g);
|
||||
add_edge(0, 2, Road{10}, g);
|
||||
add_edge(2, 3, Road{1}, g);
|
||||
|
||||
// Storage: you control allocation, lifetime, and container type
|
||||
std::vector<Vertex> storage_pred(num_vertices(g));
|
||||
std::vector<int> storage_dist(num_vertices(g));
|
||||
|
||||
// Property maps: lightweight views into the storage
|
||||
auto index_map = get(vertex_index, g);
|
||||
auto costs_map = get(&Road::cost, g);
|
||||
auto predecessor_map = make_iterator_property_map(storage_pred.begin(), index_map);
|
||||
auto distance_map = make_iterator_property_map(storage_dist.begin(), index_map);
|
||||
|
||||
dijkstra_shortest_paths(g, vertex(0, g),
|
||||
predecessor_map, distance_map,
|
||||
costs_map, index_map,
|
||||
std::less<int>(), std::plus<int>(),
|
||||
std::numeric_limits<int>::max(), 0,
|
||||
dijkstra_visitor<null_visitor>());
|
||||
|
||||
for (auto v : make_iterator_range(vertices(g)))
|
||||
std::cout << "distance to " << v << " = " << storage_dist[v] << "\n";
|
||||
}
|
||||
```
|
||||
```
|
||||
distance to 0 = 0
|
||||
distance to 1 = 1
|
||||
distance to 2 = 3
|
||||
distance to 3 = 4
|
||||
```
|
||||
|
||||
## Algorithms
|
||||
|
||||
BGL ships dozens of graph algorithms: shortest paths (Dijkstra, Bellman-Ford, A*, Floyd-Warshall, Johnson), spanning trees (Kruskal, Prim), maximum flow (Edmonds-Karp, push-relabel, Boykov-Kolmogorov), traversal (BFS, DFS, topological sort), planarity testing, isomorphism, component decomposition, and more.
|
||||
|
||||
See the [full algorithm reference](https://becheler.github.io/graph/graph/algorithms/overview.html) for the complete catalogue.
|
||||
|
||||
## Help and feedback
|
||||
|
||||
* **[GitHub Issues](https://github.com/boostorg/graph/issues)** for bug reports. Search before opening a new one.
|
||||
* **[GitHub Discussions](https://github.com/boostorg/graph/discussions)** for questions, design ideas, and general conversation about the library.
|
||||
* **[Boost mailing list](http://lists.boost.org/mailman/listinfo.cgi/boost-users)** for general Boost development. Use the `[graph]` tag in the subject line.
|
||||
* **CppLang Slack** for real-time chat. [Request an invite](https://cppalliance.org/slack/), then join the `#boost` channel.
|
||||
* **Direct contact with maintainers**: see [CONTRIBUTING.md#maintainers](CONTRIBUTING.md#maintainers).
|
||||
|
||||
## Using BGL
|
||||
|
||||
Install Boost via your package manager:
|
||||
|
||||
| Manager | Command |
|
||||
|---|---|
|
||||
| [vcpkg](https://vcpkg.io) | `vcpkg install boost-graph` |
|
||||
| [Conan](https://conan.io) | `conan install --requires=boost/[*]` |
|
||||
| apt (Debian/Ubuntu) | `sudo apt install libboost-graph-dev` |
|
||||
| Homebrew (macOS) | `brew install boost` |
|
||||
|
||||
Then wire it into CMake:
|
||||
|
||||
```cmake
|
||||
find_package(Boost REQUIRED COMPONENTS graph)
|
||||
target_link_libraries(my_app PRIVATE Boost::graph)
|
||||
```
|
||||
|
||||
Most of BGL is header-only. Linking `Boost::graph` is only required for the GraphViz and GraphML parsers.
|
||||
|
||||
## Building from source
|
||||
|
||||
For working on BGL itself (building Boost from source, running the test suite), see [CONTRIBUTING.md](CONTRIBUTING.md).
|
||||
@@ -1,14 +0,0 @@
|
||||
# Security Policy
|
||||
|
||||
Boost.Graph is a header-only C++ template library. Most issues that look
|
||||
like security problems are caused by misuse of the API, undefined behavior
|
||||
in caller code, or violating a documented precondition. Those should be
|
||||
filed as regular GitHub issues.
|
||||
|
||||
If you believe you have found a genuine vulnerability in the library
|
||||
itself, please report it privately through GitHub's
|
||||
[private vulnerability reporting](https://github.com/boostorg/graph/security/advisories/new)
|
||||
rather than opening a public issue.
|
||||
|
||||
Fixes land on the `develop` branch and ship with the next Boost release.
|
||||
No back-porting to older releases is guaranteed.
|
||||
@@ -1,55 +0,0 @@
|
||||
# Copyright René Ferdinand Rivera Morell 2024
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or copy at
|
||||
# http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
require-b2 5.2 ;
|
||||
|
||||
constant boost_dependencies :
|
||||
/boost/algorithm//boost_algorithm
|
||||
/boost/any//boost_any
|
||||
/boost/array//boost_array
|
||||
/boost/assert//boost_assert
|
||||
/boost/bimap//boost_bimap
|
||||
/boost/concept_check//boost_concept_check
|
||||
/boost/config//boost_config
|
||||
/boost/container_hash//boost_container_hash
|
||||
/boost/core//boost_core
|
||||
/boost/detail//boost_detail
|
||||
/boost/function//boost_function
|
||||
/boost/integer//boost_integer
|
||||
/boost/iterator//boost_iterator
|
||||
/boost/lexical_cast//boost_lexical_cast
|
||||
/boost/mp11//boost_mp11
|
||||
/boost/mpl//boost_mpl
|
||||
/boost/multi_index//boost_multi_index
|
||||
/boost/multiprecision//boost_multiprecision
|
||||
/boost/optional//boost_optional
|
||||
/boost/parameter//boost_parameter
|
||||
/boost/preprocessor//boost_preprocessor
|
||||
/boost/property_map//boost_property_map
|
||||
/boost/property_tree//boost_property_tree
|
||||
/boost/random//boost_random
|
||||
/boost/range//boost_range
|
||||
/boost/serialization//boost_serialization
|
||||
/boost/smart_ptr//boost_smart_ptr
|
||||
/boost/spirit//boost_spirit
|
||||
/boost/throw_exception//boost_throw_exception
|
||||
/boost/tuple//boost_tuple
|
||||
/boost/type_traits//boost_type_traits
|
||||
/boost/unordered//boost_unordered
|
||||
/boost/utility//boost_utility
|
||||
/boost/xpressive//boost_xpressive ;
|
||||
|
||||
project /boost/graph
|
||||
;
|
||||
|
||||
explicit
|
||||
[ alias boost_graph : build//boost_graph ]
|
||||
[ alias all : boost_graph example test ]
|
||||
;
|
||||
|
||||
call-if : boost-library graph
|
||||
: install boost_graph
|
||||
;
|
||||
|
||||
@@ -1,32 +0,0 @@
|
||||
# Copyright (c) 2002 Trustees of Indiana University
|
||||
#
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or copy at
|
||||
# http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
import mpi ;
|
||||
|
||||
constant boost_dependencies_private :
|
||||
/boost/regex//boost_regex
|
||||
;
|
||||
|
||||
project
|
||||
: common-requirements <include>../include <library>$(boost_dependencies)
|
||||
: requirements <include>../src <library>$(boost_dependencies_private)
|
||||
: source-location ../src
|
||||
: usage-requirements <define>BOOST_GRAPH_NO_LIB=1
|
||||
;
|
||||
|
||||
lib boost_graph
|
||||
:
|
||||
read_graphviz_new.cpp
|
||||
graphml.cpp
|
||||
:
|
||||
<link>shared:<define>BOOST_GRAPH_DYN_LINK=1
|
||||
# Without these flags, MSVC 7.1 and 8.0 crash
|
||||
# User reports that VC++ 8.0 does not fail anymore, so that is removed
|
||||
<toolset>msvc-7.1:<cxxflags>-GR-
|
||||
<toolset>sun:<build>no
|
||||
:
|
||||
:
|
||||
;
|
||||
@@ -1,85 +0,0 @@
|
||||
# Contributing to the Boost.Graph documentation
|
||||
|
||||
The docs are built with [Antora](https://antora.org) from AsciiDoc
|
||||
sources under `doc/modules/ROOT/`.
|
||||
|
||||
## Layout
|
||||
|
||||
| Where | What |
|
||||
|---|---|
|
||||
| `doc/modules/ROOT/pages/` | All `.adoc` pages (organized by topic) |
|
||||
| `doc/modules/ROOT/examples/` | One `.cpp` per page; the build script captures stdout into a sibling `.txt` |
|
||||
| `doc/modules/ROOT/nav.adoc` | Left-side navigation tree |
|
||||
| `doc/templates/` | Starter templates: `algorithm.adoc`, `generator.adoc`, `graph_class.adoc` — copy and fill in |
|
||||
| `doc/playbook.yml` | Antora playbook (UI bundle, content sources) |
|
||||
| `doc/modules/ROOT/examples/Jamfile` | b2 rules that compile every example and snapshot its stdout into a sibling `.txt` |
|
||||
| `doc/build_example_outputs.sh`| g++-only fallback that does the same thing as the Jamfile, for contributors without a `boost-root` checkout |
|
||||
|
||||
## Adding a new page
|
||||
|
||||
1. Pick a template in `doc/templates/` and copy it into the right
|
||||
`pages/` subdirectory.
|
||||
2. Replace the placeholders (title, signatures, parameter table). Keep
|
||||
the section order from the template so the page is consistent with
|
||||
the rest.
|
||||
3. Add an `.cpp` example under `modules/ROOT/examples/` at the path
|
||||
the page's `include::example$…[]` directive points to.
|
||||
4. Add an `xref:` line to `doc/modules/ROOT/nav.adoc`.
|
||||
|
||||
## Building locally
|
||||
|
||||
The example outputs are generated by b2 (the standard Boost build
|
||||
system). From a `boost-root` layout:
|
||||
|
||||
```sh
|
||||
# 1) Compile every example and snapshot its stdout into a sibling .txt.
|
||||
b2 libs/graph/doc/modules/ROOT/examples
|
||||
|
||||
# 2) Build the static site.
|
||||
cd libs/graph
|
||||
npx antora doc/playbook.yml
|
||||
|
||||
# 3) Open the result.
|
||||
open doc/build/site/index.html # macOS
|
||||
xdg-open doc/build/site/index.html # Linux
|
||||
```
|
||||
|
||||
CI runs the same commands on every push.
|
||||
|
||||
### Quick fallback (no boost-root required)
|
||||
|
||||
For doc-only contributors who only want to fix typos and don't have a
|
||||
boost-root checkout, a shell-script equivalent is provided:
|
||||
|
||||
```sh
|
||||
BOOST_INCLUDE=/path/to/boost/include \
|
||||
BOOST_LIB=/path/to/boost/lib \
|
||||
bash doc/build_example_outputs.sh
|
||||
```
|
||||
|
||||
Functionally equivalent to step 1 above; uses g++ directly instead of
|
||||
b2. `BOOST_LIB` is only needed for the three link-required examples
|
||||
(`io/graphml.cpp`, `io/graphviz.cpp`,
|
||||
`algorithms/isomorphism/isomorphism.cpp`).
|
||||
|
||||
## Conventions
|
||||
|
||||
- **Examples first.** `== Example` (with `*Expected output:*` block)
|
||||
goes immediately after `*Defined in:*` so readers see working code
|
||||
before signatures.
|
||||
- **Bold metadata.** `*Complexity:*`, `*Defined in:*`,
|
||||
`*Expected output:*` are bold.
|
||||
- **Output blocks** use `[,text]\n----` (same listing-block wrapper as
|
||||
the code above) and pull from the `.txt` sidecar via
|
||||
`include::example$…[]`, so the documentation can never drift from the
|
||||
code and the two blocks align vertically on the page.
|
||||
- **Heading levels:** `==` for top-level sections; `===` only for
|
||||
numbered overloads or grouped variants. The `'''` thematic break
|
||||
appears only before a `===`, never before a `==`.
|
||||
- **Bundled properties** preferred over interior tag properties in
|
||||
examples, unless the algorithm requires the tag.
|
||||
|
||||
## License
|
||||
|
||||
By contributing you agree to license your contribution under the
|
||||
[Boost Software License 1.0](http://www.boost.org/LICENSE_1_0.txt).
|
||||
@@ -1,13 +0,0 @@
|
||||
name: graph
|
||||
version: ~
|
||||
title: Boost.Graph
|
||||
start_page: index.adoc
|
||||
asciidoc:
|
||||
attributes:
|
||||
source-language: cpp@
|
||||
table-caption: false
|
||||
# Right-rail floating TOC. Set here (not in the playbook) so it travels
|
||||
# with the component under any deploy playbook, not just the local build.
|
||||
page-toc: ''
|
||||
nav:
|
||||
- modules/ROOT/nav.adoc
|
||||
@@ -1,30 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
#
|
||||
# Official repository: https://github.com/boostorg/graph
|
||||
#
|
||||
# Picked up by boostorg/release-tools' build_docs/{linuxdocs.sh,macosdocs.sh,
|
||||
# windowsdocs.ps1} via auto-detection: presence of this file selects the
|
||||
# Antora build pipeline. Output lands in doc/build/site/.
|
||||
|
||||
set -xe
|
||||
|
||||
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
|
||||
cd "$SCRIPT_DIR"
|
||||
|
||||
if [ $# -eq 0 ]; then
|
||||
PLAYBOOK="playbook.yml"
|
||||
else
|
||||
PLAYBOOK="$1"
|
||||
fi
|
||||
|
||||
echo "Installing npm dependencies..."
|
||||
npm ci
|
||||
|
||||
echo "Building docs with Antora using $PLAYBOOK..."
|
||||
PATH="$(pwd)/node_modules/.bin:${PATH}"
|
||||
export PATH
|
||||
npx antora --clean --fetch "$PLAYBOOK"
|
||||
echo "Done"
|
||||
@@ -1,89 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# Compiles every .cpp under modules/ROOT/examples/ with -std=c++14, runs it,
|
||||
# and writes stdout to a sibling .txt file that Antora pages can include.
|
||||
#
|
||||
# Usage:
|
||||
# BOOST_INCLUDE=/path/to/boost/include \
|
||||
# BOOST_LIB=/path/to/boost/lib \
|
||||
# ./build_example_outputs.sh
|
||||
#
|
||||
# Defaults below match the Conan-installed Boost 1.79 layout used for
|
||||
# local development. CI overrides them.
|
||||
|
||||
set -u
|
||||
|
||||
HERE=$(cd "$(dirname "$0")" && pwd)
|
||||
REPO_ROOT=$(cd "$HERE/.." && pwd)
|
||||
EXAMPLES_ROOT="$HERE/modules/ROOT/examples"
|
||||
|
||||
: "${BOOST_INCLUDE:=$HOME/.conan/data/boost/1.79.0/_/_/package/2c7a64ca03ffe00ac4600bf373ea3ecf338b36d9/include}"
|
||||
: "${BOOST_LIB:=}"
|
||||
: "${CXX:=g++}"
|
||||
: "${CXXFLAGS:=-std=c++14 -O1 -w}"
|
||||
|
||||
if [ ! -d "$BOOST_INCLUDE" ]; then
|
||||
echo "BOOST_INCLUDE not found: $BOOST_INCLUDE" >&2
|
||||
echo "Set BOOST_INCLUDE to the Boost include directory and re-run." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Per-example link flags. A handful of examples need the prebuilt
|
||||
# boost_graph library (graphviz, graphml readers and the isomorphism
|
||||
# example pull in non-header-only code).
|
||||
extra_libs_for() {
|
||||
case "$1" in
|
||||
io/graphml.cpp|io/graphviz.cpp|algorithms/isomorphism/isomorphism.cpp)
|
||||
echo "-lboost_graph"
|
||||
;;
|
||||
*)
|
||||
echo ""
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
LDFLAGS=""
|
||||
if [ -n "$BOOST_LIB" ]; then
|
||||
LDFLAGS="-L$BOOST_LIB -Wl,-rpath,$BOOST_LIB"
|
||||
fi
|
||||
|
||||
WORK=$(mktemp -d)
|
||||
trap 'rm -rf "$WORK"' EXIT
|
||||
|
||||
ok=0
|
||||
fail=0
|
||||
fail_list=""
|
||||
|
||||
while IFS= read -r src; do
|
||||
rel=${src#"$EXAMPLES_ROOT/"}
|
||||
out_txt=${src%.cpp}.txt
|
||||
bin="$WORK/$(basename "$src" .cpp).out"
|
||||
extra=$(extra_libs_for "$rel")
|
||||
|
||||
if ! "$CXX" $CXXFLAGS \
|
||||
-I"$REPO_ROOT/include" -I"$BOOST_INCLUDE" \
|
||||
"$src" -o "$bin" $LDFLAGS $extra 2>/dev/null; then
|
||||
printf ' [compile FAIL] %s\n' "$rel"
|
||||
fail=$((fail + 1))
|
||||
fail_list+="$rel (compile)\n"
|
||||
continue
|
||||
fi
|
||||
|
||||
if ! "$bin" > "$out_txt.tmp" 2>&1; then
|
||||
printf ' [run FAIL] %s\n' "$rel"
|
||||
rm -f "$out_txt.tmp"
|
||||
fail=$((fail + 1))
|
||||
fail_list+="$rel (run)\n"
|
||||
continue
|
||||
fi
|
||||
|
||||
mv "$out_txt.tmp" "$out_txt"
|
||||
printf ' [OK] %s\n' "$rel"
|
||||
ok=$((ok + 1))
|
||||
done < <(find "$EXAMPLES_ROOT" -name '*.cpp' | sort)
|
||||
|
||||
echo
|
||||
echo "Generated $ok .txt outputs, $fail failures."
|
||||
if [ "$fail" -gt 0 ]; then
|
||||
printf "Failing examples:\n$fail_list"
|
||||
exit 1
|
||||
fi
|
||||
@@ -1,19 +0,0 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>Boost.Graph</title>
|
||||
<meta http-equiv="refresh" content="0; URL=../../../doc/antora/graph/index.html">
|
||||
</head>
|
||||
<body>
|
||||
Automatic redirection failed, please go to
|
||||
<a href="../../../doc/antora/graph/index.html">../../../doc/antora/graph/index.html</a>
|
||||
<hr>
|
||||
<tt>
|
||||
Boost.Graph<br>
|
||||
<br>
|
||||
Distributed under the Boost Software License, Version 1.0.
|
||||
(See accompanying file LICENSE_1_0.txt or copy at
|
||||
<a href=http://www.boost.org/LICENSE_1_0.txt>http://www.boost.org/LICENSE_1_0.txt</a>) <br>
|
||||
<br>
|
||||
</tt>
|
||||
</body>
|
||||
</html>
|
||||
|
Before Width: | Height: | Size: 613 B |
|
Before Width: | Height: | Size: 613 B |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 968 B |
|
Before Width: | Height: | Size: 492 B |
@@ -1,17 +0,0 @@
|
||||
graph A {
|
||||
node[shape="circle"]
|
||||
B [ style="filled", fillcolor="red" ];
|
||||
G [ style="filled", fillcolor="red" ];
|
||||
A [ style="filled", fillcolor="red" ];
|
||||
A -- F[label="1"]
|
||||
A -- B[label="1"]
|
||||
A -- G[label="3"]
|
||||
B -- C[label="0"]
|
||||
B -- D[label="0"]
|
||||
B -- E[label="1"]
|
||||
C -- D[label="0"]
|
||||
E -- F[label="1"]
|
||||
G -- I[label="2"]
|
||||
G -- H[label="2"]
|
||||
H -- I[label="2"]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 106 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 786 B |
|
Before Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 8.0 KiB |
|
Before Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 121 KiB |
|
Before Width: | Height: | Size: 115 KiB |
|
Before Width: | Height: | Size: 182 KiB |
|
Before Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 49 KiB |
@@ -1,412 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="350"
|
||||
height="250"
|
||||
id="svg2"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.46"
|
||||
version="1.0"
|
||||
sodipodi:docname="grid_graph_indexed.svg"
|
||||
inkscape:output_extension="org.inkscape.output.svg.inkscape"
|
||||
inkscape:export-filename="/home/hansenm/Projects/boost-trunk/libs/graph/doc/figs/grid_graph_unwrapped.png"
|
||||
inkscape:export-xdpi="90"
|
||||
inkscape:export-ydpi="90">
|
||||
<defs
|
||||
id="defs4">
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Sstart"
|
||||
orient="auto"
|
||||
refY="0.0"
|
||||
refX="0.0"
|
||||
id="Arrow2Sstart"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path3938"
|
||||
style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
|
||||
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
|
||||
transform="scale(0.3) translate(-2.3,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Send"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow2Send"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path3324"
|
||||
style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z"
|
||||
transform="matrix(-0.3,0,0,-0.3,0.69,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Mend"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow2Mend"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path3318"
|
||||
style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z"
|
||||
transform="scale(-0.6,-0.6)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Lend"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow2Lend"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path3312"
|
||||
style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z"
|
||||
transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Send"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow1Send"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path3306"
|
||||
d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z"
|
||||
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
|
||||
transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Mend"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow1Mend"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path3300"
|
||||
d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z"
|
||||
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
|
||||
transform="matrix(-0.4,0,0,-0.4,-4,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Lend"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow1Lend"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path3294"
|
||||
d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z"
|
||||
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
|
||||
transform="matrix(-0.8,0,0,-0.8,-10,0)" />
|
||||
</marker>
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 526.18109 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="744.09448 : 526.18109 : 1"
|
||||
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
|
||||
id="perspective10" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
gridtolerance="10000"
|
||||
guidetolerance="10"
|
||||
objecttolerance="10"
|
||||
inkscape:pageopacity="1"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="2"
|
||||
inkscape:cx="79.05402"
|
||||
inkscape:cy="102.2962"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1600"
|
||||
inkscape:window-height="1150"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="25" />
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Vertices"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
sodipodi:insensitive="true">
|
||||
<g
|
||||
id="g3150">
|
||||
<g
|
||||
transform="translate(7.353668,21.661333)"
|
||||
id="g3204">
|
||||
<path
|
||||
d="M 63.63961,32.567215 A 16.920055,14.89975 0 1 1 29.7995,32.567215 A 16.920055,14.89975 0 1 1 63.63961,32.567215 z"
|
||||
sodipodi:ry="14.89975"
|
||||
sodipodi:rx="16.920055"
|
||||
sodipodi:cy="32.567215"
|
||||
sodipodi:cx="46.719555"
|
||||
id="path3199"
|
||||
style="opacity:0.5;fill:#808080;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
sodipodi:type="arc"
|
||||
transform="translate(2.8535534,2.5428932)" />
|
||||
<g
|
||||
id="g3168">
|
||||
<path
|
||||
style="fill:#00ccff;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
|
||||
d="M 63.63961,33.466965 C 63.63961,25.242303 56.059425,18.567215 46.719555,18.567215 C 37.379684,18.567215 29.7995,25.242303 29.7995,33.466965 L 63.63961,33.466965 z"
|
||||
id="path3158"
|
||||
sodipodi:nodetypes="cscc" />
|
||||
<path
|
||||
sodipodi:nodetypes="cscc"
|
||||
id="path2385"
|
||||
d="M 63.63961,32.567215 C 63.63961,40.791877 56.059425,47.466965 46.719555,47.466965 C 37.379684,47.466965 29.7995,40.791877 29.7995,32.567215 L 63.63961,32.567215 z"
|
||||
style="fill:#00aad4;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
|
||||
<path
|
||||
d="M 63.63961,32.567215 A 16.920055,14.89975 0 1 1 29.7995,32.567215 A 16.920055,14.89975 0 1 1 63.63961,32.567215 z"
|
||||
sodipodi:ry="14.89975"
|
||||
sodipodi:rx="16.920055"
|
||||
sodipodi:cy="32.567215"
|
||||
sodipodi:cx="46.719555"
|
||||
id="path2383"
|
||||
style="opacity:1;fill:none;fill-opacity:1;stroke:#004455;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
sodipodi:type="arc" />
|
||||
</g>
|
||||
</g>
|
||||
<text
|
||||
id="text3160"
|
||||
y="57.511555"
|
||||
x="70.285149"
|
||||
style="font-size:14px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
|
||||
xml:space="preserve"><tspan
|
||||
y="57.511555"
|
||||
x="70.285149"
|
||||
id="tspan3162"
|
||||
sodipodi:role="line" /></text>
|
||||
<use
|
||||
height="200"
|
||||
width="300"
|
||||
transform="translate(120,7.6293945e-6)"
|
||||
id="use3211"
|
||||
xlink:href="#g3204"
|
||||
y="0"
|
||||
x="0" />
|
||||
<use
|
||||
x="0"
|
||||
y="0"
|
||||
xlink:href="#g3204"
|
||||
id="use3213"
|
||||
transform="translate(240,7.6293945e-6)"
|
||||
width="300"
|
||||
height="200" />
|
||||
<use
|
||||
x="0"
|
||||
y="0"
|
||||
xlink:href="#g3204"
|
||||
id="use3217"
|
||||
transform="translate(120,70.000008)"
|
||||
width="300"
|
||||
height="200" />
|
||||
<use
|
||||
height="200"
|
||||
width="300"
|
||||
transform="translate(240,70.000008)"
|
||||
id="use3219"
|
||||
xlink:href="#g3204"
|
||||
y="0"
|
||||
x="0" />
|
||||
<use
|
||||
height="200"
|
||||
width="300"
|
||||
transform="translate(0,70.000008)"
|
||||
id="use3281"
|
||||
xlink:href="#g3204"
|
||||
y="0"
|
||||
x="0" />
|
||||
<use
|
||||
height="200"
|
||||
width="300"
|
||||
transform="translate(120,140.00001)"
|
||||
id="use3253"
|
||||
xlink:href="#g3204"
|
||||
y="0"
|
||||
x="0" />
|
||||
<use
|
||||
x="0"
|
||||
y="0"
|
||||
xlink:href="#g3204"
|
||||
id="use3255"
|
||||
transform="translate(240,140.00001)"
|
||||
width="300"
|
||||
height="200" />
|
||||
<use
|
||||
height="200"
|
||||
width="300"
|
||||
transform="translate(0,140.00001)"
|
||||
id="use3283"
|
||||
xlink:href="#g3204"
|
||||
y="0"
|
||||
x="0" />
|
||||
<path
|
||||
id="path3286"
|
||||
d="M 80.745313,54.999995 L 145.43911,54.999995"
|
||||
style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Sstart);marker-end:url(#Arrow2Send);stroke-opacity:1" />
|
||||
<use
|
||||
style="fill:none"
|
||||
height="200"
|
||||
width="300"
|
||||
transform="matrix(0,-0.4518081,1,0,4.601123e-6,141.28126)"
|
||||
id="use7505"
|
||||
xlink:href="#path3286"
|
||||
y="0"
|
||||
x="0" />
|
||||
<use
|
||||
style="fill:none"
|
||||
height="200"
|
||||
width="300"
|
||||
transform="translate(118,0)"
|
||||
id="use7582"
|
||||
xlink:href="#path3286"
|
||||
y="0"
|
||||
x="0" />
|
||||
<use
|
||||
style="fill:none"
|
||||
x="0"
|
||||
y="0"
|
||||
xlink:href="#path3286"
|
||||
id="use7594"
|
||||
transform="translate(118,70.000008)"
|
||||
width="300"
|
||||
height="200" />
|
||||
<use
|
||||
style="fill:none"
|
||||
height="200"
|
||||
width="300"
|
||||
transform="translate(118,140.00001)"
|
||||
id="use7606"
|
||||
xlink:href="#path3286"
|
||||
y="0"
|
||||
x="0" />
|
||||
<use
|
||||
style="fill:none"
|
||||
x="0"
|
||||
y="0"
|
||||
xlink:href="#path3286"
|
||||
id="use7618"
|
||||
transform="translate(-2,140.00001)"
|
||||
width="300"
|
||||
height="200" />
|
||||
<use
|
||||
style="fill:none"
|
||||
height="200"
|
||||
width="300"
|
||||
transform="translate(-2,70.000008)"
|
||||
id="use7630"
|
||||
xlink:href="#path3286"
|
||||
y="0"
|
||||
x="0" />
|
||||
<use
|
||||
style="fill:none"
|
||||
height="250"
|
||||
width="350"
|
||||
transform="translate(120,0)"
|
||||
id="use4719"
|
||||
xlink:href="#use7505"
|
||||
y="0"
|
||||
x="0" />
|
||||
<use
|
||||
style="fill:none"
|
||||
x="0"
|
||||
y="0"
|
||||
xlink:href="#use7505"
|
||||
id="use4721"
|
||||
transform="translate(240,0)"
|
||||
width="350"
|
||||
height="250" />
|
||||
<use
|
||||
style="fill:none"
|
||||
height="250"
|
||||
width="350"
|
||||
transform="translate(240,70)"
|
||||
id="use4723"
|
||||
xlink:href="#use7505"
|
||||
y="0"
|
||||
x="0" />
|
||||
<use
|
||||
style="fill:none"
|
||||
x="0"
|
||||
y="0"
|
||||
xlink:href="#use7505"
|
||||
id="use4725"
|
||||
transform="translate(120,70)"
|
||||
width="350"
|
||||
height="250" />
|
||||
<use
|
||||
style="fill:none"
|
||||
height="250"
|
||||
width="350"
|
||||
transform="translate(0,70)"
|
||||
id="use4727"
|
||||
xlink:href="#use7505"
|
||||
y="0"
|
||||
x="0" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer3"
|
||||
inkscape:label="Wrapped Edges"
|
||||
sodipodi:insensitive="true">
|
||||
<g
|
||||
id="g3180">
|
||||
<path
|
||||
sodipodi:nodetypes="cssc"
|
||||
style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Sstart);marker-end:url(#Arrow2Send);stroke-opacity:1"
|
||||
d="M 62.24531,29.999995 C 65.123489,26.146153 67.230816,19.819975 75.68005,17.029619 C 121.30433,1.9622158 235.21392,2.5182714 277.71508,19.982113 C 284.41084,22.733419 285.33426,25.904372 287.93911,29.499995"
|
||||
id="path4730" />
|
||||
<use
|
||||
height="250"
|
||||
width="350"
|
||||
transform="matrix(1,0,0,-1,0,252.61622)"
|
||||
id="use4733"
|
||||
xlink:href="#path4730"
|
||||
y="0"
|
||||
x="0" />
|
||||
<path
|
||||
id="path4735"
|
||||
d="M 27.76794,196.41186 C 23.91409,194.17719 17.58792,192.54103 14.79756,185.9809 C -0.26984,150.55741 0.28621,94.11602 17.75005,61.117382 C 20.50136,55.918677 23.67231,55.201718 27.26794,53.179267"
|
||||
style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Sstart);marker-end:url(#Arrow2Send);stroke-opacity:1"
|
||||
sodipodi:nodetypes="cssc" />
|
||||
<use
|
||||
height="250"
|
||||
width="350"
|
||||
transform="matrix(-1,0,0,1,348.4957,0)"
|
||||
id="use4737"
|
||||
xlink:href="#path4735"
|
||||
y="0"
|
||||
x="0" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 9.9 KiB |
|
Before Width: | Height: | Size: 7.7 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 8.3 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 8.8 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 344 B |
|
Before Width: | Height: | Size: 125 B |
|
Before Width: | Height: | Size: 224 B |
@@ -1,920 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CanvasColor</key>
|
||||
<dict>
|
||||
<key>w</key>
|
||||
<string>1</string>
|
||||
</dict>
|
||||
<key>ColumnAlign</key>
|
||||
<integer>1</integer>
|
||||
<key>ColumnSpacing</key>
|
||||
<real>36</real>
|
||||
<key>GraphDocumentVersion</key>
|
||||
<integer>3</integer>
|
||||
<key>GraphicsList</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>Bounds</key>
|
||||
<string>{{444, 184.125}, {50, 14}}</string>
|
||||
<key>Class</key>
|
||||
<string>ShapedGraphic</string>
|
||||
<key>FitText</key>
|
||||
<string>YES</string>
|
||||
<key>ID</key>
|
||||
<integer>96</integer>
|
||||
<key>Shape</key>
|
||||
<string>Rectangle</string>
|
||||
<key>Style</key>
|
||||
<dict>
|
||||
<key>fill</key>
|
||||
<dict>
|
||||
<key>Draws</key>
|
||||
<string>NO</string>
|
||||
</dict>
|
||||
<key>shadow</key>
|
||||
<dict>
|
||||
<key>Draws</key>
|
||||
<string>NO</string>
|
||||
</dict>
|
||||
<key>stroke</key>
|
||||
<dict>
|
||||
<key>Draws</key>
|
||||
<string>NO</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>Text</key>
|
||||
<dict>
|
||||
<key>Text</key>
|
||||
<string>{\rtf1\mac\ansicpg10000\cocoartf102
|
||||
{\fonttbl\f0\fswiss\fcharset77 Helvetica;}
|
||||
{\colortbl;\red255\green255\blue255;}
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
|
||||
|
||||
\f0\fs24 \cf0 Color 2}</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Bounds</key>
|
||||
<string>{{412, 182}, {19, 19}}</string>
|
||||
<key>Class</key>
|
||||
<string>ShapedGraphic</string>
|
||||
<key>ID</key>
|
||||
<integer>95</integer>
|
||||
<key>Shape</key>
|
||||
<string>Rectangle</string>
|
||||
<key>Style</key>
|
||||
<dict>
|
||||
<key>fill</key>
|
||||
<dict>
|
||||
<key>Color</key>
|
||||
<dict>
|
||||
<key>b</key>
|
||||
<string>1</string>
|
||||
<key>g</key>
|
||||
<string>0.011662</string>
|
||||
<key>r</key>
|
||||
<string>0</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Bounds</key>
|
||||
<string>{{444, 160.125}, {50, 14}}</string>
|
||||
<key>Class</key>
|
||||
<string>ShapedGraphic</string>
|
||||
<key>FitText</key>
|
||||
<string>YES</string>
|
||||
<key>ID</key>
|
||||
<integer>94</integer>
|
||||
<key>Shape</key>
|
||||
<string>Rectangle</string>
|
||||
<key>Style</key>
|
||||
<dict>
|
||||
<key>fill</key>
|
||||
<dict>
|
||||
<key>Draws</key>
|
||||
<string>NO</string>
|
||||
</dict>
|
||||
<key>shadow</key>
|
||||
<dict>
|
||||
<key>Draws</key>
|
||||
<string>NO</string>
|
||||
</dict>
|
||||
<key>stroke</key>
|
||||
<dict>
|
||||
<key>Draws</key>
|
||||
<string>NO</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>Text</key>
|
||||
<dict>
|
||||
<key>Text</key>
|
||||
<string>{\rtf1\mac\ansicpg10000\cocoartf102
|
||||
{\fonttbl\f0\fswiss\fcharset77 Helvetica;}
|
||||
{\colortbl;\red255\green255\blue255;}
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
|
||||
|
||||
\f0\fs24 \cf0 Color 1}</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Bounds</key>
|
||||
<string>{{412, 158}, {19, 19}}</string>
|
||||
<key>Class</key>
|
||||
<string>ShapedGraphic</string>
|
||||
<key>ID</key>
|
||||
<integer>93</integer>
|
||||
<key>Shape</key>
|
||||
<string>Rectangle</string>
|
||||
<key>Style</key>
|
||||
<dict>
|
||||
<key>fill</key>
|
||||
<dict>
|
||||
<key>Color</key>
|
||||
<dict>
|
||||
<key>b</key>
|
||||
<string>0.00237679</string>
|
||||
<key>g</key>
|
||||
<string>1</string>
|
||||
<key>r</key>
|
||||
<string>0.0883496</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Bounds</key>
|
||||
<string>{{444, 136.125}, {50, 14}}</string>
|
||||
<key>Class</key>
|
||||
<string>ShapedGraphic</string>
|
||||
<key>FitText</key>
|
||||
<string>YES</string>
|
||||
<key>ID</key>
|
||||
<integer>92</integer>
|
||||
<key>Shape</key>
|
||||
<string>Rectangle</string>
|
||||
<key>Style</key>
|
||||
<dict>
|
||||
<key>fill</key>
|
||||
<dict>
|
||||
<key>Draws</key>
|
||||
<string>NO</string>
|
||||
</dict>
|
||||
<key>shadow</key>
|
||||
<dict>
|
||||
<key>Draws</key>
|
||||
<string>NO</string>
|
||||
</dict>
|
||||
<key>stroke</key>
|
||||
<dict>
|
||||
<key>Draws</key>
|
||||
<string>NO</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>Text</key>
|
||||
<dict>
|
||||
<key>Text</key>
|
||||
<string>{\rtf1\mac\ansicpg10000\cocoartf102
|
||||
{\fonttbl\f0\fswiss\fcharset77 Helvetica;}
|
||||
{\colortbl;\red255\green255\blue255;}
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
|
||||
|
||||
\f0\fs24 \cf0 Color 0}</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Bounds</key>
|
||||
<string>{{412, 134}, {19, 19}}</string>
|
||||
<key>Class</key>
|
||||
<string>ShapedGraphic</string>
|
||||
<key>ID</key>
|
||||
<integer>91</integer>
|
||||
<key>Shape</key>
|
||||
<string>Rectangle</string>
|
||||
<key>Style</key>
|
||||
<dict>
|
||||
<key>fill</key>
|
||||
<dict>
|
||||
<key>Color</key>
|
||||
<dict>
|
||||
<key>b</key>
|
||||
<string>0</string>
|
||||
<key>g</key>
|
||||
<string>0.0515676</string>
|
||||
<key>r</key>
|
||||
<string>1</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Bounds</key>
|
||||
<string>{{426, 98.125}, {52, 14}}</string>
|
||||
<key>Class</key>
|
||||
<string>ShapedGraphic</string>
|
||||
<key>FitText</key>
|
||||
<string>YES</string>
|
||||
<key>ID</key>
|
||||
<integer>90</integer>
|
||||
<key>Shape</key>
|
||||
<string>Rectangle</string>
|
||||
<key>Style</key>
|
||||
<dict>
|
||||
<key>fill</key>
|
||||
<dict>
|
||||
<key>Draws</key>
|
||||
<string>NO</string>
|
||||
</dict>
|
||||
<key>shadow</key>
|
||||
<dict>
|
||||
<key>Draws</key>
|
||||
<string>NO</string>
|
||||
</dict>
|
||||
<key>stroke</key>
|
||||
<dict>
|
||||
<key>Draws</key>
|
||||
<string>NO</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>Text</key>
|
||||
<dict>
|
||||
<key>Text</key>
|
||||
<string>{\rtf1\mac\ansicpg10000\cocoartf102
|
||||
{\fonttbl\f0\fswiss\fcharset77 Helvetica;}
|
||||
{\colortbl;\red255\green255\blue255;}
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
|
||||
|
||||
\f0\fs24 \cf0 Legend}</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Bounds</key>
|
||||
<string>{{396, 90}, {111, 31}}</string>
|
||||
<key>Class</key>
|
||||
<string>ShapedGraphic</string>
|
||||
<key>ID</key>
|
||||
<integer>89</integer>
|
||||
<key>Shape</key>
|
||||
<string>Rectangle</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Bounds</key>
|
||||
<string>{{396, 122}, {111, 91}}</string>
|
||||
<key>Class</key>
|
||||
<string>ShapedGraphic</string>
|
||||
<key>ID</key>
|
||||
<integer>88</integer>
|
||||
<key>Shape</key>
|
||||
<string>Rectangle</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Class</key>
|
||||
<string>LineGraphic</string>
|
||||
<key>Head</key>
|
||||
<dict>
|
||||
<key>ID</key>
|
||||
<integer>80</integer>
|
||||
</dict>
|
||||
<key>ID</key>
|
||||
<integer>87</integer>
|
||||
<key>Points</key>
|
||||
<array>
|
||||
<string>{314, 217}</string>
|
||||
<string>{314, 96}</string>
|
||||
</array>
|
||||
<key>Style</key>
|
||||
<dict>
|
||||
<key>stroke</key>
|
||||
<dict>
|
||||
<key>HeadArrow</key>
|
||||
<string>0</string>
|
||||
<key>LineType</key>
|
||||
<integer>1</integer>
|
||||
<key>TailArrow</key>
|
||||
<string>0</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>Tail</key>
|
||||
<dict>
|
||||
<key>ID</key>
|
||||
<integer>79</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Class</key>
|
||||
<string>LineGraphic</string>
|
||||
<key>Head</key>
|
||||
<dict>
|
||||
<key>ID</key>
|
||||
<integer>79</integer>
|
||||
</dict>
|
||||
<key>ID</key>
|
||||
<integer>86</integer>
|
||||
<key>Points</key>
|
||||
<array>
|
||||
<string>{140, 244}</string>
|
||||
<string>{287, 244}</string>
|
||||
</array>
|
||||
<key>Style</key>
|
||||
<dict>
|
||||
<key>stroke</key>
|
||||
<dict>
|
||||
<key>HeadArrow</key>
|
||||
<string>0</string>
|
||||
<key>LineType</key>
|
||||
<integer>1</integer>
|
||||
<key>TailArrow</key>
|
||||
<string>0</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>Tail</key>
|
||||
<dict>
|
||||
<key>ID</key>
|
||||
<integer>78</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Class</key>
|
||||
<string>LineGraphic</string>
|
||||
<key>Head</key>
|
||||
<dict>
|
||||
<key>ID</key>
|
||||
<integer>78</integer>
|
||||
</dict>
|
||||
<key>ID</key>
|
||||
<integer>85</integer>
|
||||
<key>Points</key>
|
||||
<array>
|
||||
<string>{195.765, 170.877}</string>
|
||||
<string>{133.235, 226.123}</string>
|
||||
</array>
|
||||
<key>Style</key>
|
||||
<dict>
|
||||
<key>stroke</key>
|
||||
<dict>
|
||||
<key>HeadArrow</key>
|
||||
<string>0</string>
|
||||
<key>LineType</key>
|
||||
<integer>1</integer>
|
||||
<key>TailArrow</key>
|
||||
<string>0</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>Tail</key>
|
||||
<dict>
|
||||
<key>ID</key>
|
||||
<integer>77</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Class</key>
|
||||
<string>LineGraphic</string>
|
||||
<key>Head</key>
|
||||
<dict>
|
||||
<key>ID</key>
|
||||
<integer>79</integer>
|
||||
</dict>
|
||||
<key>ID</key>
|
||||
<integer>84</integer>
|
||||
<key>Points</key>
|
||||
<array>
|
||||
<string>{235.786, 171.372}</string>
|
||||
<string>{294.214, 225.628}</string>
|
||||
</array>
|
||||
<key>Style</key>
|
||||
<dict>
|
||||
<key>stroke</key>
|
||||
<dict>
|
||||
<key>HeadArrow</key>
|
||||
<string>0</string>
|
||||
<key>LineType</key>
|
||||
<integer>1</integer>
|
||||
<key>TailArrow</key>
|
||||
<string>0</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>Tail</key>
|
||||
<dict>
|
||||
<key>ID</key>
|
||||
<integer>77</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Class</key>
|
||||
<string>LineGraphic</string>
|
||||
<key>Head</key>
|
||||
<dict>
|
||||
<key>ID</key>
|
||||
<integer>80</integer>
|
||||
</dict>
|
||||
<key>ID</key>
|
||||
<integer>83</integer>
|
||||
<key>Points</key>
|
||||
<array>
|
||||
<string>{236.501, 135.428}</string>
|
||||
<string>{293.499, 86.5722}</string>
|
||||
</array>
|
||||
<key>Style</key>
|
||||
<dict>
|
||||
<key>stroke</key>
|
||||
<dict>
|
||||
<key>HeadArrow</key>
|
||||
<string>0</string>
|
||||
<key>LineType</key>
|
||||
<integer>1</integer>
|
||||
<key>TailArrow</key>
|
||||
<string>0</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>Tail</key>
|
||||
<dict>
|
||||
<key>ID</key>
|
||||
<integer>77</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Class</key>
|
||||
<string>LineGraphic</string>
|
||||
<key>Head</key>
|
||||
<dict>
|
||||
<key>ID</key>
|
||||
<integer>80</integer>
|
||||
</dict>
|
||||
<key>ID</key>
|
||||
<integer>82</integer>
|
||||
<key>Points</key>
|
||||
<array>
|
||||
<string>{140, 69}</string>
|
||||
<string>{287, 69}</string>
|
||||
</array>
|
||||
<key>Style</key>
|
||||
<dict>
|
||||
<key>stroke</key>
|
||||
<dict>
|
||||
<key>HeadArrow</key>
|
||||
<string>0</string>
|
||||
<key>LineType</key>
|
||||
<integer>1</integer>
|
||||
<key>TailArrow</key>
|
||||
<string>0</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>Tail</key>
|
||||
<dict>
|
||||
<key>ID</key>
|
||||
<integer>76</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Class</key>
|
||||
<string>LineGraphic</string>
|
||||
<key>Head</key>
|
||||
<dict>
|
||||
<key>ID</key>
|
||||
<integer>78</integer>
|
||||
</dict>
|
||||
<key>ID</key>
|
||||
<integer>81</integer>
|
||||
<key>Points</key>
|
||||
<array>
|
||||
<string>{113, 96}</string>
|
||||
<string>{113, 217}</string>
|
||||
</array>
|
||||
<key>Style</key>
|
||||
<dict>
|
||||
<key>stroke</key>
|
||||
<dict>
|
||||
<key>HeadArrow</key>
|
||||
<string>0</string>
|
||||
<key>LineType</key>
|
||||
<integer>1</integer>
|
||||
<key>TailArrow</key>
|
||||
<string>0</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>Tail</key>
|
||||
<dict>
|
||||
<key>ID</key>
|
||||
<integer>76</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Bounds</key>
|
||||
<string>{{287, 42}, {54, 54}}</string>
|
||||
<key>Class</key>
|
||||
<string>ShapedGraphic</string>
|
||||
<key>ID</key>
|
||||
<integer>80</integer>
|
||||
<key>Shape</key>
|
||||
<string>Circle</string>
|
||||
<key>Style</key>
|
||||
<dict>
|
||||
<key>fill</key>
|
||||
<dict>
|
||||
<key>Color</key>
|
||||
<dict>
|
||||
<key>b</key>
|
||||
<string>0</string>
|
||||
<key>g</key>
|
||||
<string>1</string>
|
||||
<key>r</key>
|
||||
<string>0.184589</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>Text</key>
|
||||
<dict>
|
||||
<key>Text</key>
|
||||
<string>{\rtf1\mac\ansicpg10000\cocoartf102
|
||||
{\fonttbl\f0\fswiss\fcharset77 Helvetica;}
|
||||
{\colortbl;\red255\green255\blue255;}
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
|
||||
|
||||
\f0\fs24 \cf0 E}</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Bounds</key>
|
||||
<string>{{287, 217}, {54, 54}}</string>
|
||||
<key>Class</key>
|
||||
<string>ShapedGraphic</string>
|
||||
<key>ID</key>
|
||||
<integer>79</integer>
|
||||
<key>Shape</key>
|
||||
<string>Circle</string>
|
||||
<key>Style</key>
|
||||
<dict>
|
||||
<key>fill</key>
|
||||
<dict>
|
||||
<key>Color</key>
|
||||
<dict>
|
||||
<key>b</key>
|
||||
<string>1</string>
|
||||
<key>g</key>
|
||||
<string>0.0015586</string>
|
||||
<key>r</key>
|
||||
<string>0.00100458</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>Text</key>
|
||||
<dict>
|
||||
<key>Text</key>
|
||||
<string>{\rtf1\mac\ansicpg10000\cocoartf102
|
||||
{\fonttbl\f0\fswiss\fcharset77 Helvetica;}
|
||||
{\colortbl;\red255\green255\blue255;}
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
|
||||
|
||||
\f0\fs24 \cf0 D}</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Bounds</key>
|
||||
<string>{{86, 217}, {54, 54}}</string>
|
||||
<key>Class</key>
|
||||
<string>ShapedGraphic</string>
|
||||
<key>ID</key>
|
||||
<integer>78</integer>
|
||||
<key>Shape</key>
|
||||
<string>Circle</string>
|
||||
<key>Style</key>
|
||||
<dict>
|
||||
<key>fill</key>
|
||||
<dict>
|
||||
<key>Color</key>
|
||||
<dict>
|
||||
<key>b</key>
|
||||
<string>0.00237679</string>
|
||||
<key>g</key>
|
||||
<string>1</string>
|
||||
<key>r</key>
|
||||
<string>0.0883496</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>Text</key>
|
||||
<dict>
|
||||
<key>Text</key>
|
||||
<string>{\rtf1\mac\ansicpg10000\cocoartf102
|
||||
{\fonttbl\f0\fswiss\fcharset77 Helvetica;}
|
||||
{\colortbl;\red255\green255\blue255;}
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
|
||||
|
||||
\f0\fs24 \cf0 C}</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Bounds</key>
|
||||
<string>{{189, 126}, {54, 54}}</string>
|
||||
<key>Class</key>
|
||||
<string>ShapedGraphic</string>
|
||||
<key>ID</key>
|
||||
<integer>77</integer>
|
||||
<key>Shape</key>
|
||||
<string>Circle</string>
|
||||
<key>Style</key>
|
||||
<dict>
|
||||
<key>fill</key>
|
||||
<dict>
|
||||
<key>Color</key>
|
||||
<dict>
|
||||
<key>b</key>
|
||||
<string>0</string>
|
||||
<key>g</key>
|
||||
<string>0.0258026</string>
|
||||
<key>r</key>
|
||||
<string>1</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>Text</key>
|
||||
<dict>
|
||||
<key>Text</key>
|
||||
<string>{\rtf1\mac\ansicpg10000\cocoartf102
|
||||
{\fonttbl\f0\fswiss\fcharset77 Helvetica;}
|
||||
{\colortbl;\red255\green255\blue255;}
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
|
||||
|
||||
\f0\fs24 \cf0 B}</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>Bounds</key>
|
||||
<string>{{86, 42}, {54, 54}}</string>
|
||||
<key>Class</key>
|
||||
<string>ShapedGraphic</string>
|
||||
<key>ID</key>
|
||||
<integer>76</integer>
|
||||
<key>Shape</key>
|
||||
<string>Circle</string>
|
||||
<key>Style</key>
|
||||
<dict>
|
||||
<key>fill</key>
|
||||
<dict>
|
||||
<key>Color</key>
|
||||
<dict>
|
||||
<key>b</key>
|
||||
<string>0</string>
|
||||
<key>g</key>
|
||||
<string>0.0515676</string>
|
||||
<key>r</key>
|
||||
<string>1</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>Text</key>
|
||||
<dict>
|
||||
<key>Text</key>
|
||||
<string>{\rtf1\mac\ansicpg10000\cocoartf102
|
||||
{\fonttbl\f0\fswiss\fcharset77 Helvetica;}
|
||||
{\colortbl;\red255\green255\blue255;}
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
|
||||
|
||||
\f0\fs24 \cf0 A}</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</array>
|
||||
<key>GridInfo</key>
|
||||
<dict/>
|
||||
<key>GuidesVisible</key>
|
||||
<string>YES</string>
|
||||
<key>HPages</key>
|
||||
<integer>1</integer>
|
||||
<key>ImageCounter</key>
|
||||
<integer>1</integer>
|
||||
<key>IsPalette</key>
|
||||
<string>NO</string>
|
||||
<key>Layers</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>Lock</key>
|
||||
<string>NO</string>
|
||||
<key>Name</key>
|
||||
<string>Layer 1</string>
|
||||
<key>Print</key>
|
||||
<string>YES</string>
|
||||
<key>View</key>
|
||||
<string>YES</string>
|
||||
</dict>
|
||||
</array>
|
||||
<key>LayoutInfo</key>
|
||||
<dict>
|
||||
<key>AutoAdjust</key>
|
||||
<string>YES</string>
|
||||
<key>ChildOrdering</key>
|
||||
<integer>2</integer>
|
||||
<key>MagneticFieldCenter</key>
|
||||
<string>{0, 0}</string>
|
||||
</dict>
|
||||
<key>LinksVisible</key>
|
||||
<string>NO</string>
|
||||
<key>MagnetsVisible</key>
|
||||
<string>NO</string>
|
||||
<key>Orientation</key>
|
||||
<integer>2</integer>
|
||||
<key>PageBreaks</key>
|
||||
<string>YES</string>
|
||||
<key>PageSetup</key>
|
||||
<data>
|
||||
BAt0eXBlZHN0cmVhbYED6IQBQISEhAtOU1ByaW50SW5mbwGEhAhOU09iamVjdACFkoSE
|
||||
hBNOU011dGFibGVEaWN0aW9uYXJ5AISEDE5TRGljdGlvbmFyeQCUhAFpFJKEhIQITlNT
|
||||
dHJpbmcBlIQBKxBOU0pvYkRpc3Bvc2l0aW9uhpKEmZkPTlNQcmludFNwb29sSm9ihpKE
|
||||
mZkLTlNQYXBlclNpemWGkoSEhAdOU1ZhbHVlAJSEASqEhAx7X05TU2l6ZT1mZn2cgQJk
|
||||
gQMYhpKEmZkZTlNQcmludFJldmVyc2VPcmllbnRhdGlvboaShISECE5TTnVtYmVyAJ2b
|
||||
hJeXAIaShJmZFE5TVmVydGljYWxQYWdpbmF0aW9uhpKEoZuilwCGkoSZmRROU1ZlcnRp
|
||||
Y2FsbHlDZW50ZXJlZIaShKGbopcBhpKEmZkOTlNQTVBhZ2VGb3JtYXSGkoSEhAZOU0Rh
|
||||
dGEAlJeBHa2EB1s3NTk3Y108P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYt
|
||||
OCI/Pgo8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZSBDb21wdXRlci8vRFRE
|
||||
IFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5
|
||||
TGlzdC0xLjAuZHRkIj4KPHBsaXN0IHZlcnNpb249IjEuMCI+CjxkaWN0PgoJPGtleT5j
|
||||
b20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTUhvcml6b250YWxSZXM8L2tleT4KCTxk
|
||||
aWN0PgoJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk+CgkJ
|
||||
PHN0cmluZz5jb20uYXBwbGUucHJpbnRpbmdtYW5hZ2VyPC9zdHJpbmc+CgkJPGtleT5j
|
||||
b20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCTxhcnJheT4KCQkJ
|
||||
PGRpY3Q+CgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNSG9yaXpv
|
||||
bnRhbFJlczwva2V5PgoJCQkJPHJlYWw+NzI8L3JlYWw+CgkJCQk8a2V5PmNvbS5hcHBs
|
||||
ZS5wcmludC50aWNrZXQuY2xpZW50PC9rZXk+CgkJCQk8c3RyaW5nPmNvbS5hcHBsZS5w
|
||||
cmludGluZ21hbmFnZXI8L3N0cmluZz4KCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRp
|
||||
Y2tldC5tb2REYXRlPC9rZXk+CgkJCQk8ZGF0ZT4yMDAzLTAxLTI0VDE2OjI4OjU0Wjwv
|
||||
ZGF0ZT4KCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tl
|
||||
eT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CgkJCTwvZGljdD4KCQk8L2FycmF5PgoJ
|
||||
PC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTU9yaWVudGF0
|
||||
aW9uPC9rZXk+Cgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3Jl
|
||||
YXRvcjwva2V5PgoJCTxzdHJpbmc+Y29tLmFwcGxlLnByaW50aW5nbWFuYWdlcjwvc3Ry
|
||||
aW5nPgoJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4K
|
||||
CQk8YXJyYXk+CgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZv
|
||||
cm1hdC5QTU9yaWVudGF0aW9uPC9rZXk+CgkJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgoJ
|
||||
CQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNsaWVudDwva2V5PgoJCQkJPHN0
|
||||
cmluZz5jb20uYXBwbGUucHJpbnRpbmdtYW5hZ2VyPC9zdHJpbmc+CgkJCQk8a2V5PmNv
|
||||
bS5hcHBsZS5wcmludC50aWNrZXQubW9kRGF0ZTwva2V5PgoJCQkJPGRhdGU+MjAwMy0w
|
||||
MS0yNFQxNjoyODo1NFo8L2RhdGU+CgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNr
|
||||
ZXQuc3RhdGVGbGFnPC9rZXk+CgkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQk8L2Rp
|
||||
Y3Q+CgkJPC9hcnJheT4KCTwvZGljdD4KCTxrZXk+Y29tLmFwcGxlLnByaW50LlBhZ2VG
|
||||
b3JtYXQuUE1TY2FsaW5nPC9rZXk+Cgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmlu
|
||||
dC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc+Y29tLmFwcGxlLnByaW50aW5n
|
||||
bWFuYWdlcjwvc3RyaW5nPgoJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVt
|
||||
QXJyYXk8L2tleT4KCQk8YXJyYXk+CgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUu
|
||||
cHJpbnQuUGFnZUZvcm1hdC5QTVNjYWxpbmc8L2tleT4KCQkJCTxyZWFsPjE8L3JlYWw+
|
||||
CgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY2xpZW50PC9rZXk+CgkJCQk8
|
||||
c3RyaW5nPmNvbS5hcHBsZS5wcmludGluZ21hbmFnZXI8L3N0cmluZz4KCQkJCTxrZXk+
|
||||
Y29tLmFwcGxlLnByaW50LnRpY2tldC5tb2REYXRlPC9rZXk+CgkJCQk8ZGF0ZT4yMDAz
|
||||
LTAxLTI0VDE2OjI4OjU0WjwvZGF0ZT4KCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRp
|
||||
Y2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CgkJCTwv
|
||||
ZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuUGFn
|
||||
ZUZvcm1hdC5QTVZlcnRpY2FsUmVzPC9rZXk+Cgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBs
|
||||
ZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc+Y29tLmFwcGxlLnBy
|
||||
aW50aW5nbWFuYWdlcjwvc3RyaW5nPgoJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tl
|
||||
dC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk+CgkJCTxkaWN0PgoJCQkJPGtleT5jb20u
|
||||
YXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTVZlcnRpY2FsUmVzPC9rZXk+CgkJCQk8cmVh
|
||||
bD43MjwvcmVhbD4KCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5jbGllbnQ8
|
||||
L2tleT4KCQkJCTxzdHJpbmc+Y29tLmFwcGxlLnByaW50aW5nbWFuYWdlcjwvc3RyaW5n
|
||||
PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lm1vZERhdGU8L2tleT4KCQkJ
|
||||
CTxkYXRlPjIwMDMtMDEtMjRUMTY6Mjg6NTRaPC9kYXRlPgoJCQkJPGtleT5jb20uYXBw
|
||||
bGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI+MDwvaW50
|
||||
ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk+Cgk8L2RpY3Q+Cgk8a2V5PmNvbS5hcHBs
|
||||
ZS5wcmludC5QYWdlRm9ybWF0LlBNVmVydGljYWxTY2FsaW5nPC9rZXk+Cgk8ZGljdD4K
|
||||
CQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJp
|
||||
bmc+Y29tLmFwcGxlLnByaW50aW5nbWFuYWdlcjwvc3RyaW5nPgoJCTxrZXk+Y29tLmFw
|
||||
cGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk+CgkJCTxkaWN0
|
||||
PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTVZlcnRpY2FsU2Nh
|
||||
bGluZzwva2V5PgoJCQkJPHJlYWw+MTwvcmVhbD4KCQkJCTxrZXk+Y29tLmFwcGxlLnBy
|
||||
aW50LnRpY2tldC5jbGllbnQ8L2tleT4KCQkJCTxzdHJpbmc+Y29tLmFwcGxlLnByaW50
|
||||
aW5nbWFuYWdlcjwvc3RyaW5nPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0
|
||||
Lm1vZERhdGU8L2tleT4KCQkJCTxkYXRlPjIwMDMtMDEtMjRUMTY6Mjg6NTRaPC9kYXRl
|
||||
PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJ
|
||||
CQkJPGludGVnZXI+MDwvaW50ZWdlcj4KCQkJPC9kaWN0PgoJCTwvYXJyYXk+Cgk8L2Rp
|
||||
Y3Q+Cgk8a2V5PmNvbS5hcHBsZS5wcmludC5zdWJUaWNrZXQucGFwZXJfaW5mb190aWNr
|
||||
ZXQ8L2tleT4KCTxkaWN0PgoJCTxrZXk+Y29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQu
|
||||
UE1BZGp1c3RlZFBhZ2VSZWN0PC9rZXk+CgkJPGRpY3Q+CgkJCTxrZXk+Y29tLmFwcGxl
|
||||
LnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk+CgkJCTxzdHJpbmc+Y29tLmFwcGxlLnBy
|
||||
aW50aW5nbWFuYWdlcjwvc3RyaW5nPgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNr
|
||||
ZXQuaXRlbUFycmF5PC9rZXk+CgkJCTxhcnJheT4KCQkJCTxkaWN0PgoJCQkJCTxrZXk+
|
||||
Y29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1BZGp1c3RlZFBhZ2VSZWN0PC9rZXk+
|
||||
CgkJCQkJPGFycmF5PgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw+CgkJCQkJCTxyZWFsPjAu
|
||||
MDwvcmVhbD4KCQkJCQkJPHJlYWw+NzM0PC9yZWFsPgoJCQkJCQk8cmVhbD41NzY8L3Jl
|
||||
YWw+CgkJCQkJPC9hcnJheT4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQu
|
||||
Y2xpZW50PC9rZXk+CgkJCQkJPHN0cmluZz5jb20uYXBwbGUucHJpbnRpbmdtYW5hZ2Vy
|
||||
PC9zdHJpbmc+CgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lm1vZERhdGU8
|
||||
L2tleT4KCQkJCQk8ZGF0ZT4yMDA0LTEyLTE2VDE1OjI1OjIwWjwvZGF0ZT4KCQkJCQk8
|
||||
a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVGbGFnPC9rZXk+CgkJCQkJPGlu
|
||||
dGVnZXI+MDwvaW50ZWdlcj4KCQkJCTwvZGljdD4KCQkJPC9hcnJheT4KCQk8L2RpY3Q+
|
||||
CgkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTUFkanVzdGVkUGFwZXJS
|
||||
ZWN0PC9rZXk+CgkJPGRpY3Q+CgkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5j
|
||||
cmVhdG9yPC9rZXk+CgkJCTxzdHJpbmc+Y29tLmFwcGxlLnByaW50aW5nbWFuYWdlcjwv
|
||||
c3RyaW5nPgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9r
|
||||
ZXk+CgkJCTxhcnJheT4KCQkJCTxkaWN0PgoJCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50
|
||||
LlBhZ2VGb3JtYXQuUE1BZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCQkJCTxhcnJheT4K
|
||||
CQkJCQkJPHJlYWw+LTE4PC9yZWFsPgoJCQkJCQk8cmVhbD4tMTg8L3JlYWw+CgkJCQkJ
|
||||
CTxyZWFsPjc3NDwvcmVhbD4KCQkJCQkJPHJlYWw+NTk0PC9yZWFsPgoJCQkJCTwvYXJy
|
||||
YXk+CgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNsaWVudDwva2V5PgoJ
|
||||
CQkJCTxzdHJpbmc+Y29tLmFwcGxlLnByaW50aW5nbWFuYWdlcjwvc3RyaW5nPgoJCQkJ
|
||||
CTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5tb2REYXRlPC9rZXk+CgkJCQkJPGRh
|
||||
dGU+MjAwNC0xMi0xNlQxNToyNToyMFo8L2RhdGU+CgkJCQkJPGtleT5jb20uYXBwbGUu
|
||||
cHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVn
|
||||
ZXI+CgkJCQk8L2RpY3Q+CgkJCTwvYXJyYXk+CgkJPC9kaWN0PgoJCTxrZXk+Y29tLmFw
|
||||
cGxlLnByaW50LlBhcGVySW5mby5QTVBhcGVyTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8
|
||||
a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5n
|
||||
PmNvbS5hcHBsZS5wcmludC5wbS5Qb3N0U2NyaXB0PC9zdHJpbmc+CgkJCTxrZXk+Y29t
|
||||
LmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJ
|
||||
PGRpY3Q+CgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNUGFwZXJO
|
||||
YW1lPC9rZXk+CgkJCQkJPHN0cmluZz5uYS1sZXR0ZXI8L3N0cmluZz4KCQkJCQk8a2V5
|
||||
PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY2xpZW50PC9rZXk+CgkJCQkJPHN0cmluZz5j
|
||||
b20uYXBwbGUucHJpbnQucG0uUG9zdFNjcmlwdDwvc3RyaW5nPgoJCQkJCTxrZXk+Y29t
|
||||
LmFwcGxlLnByaW50LnRpY2tldC5tb2REYXRlPC9rZXk+CgkJCQkJPGRhdGU+MjAwMC0w
|
||||
Ny0yOFQyMjo1NzowNFo8L2RhdGU+CgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlj
|
||||
a2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjE8L2ludGVnZXI+CgkJCQk8
|
||||
L2RpY3Q+CgkJCTwvYXJyYXk+CgkJPC9kaWN0PgoJCTxrZXk+Y29tLmFwcGxlLnByaW50
|
||||
LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8
|
||||
a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5n
|
||||
PmNvbS5hcHBsZS5wcmludC5wbS5Qb3N0U2NyaXB0PC9zdHJpbmc+CgkJCTxrZXk+Y29t
|
||||
LmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJ
|
||||
PGRpY3Q+CgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1
|
||||
c3RlZFBhZ2VSZWN0PC9rZXk+CgkJCQkJPGFycmF5PgoJCQkJCQk8cmVhbD4wLjA8L3Jl
|
||||
YWw+CgkJCQkJCTxyZWFsPjAuMDwvcmVhbD4KCQkJCQkJPHJlYWw+NzM0PC9yZWFsPgoJ
|
||||
CQkJCQk8cmVhbD41NzY8L3JlYWw+CgkJCQkJPC9hcnJheT4KCQkJCQk8a2V5PmNvbS5h
|
||||
cHBsZS5wcmludC50aWNrZXQuY2xpZW50PC9rZXk+CgkJCQkJPHN0cmluZz5jb20uYXBw
|
||||
bGUucHJpbnRpbmdtYW5hZ2VyPC9zdHJpbmc+CgkJCQkJPGtleT5jb20uYXBwbGUucHJp
|
||||
bnQudGlja2V0Lm1vZERhdGU8L2tleT4KCQkJCQk8ZGF0ZT4yMDAzLTAxLTI0VDE2OjI4
|
||||
OjU0WjwvZGF0ZT4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVG
|
||||
bGFnPC9rZXk+CgkJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KCQkJCTwvZGljdD4KCQkJ
|
||||
PC9hcnJheT4KCQk8L2RpY3Q+CgkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZv
|
||||
LlBNVW5hZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5h
|
||||
cHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBs
|
||||
ZS5wcmludC5wbS5Qb3N0U2NyaXB0PC9zdHJpbmc+CgkJCTxrZXk+Y29tLmFwcGxlLnBy
|
||||
aW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q+CgkJ
|
||||
CQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhcGVy
|
||||
UmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw+LTE4PC9yZWFsPgoJCQkJ
|
||||
CQk8cmVhbD4tMTg8L3JlYWw+CgkJCQkJCTxyZWFsPjc3NDwvcmVhbD4KCQkJCQkJPHJl
|
||||
YWw+NTk0PC9yZWFsPgoJCQkJCTwvYXJyYXk+CgkJCQkJPGtleT5jb20uYXBwbGUucHJp
|
||||
bnQudGlja2V0LmNsaWVudDwva2V5PgoJCQkJCTxzdHJpbmc+Y29tLmFwcGxlLnByaW50
|
||||
aW5nbWFuYWdlcjwvc3RyaW5nPgoJCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tl
|
||||
dC5tb2REYXRlPC9rZXk+CgkJCQkJPGRhdGU+MjAwMy0wMS0yNFQxNjoyODo1NFo8L2Rh
|
||||
dGU+CgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5
|
||||
PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CgkJCQk8L2RpY3Q+CgkJCTwvYXJyYXk+
|
||||
CgkJPC9kaWN0PgoJCTxrZXk+Y29tLmFwcGxlLnByaW50LlBhcGVySW5mby5wcGQuUE1Q
|
||||
YXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlj
|
||||
a2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUucHJpbnQucG0uUG9z
|
||||
dFNjcmlwdDwvc3RyaW5nPgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRl
|
||||
bUFycmF5PC9rZXk+CgkJCTxhcnJheT4KCQkJCTxkaWN0PgoJCQkJCTxrZXk+Y29tLmFw
|
||||
cGxlLnByaW50LlBhcGVySW5mby5wcGQuUE1QYXBlck5hbWU8L2tleT4KCQkJCQk8c3Ry
|
||||
aW5nPkxldHRlcjwvc3RyaW5nPgoJCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tl
|
||||
dC5jbGllbnQ8L2tleT4KCQkJCQk8c3RyaW5nPmNvbS5hcHBsZS5wcmludC5wbS5Qb3N0
|
||||
U2NyaXB0PC9zdHJpbmc+CgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lm1v
|
||||
ZERhdGU8L2tleT4KCQkJCQk8ZGF0ZT4yMDAwLTA3LTI4VDIyOjU3OjA0WjwvZGF0ZT4K
|
||||
CQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVGbGFnPC9rZXk+CgkJ
|
||||
CQkJPGludGVnZXI+MTwvaW50ZWdlcj4KCQkJCTwvZGljdD4KCQkJPC9hcnJheT4KCQk8
|
||||
L2RpY3Q+CgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LkFQSVZlcnNpb248L2tl
|
||||
eT4KCQk8c3RyaW5nPjAwLjIwPC9zdHJpbmc+CgkJPGtleT5jb20uYXBwbGUucHJpbnQu
|
||||
dGlja2V0LnByaXZhdGVMb2NrPC9rZXk+CgkJPGZhbHNlLz4KCQk8a2V5PmNvbS5hcHBs
|
||||
ZS5wcmludC50aWNrZXQudHlwZTwva2V5PgoJCTxzdHJpbmc+Y29tLmFwcGxlLnByaW50
|
||||
LlBhcGVySW5mb1RpY2tldDwvc3RyaW5nPgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUu
|
||||
cHJpbnQudGlja2V0LkFQSVZlcnNpb248L2tleT4KCTxzdHJpbmc+MDAuMjA8L3N0cmlu
|
||||
Zz4KCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5wcml2YXRlTG9jazwva2V5PgoJ
|
||||
PGZhbHNlLz4KCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC50eXBlPC9rZXk+Cgk8
|
||||
c3RyaW5nPmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0VGlja2V0PC9zdHJpbmc+Cjwv
|
||||
ZGljdD4KPC9wbGlzdD4KhpKEmZkPTlNQcmludEFsbFBhZ2VzhpKgkoSZmQtOU1BhcGVy
|
||||
TmFtZYaShJmZBkxldHRlcoaShJmZFU5TSG9yaXpvbmFsUGFnaW5hdGlvboaShKGbopcA
|
||||
hpKEmZkWTlNIb3Jpem9udGFsbHlDZW50ZXJlZIaSppKEmZkJTlNQcmludGVyhpKEhIQJ
|
||||
TlNQcmludGVyAJSShJmZBXBzbGFthoaShJmZCE5TQ29waWVzhpKEoZuilwGGkoSZmQ9O
|
||||
U1NjYWxpbmdGYWN0b3KGkoShm4SEAWahAYaShJmZDU5TUmlnaHRNYXJnaW6GkoShm7ih
|
||||
AIaShJmZDk5TQm90dG9tTWFyZ2luhpKEoZu4oQCGkoSZmQxOU0xlZnRNYXJnaW6GkoSh
|
||||
m7ihAIaShJmZC05TVG9wTWFyZ2luhpKEoZu4oQCGkoSZmQpOU0xhc3RQYWdlhpKEoZui
|
||||
l4J/////hpKEmZkLTlNGaXJzdFBhZ2WGkoShm6KXAYaShJmZDU5TT3JpZW50YXRpb26G
|
||||
koShm6KXAIaGhg==
|
||||
</data>
|
||||
<key>ReadOnly</key>
|
||||
<string>NO</string>
|
||||
<key>RowAlign</key>
|
||||
<integer>1</integer>
|
||||
<key>RowSpacing</key>
|
||||
<real>36</real>
|
||||
<key>SheetTitle</key>
|
||||
<string>Canvas 1</string>
|
||||
<key>SmartAlignmentGuidesActive</key>
|
||||
<string>YES</string>
|
||||
<key>SmartDistanceGuidesActive</key>
|
||||
<string>YES</string>
|
||||
<key>UseEntirePage</key>
|
||||
<true/>
|
||||
<key>VPages</key>
|
||||
<integer>1</integer>
|
||||
<key>WindowInfo</key>
|
||||
<dict>
|
||||
<key>CurrentSheet</key>
|
||||
<string>0</string>
|
||||
<key>Frame</key>
|
||||
<string>{{664, 346}, {591, 832}}</string>
|
||||
<key>ShowRuler</key>
|
||||
<false/>
|
||||
<key>ShowStatusBar</key>
|
||||
<true/>
|
||||
<key>VisibleRegion</key>
|
||||
<string>{{0, 0}, {576, 734}}</string>
|
||||
<key>Zoom</key>
|
||||
<string>1</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
||||
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 73 B |
|
Before Width: | Height: | Size: 129 B |
|
Before Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 8.8 KiB |
|
Before Width: | Height: | Size: 646 B |
|
Before Width: | Height: | Size: 8.0 KiB |
|
Before Width: | Height: | Size: 8.0 KiB |
|
Before Width: | Height: | Size: 8.0 KiB |
|
Before Width: | Height: | Size: 905 B |
|
Before Width: | Height: | Size: 905 B |
|
Before Width: | Height: | Size: 71 B |
|
Before Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 7.4 KiB |
|
Before Width: | Height: | Size: 338 B |
|
Before Width: | Height: | Size: 464 B |
@@ -1,13 +0,0 @@
|
||||
digraph {
|
||||
edge [ len=1.8 ];
|
||||
0 [ pos="148,246z" ];
|
||||
1 [ pos="255,30", style="filled", fillcolor=gray ];
|
||||
2 [ pos="148,138", style="filled", fillcolor=gray ];
|
||||
3 [ pos="41,138", style="filled", fillcolor=gray ];
|
||||
1 -> 0 [ label="5" ];
|
||||
1 -> 2 [ label="3" ];
|
||||
2 -> 3 [ label="8" ];
|
||||
3 -> 0 [ headlabel="3", labeldistance=4.5, labelangle=0.2854 ];
|
||||
0 -> 3 [ headlabel="1", labeldistance=4.5, labelangle=-0.2854, color=red, fontcolor=red, style=dotted ];
|
||||
3 -> 1 [ label="2", len=2.8 ];
|
||||
}
|
||||
|
Before Width: | Height: | Size: 6.2 KiB |