lmi-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[lmi-commits] [lmi] valyuta/002 c02861a: Merge branch 'master' into valy


From: Greg Chicares
Subject: [lmi-commits] [lmi] valyuta/002 c02861a: Merge branch 'master' into valyuta/002
Date: Wed, 30 Sep 2020 07:47:50 -0400 (EDT)

branch: valyuta/002
commit c02861a35d727a07650b0f2f43a9dee48edb0d6d
Merge: 5fb74f1 f94663e
Author: Gregory W. Chicares <gchicares@sbcglobal.net>
Commit: Gregory W. Chicares <gchicares@sbcglobal.net>

    Merge branch 'master' into valyuta/002
---
 .github/workflows/ci.yml      |  17 +++++-
 GNUmakefile                   |   4 +-
 finra_header_upper.mst        |   2 +-
 finra_notes1.mst              |  56 ++---------------
 finra_notes2.mst              | 107 +++------------------------------
 gwc/.vim/spell/en.utf-8.add   |  28 +++++++++
 gwc/.vimrc                    |   3 +
 gwc/allow_perf.sh             |  51 ++++++++++++++++
 gwc/develop1.txt              |  12 +++-
 gwc/post-checkout             |  62 +++++++++++++++++++
 hooks/post-checkout           |  62 +++++++++++++++++++
 ihs_avsolve.cpp               |   4 +-
 ill_reg_column_headings.mst   |  50 ++--------------
 ill_reg_narr_summary.mst      |  67 +++------------------
 ill_reg_narr_summary2.mst     | 136 +++---------------------------------------
 ill_reg_numeric_summary.mst   |   4 +-
 lmi_setup_20.sh               |   1 +
 lmi_setup_25.sh               |   9 ++-
 path_utility_test.cpp         |  13 ++++
 pdf_command_wx.cpp            |   5 --
 reg_d_group_header_upper.mst  |   2 +-
 reg_d_group_narr_summary.mst  |  76 ++---------------------
 reg_d_group_narr_summary2.mst |  80 ++-----------------------
 reg_d_indiv_cover_page.mst    |  17 +-----
 reg_d_indiv_header.mst        |   2 +-
 reg_d_indiv_notes1.mst        |  40 +------------
 reg_d_indiv_notes2.mst        |  49 +--------------
 set_toolchain.sh              |  10 ++--
 workhorse.make                |  71 ++++++++++++----------
 29 files changed, 366 insertions(+), 674 deletions(-)

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index c0965e2..ee39d98 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -25,7 +25,7 @@ jobs:
         run: |
           sudo dpkg --add-architecture i386
           sudo apt-get update
-          sudo apt-get --assume-yes install libgcc-s1:i386 # Avoid 
configuration error later
+          sudo apt-get dist-upgrade -o APT::Immediate-Configure=0 # Avoid 
configuration error later
           sudo apt-get --assume-yes install \
             automake bc bsdmainutils bzip2 curl cvs default-jre \
             g++-mingw-w64-i686 g++-multilib git jing libarchive-tools \
@@ -39,6 +39,8 @@ jobs:
         run: |
           echo "::set-env name=NORMAL_UID::`id --user`"
           echo "::set-env name=coefficiency::--jobs=`nproc`"
+          gcc_version=$(${LMI_TRIPLET}-${LMI_COMPILER} -dumpversion|tr -d '\r')
+          echo "::set-env name=gcc_version::$gcc_version"
 
       - name: Create lmi directories
         run: >
@@ -61,13 +63,26 @@ jobs:
       - name: Build miscellanea
         run: make $coefficiency --output-sync=recurse -f 
install_miscellanea.make
 
+      - name: Cache libxml2, wxWidgets and wxPdfDoc
+        id: cache-local
+        uses: actions/cache@v2
+        with:
+          path: |
+            /opt/lmi/local/${{ env.LMI_COMPILER }}_${{ env.LMI_TRIPLET }}
+            /opt/lmi/local/include
+            /opt/lmi/local/share
+          key: build-${{ env.LMI_COMPILER }}-${{ env.gcc_version }}-${{ 
env.LMI_TRIPLET }}-${{ hashFiles('install_libxml2_libxslt.make', 
'install_wx.sh', 'install_wxpdfdoc.sh') }}
+
       - name: Build libxml2
+        if: steps.cache-local.outputs.cache-hit != 'true'
         run: make $coefficiency --output-sync=recurse -f 
install_libxml2_libxslt.make
 
       - name: Build wxWidgets
+        if: steps.cache-local.outputs.cache-hit != 'true'
         run: ./install_wx.sh
 
       - name: Build wxPdfDoc
+        if: steps.cache-local.outputs.cache-hit != 'true'
         run: ./install_wxpdfdoc.sh
 
       - name: Build lmi
diff --git a/GNUmakefile b/GNUmakefile
index 2ce23b6..8e08325 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -466,7 +466,9 @@ check_concinnity: source_clean custom_tools
        @for z in $(build_dir)/*.o; do [ -f $${z%%.o}.d ] || echo $$z; done;
        @find $(prefascicle_dir) -maxdepth 1 -executable -type f \
          -not -name '*.sh' -not -name '*.sed' \
-         -not -name 'commit-msg' -not -name 'pre-commit' \
+         -not -name 'commit-msg' \
+         -not -name 'pre-commit' \
+         -not -name 'post-checkout' \
          | $(SED) -e's/^/Improperly executable: /'
        @find $(prefascicle_dir) -executable -type f -print0 \
          | xargs --null --max-args=1 --max-procs="$(shell nproc)" 
./check_script.sh
diff --git a/finra_header_upper.mst b/finra_header_upper.mst
index 8b00d73..4f85b8e 100644
--- a/finra_header_upper.mst
+++ b/finra_header_upper.mst
@@ -24,7 +24,7 @@
 <br></br>
 <br></br>
 
-<!-- PDF !! HypotheticalRatesFootnote -->
+<!-- PDF !! HypotheticalRatesHeader -->
 <p>
 The purpose of this illustration is to show how the performance
 of the underlying investment account could affect the
diff --git a/finra_notes1.mst b/finra_notes1.mst
index b14687d..f4c26cf 100644
--- a/finra_notes1.mst
+++ b/finra_notes1.mst
@@ -25,26 +25,9 @@
 
 <font size="-1">
 
-<!-- PDF !! MecFootnote -->
 <p align="center"><b>IMPORTANT TAX DISCLOSURE</b></p>
 <p>
-As illustrated, this {{ContractName}}
-{{#IsMec}}
-    becomes
-{{/IsMec}}
-{{^IsMec}}
-    would not become
-{{/IsMec}}
-a Modified Endowment Contract (MEC)
-{{#IsMec}}
-    under the Internal Revenue Code in year {{MecYearPlus1}}.
-{{/IsMec}}
-{{^IsMec}}
-    under the Internal Revenue Code.
-{{/IsMec}}
-To the extent of gain in the {{ContractName}}, loans, distributions
-and withdrawals from a MEC are subject to income tax
-and may also trigger a penalty tax.
+    {{MecFootnote}}
 </p>
 
 {{^IsInforce}}
@@ -53,23 +36,12 @@ and may also trigger a penalty tax.
     </p>
 {{/IsInforce}}
 
-<!-- PDF !! FnDacTax -->
-<!-- The phrase "tax charge" is unclear. Probably the DAC tax is meant. -->
 <p>
-No tax charge is made to the Separate Account. However,
-such a charge may be made in the future.
+    {{FnDacTax}}
 </p>
 
-<!-- PDF !! FnNotTaxAdvice -->
 <p>
-<b>
-The information contained in this illustration is not written
-or intended as tax or legal advice. Neither {{InsCoShortName}} its
-subsidiaries, employees or representatives are authorized to give tax
-or legal advice. For more information pertaining
-to the tax consequences of purchasing or owning this {{ContractName}},
-consult with your own independent tax or legal counsel.
-</b>
+    {{FnNotTaxAdvice}}
 </p>
 
 <br></br>
@@ -99,18 +71,8 @@ in an illustration-reg template, if anywhere.
     <p>{{NoLapseEverFootnote}}</p>
 {{/NoLapseAlwaysActive}}
 
-<!-- PDF !! FnDefnLifeIns -->
 <p>
-The definition of life insurance elected for this
-{{ContractName}} is the
-{{#DefnLifeInsIsGPT}}
-    guideline premium test. The guideline single premium is
-    ${{InitGSP}} and the guideline
-    level premium is ${{InitGLP}}.
-{{/DefnLifeInsIsGPT}}
-{{^DefnLifeInsIsGPT}}
-    cash value accumulation test.
-{{/DefnLifeInsIsGPT}}
+    {{FnDefnLifeIns}}
 </p>
 
 {{#DefnLifeInsIsGPT}}
@@ -119,18 +81,12 @@ The definition of life insurance elected for this
 </p>
 {{/DefnLifeInsIsGPT}}
 
-<!-- PDF !! RejectPremiumFootnote -->
 <p>
-{{InsCoName}} has the right to promptly refund any amount of premium paid if it
-will increase the net amount at risk (referred to in the {{ContractName}} as
-the Amount of Insurance that Requires a Charge).
+    {{RejectPremiumFootnote}}
 </p>
 
-<!-- PDF !! FnBoyEoy -->
 <p>
-Premium payments are assumed to be made at the beginning of the year. Account
-values, cash surrender values, and death benefits are illustrated as of the end
-of the year. {{MinimumPremiumFootnote}}
+    {{FnBoyEoy}}
 </p>
 
 </font>
diff --git a/finra_notes2.mst b/finra_notes2.mst
index 7a5599c..8a0bc43 100644
--- a/finra_notes2.mst
+++ b/finra_notes2.mst
@@ -83,13 +83,13 @@
 
 {{#HasChildRider}}
     <p>
-    The ${{ChildRiderAmount}}&nbsp; {{ChildFootnote}}
+    {{ChildFootnote}}
     </p>
 {{/HasChildRider}}
 
 {{#HasSpouseRider}}
     <p>
-    The ${{SpouseRiderAmount}}&nbsp; {{SpouseFootnote}}
+    {{SpouseFootnote}}
     </p>
 {{/HasSpouseRider}}
 
@@ -97,77 +97,16 @@
 
 {{FnPartialMortality}}
 
-<!-- PDF !! MortalityBlendFootnote -->
-{{#GenderBlended}}
-    <p>
-    Custom blending of cost of insurance charges is based
-    on the plan's assumed distribution of initial selected
-    face amount by gender and tobacco use. This illustration
-    assumes that the distribution remains constant
-    in future years. Custom blending is available only on plans
-    of 100 or more lives. Custom blend assumptions:
-    {{#SmokerBlended}}
-        nontobacco = {{NonsmokerProportion}};
-    {{/SmokerBlended}}
-    {{^SmokerBlended}}
-        no blending by tobacco use;
-    {{/SmokerBlended}}
-    male = {{MaleProportion}}.
-    </p>
-{{/GenderBlended}}
-{{#SmokerBlended}}
-    <p>
-    Custom blending of cost of insurance charges is based
-    on the plan's assumed distribution of initial selected
-    face amount by gender and tobacco use. This illustration
-    assumes that the distribution remains constant
-    in future years. Custom blending is available only on plans
-    of 100 or more lives. Custom blend assumptions:
-    nontobacco = {{NonsmokerProportion}};
-    {{#GenderBlended}}
-        male = {{MaleProportion}}.
-    {{/GenderBlended}}
-    {{^GenderBlended}}
-        no blending by gender.
-    {{/GenderBlended}}
-    </p>
-{{/SmokerBlended}}
+{{MortalityBlendFootnote}}
 
 <p>
 The state of issue is {{StateOfJurisdiction}}.
 </p>
 
 {{#IsInforce}}
-<!-- PDF !! Combine FnInforceAcctVal and FnInforceTaxBasis -->
-    <p>
-    This illustration assumes a beginning account value of
-    ${{InforceTotalAV}},
-    and a beginning cost basis of
-    ${{InforceTaxBasis}},
-    based on the last monthly calculation date,
-    {{InforceAsOfDate}}.
-    The current account value and cost basis may be higher or lower.
-    Consult the Home Office if you require further information.
-    </p>
-<!--
-  PDF !! THESE ARE TO BE COMBINED:
-  PDF !! FnInforceAcctVal
-    <p>
-    This illustration assumes a beginning account value of
-    ${{InforceTotalAV}}
-    as of {{InforceAsOfDate}},
-    the end of the last completed {{ContractName}} month.
-    </p>
-  PDF !! FnInforceTaxBasis
     <p>
-    This illustration assumes a beginning cost basis of
-    ${{InforceTaxBasis}}
-    as of {{InforceAsOfDate}},
-    the end of the last completed {{ContractName}} month;
-    the actual cost basis may be higher or lower.
-    Consult the Home Office for cost basis information.
+    {{FnInforceAcctVal}}
     </p>
--->
 {{/IsInforce}}
 
 {{#CallGuarUwSubstd}}
@@ -176,13 +115,8 @@ The state of issue is {{StateOfJurisdiction}}.
 
 <p align="center"><b>GUARANTEED PRINCIPAL ACCOUNT</b></p>
 
-<!-- PDF !! FnGeneralAccount -->
 <p>
-The Guaranteed Principal Account (GPA) has a guaranteed
-minimum annual interest rate of
-{{InitAnnGenAcctInt_Guaranteed}}.
-Guarantees are based on the claims-paying ability of the
-issuing company or companies.
+    {{FnGeneralAccount}}
 </p>
 
 <p align="center"><b>SEPARATE ACCOUNT</b></p>
@@ -192,43 +126,18 @@ issuing company or companies.
 </p>
 
 {{^Composite}}
-<!-- PDF !! FnImf -->
-    <p>
-    This illustration is based on total Separate Account
-    fund expenses of {{TotalIMF[0]}}.
-    </p>
-    {{#AvgFund}}
-        <p>
-        Investment management fees are based on equal
-        initial allocations among the available funds.
-        </p>
-    {{/AvgFund}}
-    {{#CustomFund}}
-        <p>
-        Investment management fees are based on an initial allocation
-        of 100% to a custom fund selected by the purchaser.
-        </p>
-    {{/CustomFund}}
+    {{FnImf}}
 {{/Composite}}
 
-<!-- PDF !! FnProspectus -->
 <p>
-<b>
-This material must be preceded or accompanied by the current prospectus for the
-{{PolicyMktgName}} Insurance {{ContractName}} and the prospectuses (or summary
-prospectuses, if available) for its underlying investment choices. Before
-purchasing a {{ContractName}}, you should carefully consider the investment
-objectives, risks, charges and expenses of the {{ContractName}} and its
-underlying investment choices. Please read the prospectuses carefully before
-investing or sending money.
-</b>
+    <b>{{FnProspectus}}</b>
 </p>
 
 <p>
 {{SubsidiaryFootnote}}
 </p>
 
-<!-- PDF !! PlacementAgentFootnote -->
+<!-- PDF !! This should be something like BrokerDealerFootnote -->
 <p>
 Securities offered through registered representatives of
 {{CoUnderwriter}}&nbsp;
diff --git a/gwc/.vim/spell/en.utf-8.add b/gwc/.vim/spell/en.utf-8.add
index ab8daeb..4c523b7 100644
--- a/gwc/.vim/spell/en.utf-8.add
+++ b/gwc/.vim/spell/en.utf-8.add
@@ -308,3 +308,31 @@ datestamped
 datestamp
 testdeck
 testdecks
+respecify
+respecifying
+conditionalize
+reconfiguring
+substitutable
+toolchains
+underspecified
+unuseful
+canonicalized
+uniquify
+manpage
+optionless
+transactional
+programmatically
+proration
+unloaned
+definitional
+reinitializing
+reproducibility
+reinitialization
+congener
+iteratively
+ambiguate
+ambiguates
+pixilated
+timestamps
+overelaborate
+versioning
diff --git a/gwc/.vimrc b/gwc/.vimrc
index e7916d6..b0cc532 100644
--- a/gwc/.vimrc
+++ b/gwc/.vimrc
@@ -36,6 +36,9 @@ set cinoptions=t0\ g0\ {s\ (0\ U1 comments^=:///
 " By default, vim detects '*.mak' as type make, but not '*.make'
 au BufNewFile,BufRead *.make setf make
 
+" Restore last position
+au BufReadPost * normal! g`"zv
+
 au BufReadPost,BufNewFile *.tpp set ft=cpp
 au BufReadPost,BufNewFile *.xpp set ft=cpp
 " au BufReadPost,BufNewFile *.?pp set ft=cpp
diff --git a/gwc/allow_perf.sh b/gwc/allow_perf.sh
new file mode 100755
index 0000000..d5dfd9c
--- /dev/null
+++ b/gwc/allow_perf.sh
@@ -0,0 +1,51 @@
+#!/bin/sh
+
+# Allow 'perf' to be run by members of a certain group.
+
+# Copyright (C) 2020 Gregory W. Chicares.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+# https://savannah.nongnu.org/projects/lmi
+# email: <gchicares@sbcglobal.net>
+# snail: Chicares, 186 Belle Woods Drive, Glastonbury CT 06033, USA
+
+# The copyright notice above is pro forma only. This is all based on:
+#   https://www.kernel.org/doc/html/latest/admin-guide/perf-security.html
+
+# This may become useful someday, but for now...
+exit 9
+
+cd /usr/bin || { printf 'failed: cd\n'; exit 3; }
+groupadd perf_users
+chgrp perf_users perf
+chmod o-rwx perf
+ls -l perf
+# if "cap_perfmon" is supported:
+# setcap "cap_perfmon,cap_sys_ptrace,cap_syslog=ep" perf
+# setcap -v "cap_perfmon,cap_sys_ptrace,cap_syslog=ep" perf
+# otherwise:
+setcap "38,cap_ipc_lock,cap_sys_ptrace,cap_syslog=ep" perf
+setcap -v "38,cap_ipc_lock,cap_sys_ptrace,cap_syslog=ep" perf
+getcap perf
+
+echo "usermod -aG perf_users SomeUserName"
+
+# To use the new capabilities without logging out and back in:
+#   newgrp perf_users
+# but see:
+#   https://lists.nongnu.org/archive/html/lmi/2020-09/msg00073.html
+
+# Disliked alternative:
+# echo 1 >/proc/sys/kernel/perf_event_paranoid
diff --git a/gwc/develop1.txt b/gwc/develop1.txt
index 452c649..db93fbd 100644
--- a/gwc/develop1.txt
+++ b/gwc/develop1.txt
@@ -46,6 +46,10 @@ cvs commit -m "Modify foo webpage" bar.html
 
 git mv lmi.rc lmi_msw_res.rc
 
+  # Reuse commit message when commit originally failed
+
+git commit --edit --file=.git/COMMIT_EDITMSG -- [files]
+
   # Make a patch against repository from local tree
 
 git diff file0.cpp file1.cpp >some_new_file
@@ -100,10 +104,14 @@ git commit sandbox_test.cpp
 git switch master
 git push origin odd/foo
 
-  # to transplant unpushed commits to a new branch
+  # to transplant unpushed commits to a new branch--see:
+  #   https://lists.nongnu.org/archive/html/lmi/2020-09/msg00034.html
 git branch odd/foo
 git reset --keep origin/master
-  # ...and don't ever rebase that new branch
+  # specify upstream on the first push (ignore if it's never pushed)
+git push --set-upstream origin odd/foo
+  # ...and, if that branch is (later) to be rebased on 'master', be
+  # sure to use either '--no-fork-point' or an explicit branch name.
 
   # (to copy to a subdir before deletion, so it's in permanent history)
   # (this works only if all modified files are unique to the branch)
diff --git a/gwc/post-checkout b/gwc/post-checkout
new file mode 100755
index 0000000..8396906
--- /dev/null
+++ b/gwc/post-checkout
@@ -0,0 +1,62 @@
+#!/bin/sh
+
+# Synchronize timestamps in a local mirror directory if you are I.
+#
+# Copyright (C) 2020 Gregory W. Chicares.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+# https://savannah.nongnu.org/projects/lmi
+# email: <gchicares@sbcglobal.net>
+# snail: Chicares, 186 Belle Woods Drive, Glastonbury CT 06033, USA
+
+set -e
+
+# This is a personal hook. You probably don't want to use it.
+
+if [ "greg" != "$(whoami)" ]; then
+  exit 0
+fi
+
+# Motivation. I maintain a local mirror of origin/master in a
+# directory named by ${mirror_dir}. It is often convenient to
+# compare it to my working directory using some GUI diff program,
+# which may assume that files differ when their dates differ, even
+# if their contents match--as often occurs when 'git switch' is
+# used. To prevent that inconvenience, this script synchronizes
+# the mirror directory's timestamps to the working copy's.
+#
+# Running 'cmp' against hundreds of pairs of files takes enough
+# time to be inconvenient, so this script considers only files
+# that should differ between the old and new HEADs.
+
+old_head=$1
+new_head=$2
+# not useful here:
+# branch_flag=$3
+
+old_head_name="$(git name-rev --name-only "$old_head")"
+new_head_name="$(git name-rev --name-only "$new_head")"
+
+changed_files=$(git diff --name-only "$old_head_name..$new_head_name")
+
+mirror_dir=/opt/lmi/free/src/lmi/
+
+for z in $changed_files
+do
+    y=$mirror_dir/$z
+    if cmp --quiet "$y" "$z" ; then
+        touch --no-create --reference="$z" "$y";
+    fi
+done
diff --git a/hooks/post-checkout b/hooks/post-checkout
new file mode 100755
index 0000000..8396906
--- /dev/null
+++ b/hooks/post-checkout
@@ -0,0 +1,62 @@
+#!/bin/sh
+
+# Synchronize timestamps in a local mirror directory if you are I.
+#
+# Copyright (C) 2020 Gregory W. Chicares.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+# https://savannah.nongnu.org/projects/lmi
+# email: <gchicares@sbcglobal.net>
+# snail: Chicares, 186 Belle Woods Drive, Glastonbury CT 06033, USA
+
+set -e
+
+# This is a personal hook. You probably don't want to use it.
+
+if [ "greg" != "$(whoami)" ]; then
+  exit 0
+fi
+
+# Motivation. I maintain a local mirror of origin/master in a
+# directory named by ${mirror_dir}. It is often convenient to
+# compare it to my working directory using some GUI diff program,
+# which may assume that files differ when their dates differ, even
+# if their contents match--as often occurs when 'git switch' is
+# used. To prevent that inconvenience, this script synchronizes
+# the mirror directory's timestamps to the working copy's.
+#
+# Running 'cmp' against hundreds of pairs of files takes enough
+# time to be inconvenient, so this script considers only files
+# that should differ between the old and new HEADs.
+
+old_head=$1
+new_head=$2
+# not useful here:
+# branch_flag=$3
+
+old_head_name="$(git name-rev --name-only "$old_head")"
+new_head_name="$(git name-rev --name-only "$new_head")"
+
+changed_files=$(git diff --name-only "$old_head_name..$new_head_name")
+
+mirror_dir=/opt/lmi/free/src/lmi/
+
+for z in $changed_files
+do
+    y=$mirror_dir/$z
+    if cmp --quiet "$y" "$z" ; then
+        touch --no-create --reference="$z" "$y";
+    fi
+done
diff --git a/ihs_avsolve.cpp b/ihs_avsolve.cpp
index 3e819e8..49a6327 100644
--- a/ihs_avsolve.cpp
+++ b/ihs_avsolve.cpp
@@ -130,8 +130,10 @@ class SolveHelper
 /// contract ever becomes a MEC. The result is naturally a boundary
 /// value, so it is not interesting to compare it to any solve input.
 ///
-/// Non-MEC solves for loan or withdrawal are untested--see:
+/// Non-MEC solves for loan or withdrawal are untested because they
+/// probably make no sense--see:
 ///   https://lists.nongnu.org/archive/html/lmi/2009-02/msg00028.html
+/// so perhaps they should be prohibited.
 ///
 /// Non-MEC solves seem acceptably fast despite this two-valued step
 /// function. Other options considered include:
diff --git a/ill_reg_column_headings.mst b/ill_reg_column_headings.mst
index 88e79a1..0f3ea71 100644
--- a/ill_reg_column_headings.mst
+++ b/ill_reg_column_headings.mst
@@ -30,26 +30,9 @@
 
 <font size="-1">
 
-<!-- PDF !! DefnAV -->
-<p>
-<b>{{AvName}} Value:</b>
-The accumulation at interest of the net premiums paid,
-{{^SinglePremium}}
-less any withdrawals, less any monthly charges deducted.
-{{/SinglePremium}}
-{{#SinglePremium}}
-less any monthly charges deducted.
-{{/SinglePremium}}
-</p>
+{{DefnAV}}
 
-<!-- PDF !! DefnCSV -->
-<p>
-<b>{{CsvName}} Value:</b>
-{{AvName}} Value less {{ContractName}} debt.
-{{#Has1035ExchCharge}}
-  {{CashSurrValueFootnote}}
-{{/Has1035ExchCharge}}
-</p>
+{{DefnCSV}}
 
 {{^IsInforce}}
   <p>
@@ -97,17 +80,7 @@ less any monthly charges deducted.
 {{GuaranteedValuesFootnote}}
 </p>
 
-<!-- PDF !! DefnMec -->
-<p>
-<b>MEC:</b>
-Modified Endowment Contract - this classification is given
-to a {{ContractName}} in violation of TAMRA
-(Technical and Miscellaneous Revenue Act), which limits
-the amount of premium that can be paid into a life
-insurance {{ContractName}}. To the extent of gain in the {{ContractName}}, 
loans,
-distributions and withdrawals from a MEC are subject
-to income tax and may also trigger a tax penalty.
-</p>
+{{DefnMec}}
 
 {{^IsInforce}}
 <p>
@@ -128,22 +101,9 @@ to income tax and may also trigger a tax penalty.
 {{PolicyYearFootnote}}
 </p>
 
-<!-- PDF !! DefnOutlay -->
-<p>
-<b>Premium Outlay:</b>
-The amount of premium assumed to be paid by the {{ContractName}} owner
-or other premium payor.
-</p>
+{{DefnOutlay}}
 
-<!-- PDF !! DefnSpecAmt -->
-<p>
-<b>Selected Face Amount:</b>
-The Selected Face Amount may be decreased upon written application
-satisfactory to {{InsCoName}}. A
-requested decrease is allowed only once per Policy Year, and the
-resulting Selected Face Amount after decrease must meet the
-minimum defined in your {{ContractName}}.
-</p>
+{{DefnSpecAmt}}
 
 {{SinglePremiumFootnote}}
 
diff --git a/ill_reg_narr_summary.mst b/ill_reg_narr_summary.mst
index 2200a99..f47e4ee 100644
--- a/ill_reg_narr_summary.mst
+++ b/ill_reg_narr_summary.mst
@@ -31,15 +31,9 @@
 {{ProductDescription}}
 </p>
 
-<!-- PDF !! FnProposalUnderwriting -->
 {{^IsInforce}}
     <p>
-    Coverage may be available on a Guaranteed Standard Issue basis.
-    All proposals are based on case characteristics and must
-    be approved by the {{InsCoShortName}}
-    Home Office. For details regarding underwriting
-    and coverage limitations refer to your offer letter
-    or contact your {{InsCoShortName}} representative.
+    {{FnProposalUnderwriting}}
     </p>
 {{/IsInforce}}
 
@@ -48,49 +42,17 @@
 </p>
 
 <p>
-{{!
-    PDF !! This premium-mode footnote is misleading:
-      - mode may vary by year, but only initial mode is shown
-      - ee and er modes may differ, but only er mode is shown
-}}
-
-<!-- PDF !! FnBoyEoy -->
-{{^SinglePremium}}
-    Premiums are assumed to be paid on
-    {{InitErModeWithIndefiniteArticle}}
-    basis and received at the beginning of the premium paying period.
-{{/SinglePremium}}
-{{#SinglePremium}}
-    The single premium is assumed to be paid at the beginning
-    of the {{ContractName}} year.
-{{/SinglePremium}}
-
-{{AvName}} Values, {{CsvName}} Values,
-and death benefits are illustrated as of the end
-of the {{ContractName}} year. The method we use to allocate
-overhead expenses is the fully allocated expense method.
+    {{FnBoyEoy}}
 </p>
 
-<!-- PDF !! FnGuaranteedPremium -->
 {{^SinglePremium}}
-    <p>
-    In order to guarantee coverage to age {{EndtAge}},
-    {{InitEeModeWithIndefiniteArticle}}
-    premium of ${{GuarPrem}} must be paid.
-    This amount is based on the guaranteed monthly charges
-    and the guaranteed interest crediting rate.
-    {{#DefnLifeInsIsGPT}}
-    This premium may be in excess of the maximum premium allowable
-    in order to qualify this {{ContractName}} as life insurance.
-    {{/DefnLifeInsIsGPT}}
-    </p>
+<p>
+    {{FnGuaranteedPremium}}
+</p>
 {{/SinglePremium}}
 
-<!-- PDF !! LoanFootnote -->
 <p>
-Loaned amounts of the {{AvName}}
-Value will be credited a rate equal to the loan interest rate less
-a spread, guaranteed not to exceed {{MaxAnnGuarLoanSpread}}.
+    {{LoanFootnote}}
 </p>
 
 {{#HasTerm}}
@@ -132,25 +94,12 @@ a spread, guaranteed not to exceed 
{{MaxAnnGuarLoanSpread}}.
     </p>
 {{/HasADD}}
 
-<!-- PDF !! FnDefnLifeIns -->
 <p>
-The definition of life insurance for this {{ContractName}} is the
-{{#DefnLifeInsIsGPT}}
-    guideline premium test. The guideline single premium
-    is ${{InitGSP}}
-    and the guideline level premium
-    is ${{InitGLP}}
-{{/DefnLifeInsIsGPT}}
-{{^DefnLifeInsIsGPT}}
-    cash value accumulation test.
-{{/DefnLifeInsIsGPT}}
+    {{FnDefnLifeIns}}
 </p>
 
-<!-- PDF !! FnOmnibusDisclaimer -->
 <p>
-This is an illustration only. An illustration is not intended
-to predict actual performance. Interest rates
-and values set forth in the illustration are not guaranteed.
+    {{FnOmnibusDisclaimer}}
 </p>
 
 <p>
diff --git a/ill_reg_narr_summary2.mst b/ill_reg_narr_summary2.mst
index 384ae82..6986217 100644
--- a/ill_reg_narr_summary2.mst
+++ b/ill_reg_narr_summary2.mst
@@ -30,18 +30,9 @@
 
 <font size="-1">
 
-<!-- PDF !! SalesLoadRefundFootnote -->
 {{#SalesLoadRefundAvailable}}
     <p>
-    Sales Load Refund: We will refund a portion of the sales load
-    to you, as part of your {{CsvName}}
-    Value, if you surrender your {{ContractName}} within the first two
-    {{ContractName}} years. In {{ContractName}} year 1, we will refund
-    {{SalesLoadRefundRate0}}
-    of the first {{ContractName}} year sales load collected
-    and in {{ContractName}} year 2, we will refund
-    {{SalesLoadRefundRate1}}
-    of the first {{ContractName}} year sales load collected.
+    {{SalesLoadRefundFootnote}}
     </p>
 {{/SalesLoadRefundAvailable}}
 
@@ -61,67 +52,23 @@
 
 {{FnPartialMortality}}
 
-<!-- PDF !! LoanFootnote -->
-{{!
-    PDF !! 'MaxAnnCurrLoanDueRate': loan rate actually can vary by year,
-    so text should say that the fixed loan rate is "guaranteed never
-    to exceed" this value.
-}}
-<p>
-The loan interest rate is fixed at {{MaxAnnCurrLoanDueRate}} per year.
-</p>
-
 <p>
 The state of issue is {{StateOfJurisdiction}}.
 </p>
 
-<!-- PDF !! FnInitialSpecAmt -->
 <p>
-This illustration assumes an initial Selected Face Amount of
-${{InitBaseSpecAmt}}. Selected Face
-Amount reductions assumed in this illustration (if any) are shown
-in the Tabular Detail.
+    {{FnInitialSpecAmt}}
 </p>
 
 {{#IsInforce}}
-<!-- PDF !! Combine FnInforceAcctVal and FnInforceTaxBasis -->
-    <p>
-    This illustration assumes a beginning account value of
-    ${{InforceTotalAV}},
-    and a beginning cost basis of
-    ${{InforceTaxBasis}},
-    based on the last monthly calculation date,
-    {{InforceAsOfDate}}.
-    The current account value and cost basis may be higher or lower.
-    Consult the Home Office if you require further information.
-    </p>
-<!--
-  PDF !! THESE ARE TO BE COMBINED:
-  PDF !! FnInforceAcctVal
-    <p>
-    This illustration assumes a beginning account value of
-    ${{InforceTotalAV}}
-    as of {{InforceAsOfDate}},
-    the end of the last completed {{ContractName}} month.
-    </p>
-  PDF !! FnInforceTaxBasis
     <p>
-    This illustration assumes a beginning cost basis of
-    ${{InforceTaxBasis}}
-    as of {{InforceAsOfDate}},
-    the end of the last completed {{ContractName}} month;
-    the actual cost basis may be higher or lower.
-    Consult the Home Office for cost basis information.
+    {{FnInforceAcctVal}}
     </p>
--->
 {{/IsInforce}}
 
-<!-- PDF !! FnCensus -->
-<!-- There is no "attached census". -->
 {{#Composite}}
     <p>
-    Please see the attached census, listing the face amounts,
-    underwriting classes and issue ages for individual participants.
+    {{FnCensus}}
     </p>
 {{/Composite}}
 
@@ -133,60 +80,21 @@ in the Tabular Detail.
     <p>{{GuarIssueDisclaimerMd}}</p>
 {{/StateIsMaryland}}
 
-<!-- PDF !! Fn1035Charge -->
 {{#Has1035ExchCharge}}
     <p>
-    {{^SinglePremium}}
-        Upon surrender of this {{ContractName}}, where the surrender
-        proceeds are intended to be applied to an insurance policy
-        or certificate issued in conjunction with an intent
-        to qualify the exchange as a tax free exchange
-        under Section 1035 of the Internal Revenue Code,
-        we may assess an Exchange Charge. The Exchange Charge
-        is the greater of the Market Value Adjustment Charge
-        and the Percentage of Premium Charge. In the states
-        of Florida or Indiana, the Exchange charge
-        (referred to as Assignment Charge in Florida)
-        will be the Percentage of Premium Charge only.
-        The Exchange Charge will potentially reduce
-        the surrender proceeds, but will never increase
-        the surrender proceeds. Please refer to your {{ContractName}}
-        for details.
-    {{/SinglePremium}}
-    {{#SinglePremium}}
-        Upon surrender of this {{ContractName}}, where the surrender proceeds
-        are intended to be applied to an insurance policy
-        or certificate issued in conjunction with an intent
-        to qualify the exchange as a tax free exchange
-        under Section 1035 of the Internal Revenue Code (1035
-        Exchange), we may assess an Exchange Charge. The Exchange
-        Charge will potentially reduce the surrender proceeds,
-        but will never increase the surrender proceeds.
-        Please refer to your {{ContractName}} for details.
-    {{/SinglePremium}}
+    {{Fn1035Charge}}
     </p>
 {{/Has1035ExchCharge}}
 
-<!-- PDF !! SpouseFootnote -->
 {{#HasSpouseRider}}
     <p>
-    The ${{SpouseRiderAmount}} Spouse
-    rider provides term life insurance on the spouse
-    (issue age {{SpouseIssueAge}})
-    for a limited duration, for an extra charge.
-    Please refer to your {{ContractName}} for specific provisions
-    and a detailed schedule of charges.
+    {{SpouseFootnote}}
     </p>
 {{/HasSpouseRider}}
 
-<!-- PDF !! ChildFootnote -->
 {{#HasChildRider}}
     <p>
-    The ${{ChildRiderAmount}} Child
-    rider provides term life insurance on the insured's children
-    for a limited duration, for an extra charge. Please refer
-    to your {{ContractName}} for specific provisions
-    and a detailed schedule of charges.
+    {{ChildFootnote}}
     </p>
 {{/HasChildRider}}
 
@@ -200,26 +108,8 @@ in the Tabular Detail.
 
 <font size="-1">
 
-<!-- PDF !! MecFootnote -->
-<!-- This is not appropriate for composites. -->
 <p>
-As illustrated, this {{ContractName}}
-{{#IsMec}}
-    becomes
-{{/IsMec}}
-{{^IsMec}}
-    would not become
-{{/IsMec}}
-a Modified Endowment Contract (MEC)
-{{#IsMec}}
-    under the Internal Revenue Code in year {{MecYearPlus1}}.
-{{/IsMec}}
-{{^IsMec}}
-    under the Internal Revenue Code.
-{{/IsMec}}
-To the extent of gain in the {{ContractName}}, loans, distributions
-and withdrawals from a MEC are subject to income tax
-and may also trigger a penalty tax.
+    {{MecFootnote}}
 </p>
 
 {{^SinglePremium}}
@@ -230,16 +120,8 @@ and may also trigger a penalty tax.
     {{/IsInforce}}
 {{/SinglePremium}}
 
-<!-- PDF !! FnNotTaxAdvice -->
 <p>
-<b>
-The information contained in this illustration is not written
-or intended as tax or legal advice. Neither {{InsCoShortName}} its
-subsidiaries, employees or representatives are authorized to give tax
-or legal advice. For more information pertaining
-to the tax consequences of purchasing or owning this {{ContractName}},
-consult with your own independent tax or legal counsel.
-</b>
+    {{FnNotTaxAdvice}}
 </p>
 
 </font>
diff --git a/ill_reg_numeric_summary.mst b/ill_reg_numeric_summary.mst
index e079f47..8f99c2f 100644
--- a/ill_reg_numeric_summary.mst
+++ b/ill_reg_numeric_summary.mst
@@ -80,11 +80,9 @@ keeping the center alignment of the last "p" tag above.
     {{/LapseYear_Curr_LT_MaxDur}}
 {{/Composite}}
 
-<!-- PDF !! FnMecExtraWarning -->
 {{#IsMec}}
 <p>
-            IMPORTANT TAX DISCLOSURE: This is a Modified Endowment Contract.
-            Please refer to the Narrative Summary for additional information.
+    {{FnMecExtraWarning}}
 </p>
 {{/IsMec}}
 
diff --git a/lmi_setup_20.sh b/lmi_setup_20.sh
index 13ae6b0..a896705 100755
--- a/lmi_setup_20.sh
+++ b/lmi_setup_20.sh
@@ -103,6 +103,7 @@ apt-get --assume-yes install \
   trang \
   unzip \
   vim-doc \
+  vim-fugitive \
   vim-gtk \
   wget \
   wine \
diff --git a/lmi_setup_25.sh b/lmi_setup_25.sh
index 72f1153..fe6cfc1 100755
--- a/lmi_setup_25.sh
+++ b/lmi_setup_25.sh
@@ -42,10 +42,15 @@ cp -a .vimrc ~
 # Without this, 'zg' gives an error message; with it, vim creates a
 # spellfile the first time 'zg' is used, if none already exists.
 # But it's a much better idea to install a mature spellfile and
-# (imperatively) run 'mkspell':
+# (imperatively) run 'mkspell'. However, 'vim-gtk (2:8.2.0716-3)'
+# balks at doing that automatically here:
+#  - as given: "No protocol specified"
+#  - with '-X' or '-v': silently returns 1
+# so it might need to be done manually later.
 mkdir -p ~/.vim/spell
 cp -a en.utf-8.add ~/.vim/spell/en.utf-8.add
-vim -es -c ':mkspell! ~/.vim/spell/en.utf-8.add' -c ':q'
+vim -es -c ':mkspell! ~/.vim/spell/en.utf-8.add' -c ':q' ||
+  echo "Run ':mkspell! ~/.vim/spell/en.utf-8.add' manually."
 
 # Configure git. See:
 #   https://lists.nongnu.org/archive/html/lmi/2016-03/msg00006.html
diff --git a/path_utility_test.cpp b/path_utility_test.cpp
index 18ad82a..02ed71e 100644
--- a/path_utility_test.cpp
+++ b/path_utility_test.cpp
@@ -303,11 +303,22 @@ void test_unique_filepath_with_ludicrous_filenames()
 
 void test_path_inserter()
 {
+    {
     char const* z = "/opt/lmi/test/foo.bar";
     fs::path const p(z);
     std::ostringstream oss;
     oss << p;
     BOOST_TEST_EQUAL(z, oss.str());
+    }
+
+    // Ensure that operator<<() works with spaces in path.
+    {
+    char const* z = "/My Opt/lmi/My Tests/My Foo.My Bar";
+    fs::path const p(z);
+    std::ostringstream oss;
+    oss << p;
+    BOOST_TEST_EQUAL(z, oss.str());
+    }
 }
 
 void test_path_validation()
@@ -374,6 +385,8 @@ void test_path_validation()
 
 int test_main(int, char*[])
 {
+    initialize_filesystem();
+
     test_modify_directory();
     test_orthodox_filename();
     test_serial_file_path();
diff --git a/pdf_command_wx.cpp b/pdf_command_wx.cpp
index c7e6f5a..1cb22ed 100644
--- a/pdf_command_wx.cpp
+++ b/pdf_command_wx.cpp
@@ -2921,11 +2921,6 @@ class pdf_illustration_reg_d_group : public 
pdf_illustration
 
         auto const& invar = ledger.GetLedgerInvariant();
 
-        add_variable
-            ("MecYearIs0"
-            ,invar.MecYear == 0
-            );
-
         // Add all the pages.
         numbered_page::start_numbering();
         add<cover_page>();
diff --git a/reg_d_group_header_upper.mst b/reg_d_group_header_upper.mst
index 2f1c4d6..c6019ef 100644
--- a/reg_d_group_header_upper.mst
+++ b/reg_d_group_header_upper.mst
@@ -24,7 +24,7 @@
 <br></br>
 <br></br>
 
-<!-- PDF !! HypotheticalRatesFootnote -->
+<!-- PDF !! HypotheticalRatesHeader -->
 <p>
 The purpose of this illustration is to show how the performance
 of the underlying separate account divisions could affect
diff --git a/reg_d_group_narr_summary.mst b/reg_d_group_narr_summary.mst
index 4d02446..1ca27a1 100644
--- a/reg_d_group_narr_summary.mst
+++ b/reg_d_group_narr_summary.mst
@@ -34,46 +34,24 @@
 <u>Stable Value Feature</u>&nbsp;{{StableValueFootnote}}
 </p>
 
-<!-- PDF !! FnInitialDbo -->
 <p>
-This illustration assumes Initial Death Benefit Option {{InitDBOpt}}.
+    {{FnInitialDbo}}
 </p>
 
-<!-- PDF !! FnPpAccreditedInvestor -->
 <p>
-This policy is only available to entities that meet the definition
-of "accredited investor" or "qualified purchaser" under applicable
-Federal securities laws.  Purchase of this policy is suitable
-only for entities of substantial economic means. Each prospective
-purchaser will be required to represent that it is familiar
-with and understands the fundamental risks and financial hazards
-of purchasing the policy. Each prospective purchaser must
-also represent that it meets minimum financial and other
-suitability standards.
+    {{FnPpAccreditedInvestor}}
 </p>
 
 <p>
 {{NoVanishPremiumFootnote}}
 </p>
 
-<!-- PDF !! FnDefnLifeIns -->
 <p>
-The definition of life insurance elected for this contract
-is the
-{{#DefnLifeInsIsGPT}}
-    guideline premium test. The guideline single premium
-    is ${{InitGSP}}
-    and the guideline level premium
-    is ${{InitGLP}}.
-{{/DefnLifeInsIsGPT}}
-{{^DefnLifeInsIsGPT}}
-    cash value accumulation test.
-{{/DefnLifeInsIsGPT}}
+    {{FnDefnLifeIns}}
 </p>
 
 <p>
-{{InsCoName}}
-{{RejectPremiumFootnote}}
+    {{RejectPremiumFootnote}}
 </p>
 
 <p>
@@ -81,54 +59,12 @@ Account values, cash surrender values, and death benefits
 are illustrated as of the end of the year.
 </p>
 
-<!-- PDF !! MecFootnote -->
-{{!
-PDF !! The 'MecYearIs0' logic below is poor and should be reworked--see:
-    https://lists.nongnu.org/archive/html/lmi/2019-02/msg00000.html
-}}
 <p>
 PLEASE READ THE FOLLOWING IMPORTANT TAX DISCLOSURE
 <br>
-The initial 7-pay premium limit is ${{InitSevenPayPrem}}.
-As illustrated, this contract
-{{#IsMec}}
-    fails
-{{/IsMec}}
-{{^IsMec}}
-    passes
-{{/IsMec}}
-the seven-pay test defined in Section 7702A
-of the Internal Revenue Code and therefore
-{{#IsMec}}
-    {{^MecYearIs0}}
-        becomes a Modified Endowment Contract (MEC) in policy year
-        {{MecYearPlus1}}.
-    {{/MecYearIs0}}
-    {{#MecYearIs0}}
-        is a Modified Endowment Contract (MEC).
-    {{/MecYearIs0}}
-    As a MEC, any loans or withdrawals are taxed to the extent
-    of any gain in the contract, and an additional 10% penalty
-    tax will apply to the taxable portion of the loan
-    or withdrawal.
-{{/IsMec}}
-{{^IsMec}}
-    is not a Modified Endowment Contract (MEC).
-    Subsequent changes in the contract, including but not limited
-    to increases and decreases in premiums or benefits, may cause
-    the contract to be retested and may result in the contract
-    becoming a MEC.
-{{/IsMec}}
+    {{MecFootnote}}
 </p>
 
-<!-- PDF !! FnNotTaxAdvice -->
 <p>
-<b>
-The information contained in this illustration is not written
-or intended as tax or legal advice. Neither {{InsCoShortName}} its
-subsidiaries, employees or representatives are authorized to give tax
-or legal advice. For more information pertaining
-to the tax consequences of purchasing or owning this {{ContractName}},
-consult with your own independent tax or legal counsel.
-</b>
+    {{FnNotTaxAdvice}}
 </p>
diff --git a/reg_d_group_narr_summary2.mst b/reg_d_group_narr_summary2.mst
index bf35e3a..2ef950d 100644
--- a/reg_d_group_narr_summary2.mst
+++ b/reg_d_group_narr_summary2.mst
@@ -29,10 +29,8 @@
 {{GuarMortalityFootnote}}
 </p>
 
-<!-- PDF !! LoanFootnote -->
 <p>
-The loan interest rate may be fixed or adjustable as elected
-by the policy owner.
+    {{LoanFootnote}}
 </p>
 
 <p>
@@ -45,21 +43,8 @@ by the policy owner.
 {{/UseExperienceRating}}
 </p>
 
-<!-- PDF !! FnPpMemorandum -->
 <p>
-<b>
-This illustration may only be used when preceded or accompanied
-by the offering memorandum for {{PolicyLegalName}} ({{PolicyMktgName}})
-insurance contract and its underlying investment choices.
-For a complete listing of the underlying investment choices,
-please refer to the offering memorandum. Before purchasing
-a variable life insurance contract, investors should
-carefully consider the investment objectives, risks, charges
-and expenses of the variable life insurance contract
-and its underlying investment choices. Please read
-the offering memorandum carefully before investing
-or sending money.
-</b>
+    <b>{{FnPpMemorandum}}</b>
 </p>
 
 {{#HasTerm}}
@@ -78,35 +63,7 @@ or sending money.
 
 {{FnPartialMortality}}
 
-<!-- PDF !! MortalityBlendFootnote -->
-{{#GenderBlended}}
-    <p>
-    {{MortalityBlendFootnote}}
-    Custom blend assumptions:
-    {{#SmokerBlended}}
-        nontobacco = {{NonsmokerProportion}};
-    {{/SmokerBlended}}
-    {{^SmokerBlended}}
-        no blending by tobacco use;
-    {{/SmokerBlended}}
-    male = {{MaleProportion}}.
-    </p>
-{{/GenderBlended}}
-{{^GenderBlended}}
-    {{#SmokerBlended}}
-        <p>
-        {{MortalityBlendFootnote}}
-        Custom blend assumptions:
-        nontobacco = {{NonsmokerProportion}};
-        {{#GenderBlended}}
-            male = {{MaleProportion}}.
-        {{/GenderBlended}}
-        {{^GenderBlended}}
-            no blending by gender.
-        {{/GenderBlended}}
-      </p>
-    {{/SmokerBlended}}
-{{/GenderBlended}}
+{{MortalityBlendFootnote}}
 
 <p>
 The state of issue is {{StateOfJurisdiction}}.
@@ -120,39 +77,14 @@ SEPARATE ACCOUNT
 {{HypotheticalRatesFootnote}}
 </p>
 
-<!-- PDF !! FnImf -->
 <p>
-This illustration is based on total Separate Account fund expenses
-of {{TotalIMF[0]}}.
+    {{FnImf}}
 </p>
 
-<!-- PDF !! FnNotTaxAdvice -->
 <p>
-<b>
-This illustration may not reflect your actual tax
-and accounting consequences and is not intended as tax advice
-nor may it be relied on for purposes of avoiding any federal
-tax penalties. Consult professional tax advisors for tax advice.
-</b>
+    {{FnNotTaxAdvice}}
 </p>
 
-<!-- PDF !! PlacementAgentFootnote -->
 <p>
-Placement Agents:
-{{CoUnderwriter}} serves as the
-placement agent for contracts sold by its registered
-representatives.
-&nbsp;{{MainUnderwriter}}
-serves as the placement agent for contracts sold by registered
-representatives of other broker-dealers that have entered into
-distribution agreements with
-&nbsp;{{MainUnderwriter}}.
-</p>
-<p>
-{{CoUnderwriter}} and
-&nbsp;{{MainUnderwriter}} are
-subsidiaries of {{InsCoName}}
-({{InsCoShortName}}) and are
-located at {{InsCoStreet}}.
-</p>
+    {{PlacementAgentFootnote}}
 </p>
diff --git a/reg_d_indiv_cover_page.mst b/reg_d_indiv_cover_page.mst
index 8a09bd0..1c3d698 100644
--- a/reg_d_indiv_cover_page.mst
+++ b/reg_d_indiv_cover_page.mst
@@ -84,7 +84,7 @@ Date Prepared: {{DatePrepared}}
 
 <font size="-1">
 
-<!-- PDF !! HypotheticalRatesFootnote -->
+<!-- PDF !! HypotheticalRatesHeader -->
 <p>
 The purpose of this illustration is to show how hypothetical rates
 of return will affect policy account value. These hypothetical
@@ -94,19 +94,8 @@ than the hypothetical rates and in all likelihood will vary 
from
 year to year.
 </p>
 
-<!-- PDF !! FnProspectus -->
 <p>
-<b>
-This material must be preceded or accompanied by the current
-Confidential Private Placement Memorandum for {{PolicyMktgName}}
-and the current prospectuses (or summary prospectuses,
-if available) and private placement memoranda
-for its underlying investment choices. Investors should
-carefully consider the investment objectives, risks,
-charges and expenses of the policy and its underlying investment
-choices. Please read the prospectuses and private placement
-memoranda carefully before investing or sending money.
-</b>
+    <b>{{FnProspectus}}</b>
 </p>
 
 <p>
@@ -114,7 +103,7 @@ memoranda carefully before investing or sending money.
 </p>
 
 <p>
-Placement Agents: &nbsp; {{PlacementAgentFootnote}}
+    {{PlacementAgentFootnote}}
 </p>
 
 <p>
diff --git a/reg_d_indiv_header.mst b/reg_d_indiv_header.mst
index 50bfd6c..ea28e5b 100644
--- a/reg_d_indiv_header.mst
+++ b/reg_d_indiv_header.mst
@@ -36,7 +36,7 @@
 <br></br>
 <br></br>
 
-<!-- PDF !! HypotheticalRatesFootnote -->
+<!-- PDF !! HypotheticalRatesHeader -->
 The purpose of the Illustration is to show how the performance of the
 underlying separate account divisions could affect the policy's
 account values and death benefits. This Illustration is hypothetical
diff --git a/reg_d_indiv_notes1.mst b/reg_d_indiv_notes1.mst
index 8d7db3a..8120ca9 100644
--- a/reg_d_indiv_notes1.mst
+++ b/reg_d_indiv_notes1.mst
@@ -32,19 +32,11 @@
 <font size="+1"><b><u>The Illustration</u></b></font>
 </p>
 
-<!-- PDF !! FnPpMemorandum -->
 <p>
-This illustration is not a policy or an offer or solicitation
-to purchase a policy. Offers are made only through the
-Confidential Private Placement Memorandum ("the PPM") for {{PolicyMktgName}}.
+    {{FnPpMemorandum}}
 </p>
 
 <p>
-  {{! PDF !! Multiline text wanted here--see:
-        https://lists.nongnu.org/archive/html/lmi/2018-02/msg00118.html
-      Similarly, 'HypotheticalRatesFootnote' should be split into four
-      paragraphs, and 'LoanAndWithdrawalFootnote' into two.
-  }}
   {{ProductDescription}}
 </p>
 
@@ -55,16 +47,8 @@ Confidential Private Placement Memorandum ("the PPM") for 
{{PolicyMktgName}}.
 <font size="+1"><b><u>The Policy</u></b></font>
 </p>
 
-<!-- PDF !! FnPpAccreditedInvestor -->
 <p>
-<b>Policy Requirements:</b>
-This policy is only available to persons who are deemed
-accredited investors and qualified purchasers under applicable
-federal securities laws. The policy owner must be able to bear
-the risk of loss of the entire investment in the policy. The
-policy owner must be familiar with and understand the fundamental
-risks and financial hazards of investing in the policy, and be
-willing to represent as such to {{InsCoShortName}}.
+    {{FnPpAccreditedInvestor}}
 </p>
 
 <p>
@@ -135,12 +119,8 @@ willing to represent as such to {{InsCoShortName}}.
 <b>Policy Year:</b> &nbsp; {{PolicyYearFootnote}}
 </p>
 
-<!-- PDF !! FnPpLoads -->
 <p>
-<b>Premium Loads:</b> The applicable state premium tax, deferred acquisition
-cost tax charge, sales load (if any), separate account administrative charge
-(if any), and other charges incurred as a result of retaining an unaffiliated
-money manager (if any).
+<b>Premium Loads:</b> &nbsp; {{FnPpLoads}}
 </p>
 
 <p>
@@ -169,20 +149,6 @@ money manager (if any).
 <font size="+1"><b><u>Withdrawals and Policy Loans</u></b></font>
 </p>
 
-<!-- PDF !! subsume the next paragraph into LoanAndWithdrawalFootnote -->
-{{!
-    PDF !! 'MaxAnnCurrLoanDueRate': loan rate actually can vary by year,
-    so text should say that the fixed loan rate is "guaranteed never
-    to exceed" this value.
-}}
-<p>
-If applicable, withdrawals and policy loans will appear on a
-supplemental report at the end of the illustration. Withdrawals
-and policy loans are assumed to be taken at the beginning of the
-applicable policy year. The illustration and supplemental report
-reflect a fixed policy loan interest rate of {{MaxAnnCurrLoanDueRate}}.
-</p>
-
 <p>
 {{LoanAndWithdrawalFootnote}}
 </p>
diff --git a/reg_d_indiv_notes2.mst b/reg_d_indiv_notes2.mst
index 120d305..8d181c5 100644
--- a/reg_d_indiv_notes2.mst
+++ b/reg_d_indiv_notes2.mst
@@ -32,59 +32,16 @@
 <font size="+1"><b><u>Important Tax Disclosures</u></b></font>
 </p>
 
-<!-- PDF !! FnDefnLifeIns -->
 <p>
-The definition of life insurance elected for this policy is
-{{#DefnLifeInsIsGPT}}
-    the guideline premium test. The guideline single premium
-    is ${{InitGSP}}
-    and the guideline level premium
-    is ${{InitGLP}}.
-{{/DefnLifeInsIsGPT}}
-{{^DefnLifeInsIsGPT}}
-    the cash value accumulation test.
-{{/DefnLifeInsIsGPT}}
+    {{FnDefnLifeIns}}
 </p>
 
-<!-- PDF !! MecFootnote -->
 <p>
-The initial 7-pay premium limit is ${{InitSevenPayPrem}}.
-As illustrated, this policy
-{{#IsMec}}
-    fails
-{{/IsMec}}
-{{^IsMec}}
-    passes
-{{/IsMec}}
-the seven-pay test defined in Section 7702A
-of the Internal Revenue Code and therefore
-{{#IsMec}}
-    becomes a Modified Endowment Contract (MEC)
-    in policy year {{MecYearPlus1}}.
-{{/IsMec}}
-{{^IsMec}}
-    is not a Modified Endowment Contract (MEC). Subsequent changes
-    to the policy, including but not limited to increases
-    and decreases in premiums or benefits, may cause the policy
-    to be retested and may result in the policy becoming a MEC.
-{{/IsMec}}
-</p>
-<p>
-If a policy is a MEC, withdrawals and policy loans are taxed to
-the extent of any gain in the policy, and an additional penalty
-tax may apply to the taxable portion of the distribution.
+    {{MecFootnote}}
 </p>
 
-<!-- PDF !! FnNotTaxAdvice -->
 <p>
-<b>
-The information contained in this illustration is not written
-or intended as tax or legal advice. Neither {{InsCoShortName}} its
-subsidiaries, employees or representatives are authorized to give tax
-or legal advice. For more information pertaining
-to the tax consequences of purchasing or owning this {{ContractName}},
-consult with your own independent tax or legal counsel.
-</b>
+    {{FnNotTaxAdvice}}
 </p>
 
 {{^IsInforce}}
diff --git a/set_toolchain.sh b/set_toolchain.sh
index 3de24cf..c45c6ad 100755
--- a/set_toolchain.sh
+++ b/set_toolchain.sh
@@ -27,8 +27,9 @@
 # used in production if they were unset or null beforehand. They can
 # be overridden at the command line, e.g.:
 #
-#   LMI_COMPILER=gcc ; LMI_TRIPLET=i686-w64-mingw32   ; . 
/opt/lmi/src/lmi/set_toolchain.sh
-#   LMI_COMPILER=gcc ; LMI_TRIPLET=x86_64-w64-mingw32 ; . 
/opt/lmi/src/lmi/set_toolchain.sh
+#   LMI_COMPILER=gcc ; LMI_TRIPLET=i686-w64-mingw32    ; . 
/opt/lmi/src/lmi/set_toolchain.sh
+#   LMI_COMPILER=gcc ; LMI_TRIPLET=x86_64-w64-mingw32  ; . 
/opt/lmi/src/lmi/set_toolchain.sh
+#   LMI_COMPILER=gcc ; LMI_TRIPLET=x86_64-pc-linux-gnu ; . 
/opt/lmi/src/lmi/set_toolchain.sh
 #
 # Implemented as a function that runs and then erases itself, so that
 # sourcing this script changes the environment only as intended. This
@@ -149,8 +150,9 @@ case "$LMI_COMPILER" in
 esac
 
 case "$LMI_TRIPLET" in
-    (i686-w64-mingw32)   ;;
-    (x86_64-w64-mingw32) ;;
+    (i686-w64-mingw32)    ;;
+    (x86_64-w64-mingw32)  ;;
+    (x86_64-pc-linux-gnu) printf '%s\n' "GUI build not yet supported." > 
/dev/tty ;;
     (*)
         printf '%s\n' "Changed nothing because host triplet '$LMI_TRIPLET' is 
untested."
         return 3;
diff --git a/workhorse.make b/workhorse.make
index 3448bc8..9b2aa89 100644
--- a/workhorse.make
+++ b/workhorse.make
@@ -156,6 +156,7 @@ else ifeq (7.3.0,$(gnu_cpp_version))
 else ifeq (8.1.0,$(gnu_cpp_version))
 else ifeq (8.2.0,$(gnu_cpp_version))
 else ifeq (8.3.0,$(gnu_cpp_version))
+else ifeq (9,$(gnu_cpp_version))
 else ifeq (9.3.0,$(gnu_cpp_version))
 else ifeq (10.0,$(gnu_cpp_version))
 else
@@ -172,6 +173,7 @@ else ifeq (7.3.0,$(gnu_cxx_version))
 else ifeq (8.1.0,$(gnu_cxx_version))
 else ifeq (8.2.0,$(gnu_cxx_version))
 else ifeq (8.3.0,$(gnu_cxx_version))
+else ifeq (9,$(gnu_cxx_version))
 else ifeq (9.3.0,$(gnu_cxx_version))
 else ifeq (10.0,$(gnu_cxx_version))
 else
@@ -457,7 +459,6 @@ gcc_common_warnings := \
   -Wformat-signedness \
   -Wformat-y2k \
   -Wimport \
-  -Winit-self \
   -Winvalid-pch \
   -Wlogical-op \
   -Wmissing-include-dirs \
@@ -476,7 +477,6 @@ gcc_common_warnings := \
   -Wunreachable-code \
   -Wunused-macros \
   -Wvector-operation-performance \
-  -Wwrite-strings \
   -Wno-parentheses \
 
 # Warnings that are not generally useful.
@@ -494,6 +494,7 @@ gcc_c_warnings := \
   $(gcc_common_warnings) \
   -Wbad-function-cast \
   -Wc++-compat \
+  -Winit-self \
   -Wjump-misses-init \
   -Wmissing-prototypes \
   -Wnested-externs \
@@ -501,6 +502,7 @@ gcc_c_warnings := \
   -Wstrict-prototypes \
   -Wtraditional-conversion \
   -Wunsuffixed-float-constants \
+  -Wwrite-strings \
 
 gcc_cxx_warnings := \
   $(cxx_standard) \
@@ -558,6 +560,7 @@ $(boost_filesystem_objects): gcc_common_extra_warnings += \
   -Wno-old-style-cast \
   -Wno-unused-macros \
   -Wno-unused-parameter \
+  -Wno-useless-cast \
   -Wno-zero-as-null-pointer-constant \
 
 $(boost_regex_objects): gcc_common_extra_warnings += \
@@ -647,22 +650,6 @@ CXX_WARNINGS = \
 
 
################################################################################
 
-# Flags for tuning gcc.
-
-# As this is written in 2012, lmi is often built on machines with less
-# RAM per core than gcc wants. Experiments show that these flags cut
-# gcc's RAM appetite by fifty percent, in return for a ten-percent
-# speed penalty that can be overcome by increasing parallelism. There
-# seems to be no need for them with gcc-4.x, which uses less RAM.
-
-ifeq (gcc,$(LMI_COMPILER))
-  ifeq (3.4.5,$(gcc_version))
-    ggc_flags := --param ggc-min-expand=25 --param ggc-min-heapsize=32768
-  endif
-endif
-
-################################################################################
-
 # Build type governs
 #  - optimization flags
 #  - gprof
@@ -765,9 +752,9 @@ wx_pdfdoc_ldflags := \
 
 # Flags.
 
-# Define FLAGS variables recursively for greater flexibility: e.g., so
-# that they reflect downstream conditional changes to the variables
-# they're composed from.
+# Define uppercase FLAGS recursively for greater flexibility: e.g., so
+# that they reflect downstream conditional changes to the lowercase
+# (and often immediately-expanded) variables they're composed from.
 
 debug_flag := -ggdb
 
@@ -779,15 +766,37 @@ ifeq (3.4.2,$(gcc_version))
   gcc_version_specific_warnings := -Wno-uninitialized
 endif
 
+# 'c_l_flags' are to be used in both compiler and linker commands.
+# The gprof '-pg' flag is one example. Another is '-fPIC', which
+# pc-linux-gnu requires for '-shared':
+#   https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html#DOCF1
+# Yet another is 'debug_flag'.
+
+c_l_flags := $(debug_flag) $(gprof_flag)
+
+ifeq (x86_64-pc-linux-gnu,$(LMI_TRIPLET))
+  c_l_flags += -fPIC
+endif
+
+# As this is written in 2012, lmi is often built on machines with less
+# RAM per core than gcc wants. Experiments show that these flags cut
+# gcc's RAM appetite by fifty percent, in return for a ten-percent
+# speed penalty that can be overcome by increasing parallelism. There
+# seems to be no need for them with gcc-4.x, which uses less RAM.
+
+ifeq (gcc,$(LMI_COMPILER))
+  ifeq (3.4.5,$(gcc_version))
+    ggc_flags := --param ggc-min-expand=25 --param ggc-min-heapsize=32768
+  endif
+endif
+
 CFLAGS = \
-  $(ggc_flags) $(debug_flag) $(optimization_flag) $(gprof_flag) \
+  $(ggc_flags) $(optimization_flag) $(c_l_flags) \
 
 CXXFLAGS = \
-  $(ggc_flags) $(debug_flag) $(optimization_flag) $(gprof_flag) \
+  $(ggc_flags) $(optimization_flag) $(c_l_flags) \
 
-LDFLAGS = \
-  $(gprof_flag) \
-  -Wl,-Map,$@.map \
+LDFLAGS = $(c_l_flags) -Wl,-Map,$@.map \
 
 # Explicitly disable the infelicitous auto-import default. See:
 #   http://article.gmane.org/gmane.comp.gnu.mingw.user/19758
@@ -1065,12 +1074,12 @@ shared_data_files = \
   qx_ins.dat \
   qx_ins.ndx \
   sample.dat \
-  sample.database \
-  sample.funds \
+  sample*.database \
+  sample*.funds \
   sample.ndx \
-  sample.policy \
-  sample.rounding \
-  sample.strata \
+  sample*.policy \
+  sample*.rounding \
+  sample*.strata \
 
 .PHONY: archive_shared_data_files
 archive_shared_data_files:



reply via email to

[Prev in Thread] Current Thread [Next in Thread]