From c09ba1a1a43b3a3761eb3ed1351a7b6780aeb73a Mon Sep 17 00:00:00 2001 From: Peizhao Ou Date: Tue, 7 Apr 2015 12:10:02 -0700 Subject: [PATCH] add write up --- writeup/.#implementation.tex.1.9 | 163 ++ writeup/.#introduction.tex.1.24 | 222 +++ writeup/.#introduction.tex.1.26 | 223 +++ writeup/.#memorymodel.tex.1.1 | 101 + writeup/.#specification.tex.1.47 | 419 +++++ writeup/.nfs00000000020c394600000523 | Bin 0 -> 134482 bytes writeup/CVS/Entries | 19 + writeup/CVS/Repository | 1 + writeup/CVS/Root | 1 + writeup/abstract.tex | 19 + writeup/conclusion.tex | 11 + writeup/confstrs-abbrv.bib | 173 ++ writeup/confstrs-long.bib | 180 ++ writeup/evaluation.tex | 304 +++ writeup/example.tex | 165 ++ writeup/figures/CVS/Entries | 42 + writeup/figures/CVS/Repository | 1 + writeup/figures/CVS/Root | 1 + writeup/figures/fence_sw.dot | 20 + writeup/figures/fence_sw2.dot | 14 + writeup/figures/fence_sw_r_collapse.dot | 18 + writeup/figures/fence_sw_r_collapse2.dot | 14 + writeup/figures/fence_sw_w_collapse.dot | 18 + writeup/figures/fence_sw_w_collapse2.dot | 14 + writeup/figures/ff_sc_rf.dot | 18 + writeup/figures/ff_sc_rf2.dot | 18 + writeup/figures/fw_sc_rf.dot | 16 + writeup/figures/fw_sc_rf2.dot | 16 + writeup/figures/lockhistory.pdf | Bin 0 -> 19791 bytes writeup/figures/rcuhistory.odg | Bin 0 -> 14994 bytes writeup/figures/rcuhistory.pdf | Bin 0 -> 20096 bytes writeup/figures/release_seq.pdf | 344 ++++ writeup/figures/rmw_atomicity.dot | 12 + writeup/figures/rmw_atomicity2.dot | 13 + writeup/figures/rmw_mo.dot | 9 + writeup/figures/rmw_mo2.dot | 8 + writeup/figures/rr_mo.dot | 13 + writeup/figures/rr_mo2.dot | 8 + writeup/figures/rw_mo.dot | 11 + writeup/figures/rw_mo2.dot | 12 + writeup/figures/sc_mo.dot | 9 + writeup/figures/sc_mo2.dot | 8 + writeup/figures/sc_wr_mo.dot | 13 + writeup/figures/sc_wr_mo2.dot | 13 + writeup/figures/specdesign.pdf | Bin 0 -> 22332 bytes writeup/figures/specworkflow.pdf | Bin 0 -> 14072 bytes writeup/figures/wf_sc_rf.dot | 16 + writeup/figures/wf_sc_rf2.dot | 16 + writeup/figures/workflow.pdf | Bin 0 -> 16034 bytes writeup/figures/wr_mo.dot | 13 + writeup/figures/wr_mo2.dot | 13 + writeup/figures/ww_mo.dot | 9 + writeup/figures/ww_mo2.dot | 8 + .../figures/ww_sc_fence_first_collapse.dot | 17 + .../figures/ww_sc_fence_first_collapse2.dot | 14 + writeup/figures/ww_sc_fence_mo.dot | 18 + writeup/figures/ww_sc_fence_mo2.dot | 14 + .../figures/ww_sc_fence_second_collapse.dot | 17 + .../figures/ww_sc_fence_second_collapse2.dot | 14 + writeup/formalization.tex | 41 + writeup/implementation.tex | 151 ++ writeup/introduction.tex | 226 +++ writeup/issta15_submission.pdf | Bin 0 -> 259914 bytes writeup/makefile | 94 + writeup/memorymodel.tex | 102 + writeup/paper.bib | 774 ++++++++ writeup/paper.tex | 182 ++ writeup/related.tex | 133 ++ writeup/sig-alternate.cls | 1649 +++++++++++++++++ writeup/speccfg.tex | 17 + writeup/specification.tex | 416 +++++ writeup/spell.lst | 99 + writeup/technical.tex | 1 + 73 files changed, 6738 insertions(+) create mode 100644 writeup/.#implementation.tex.1.9 create mode 100644 writeup/.#introduction.tex.1.24 create mode 100644 writeup/.#introduction.tex.1.26 create mode 100644 writeup/.#memorymodel.tex.1.1 create mode 100644 writeup/.#specification.tex.1.47 create mode 100644 writeup/.nfs00000000020c394600000523 create mode 100644 writeup/CVS/Entries create mode 100644 writeup/CVS/Repository create mode 100644 writeup/CVS/Root create mode 100644 writeup/abstract.tex create mode 100644 writeup/conclusion.tex create mode 100644 writeup/confstrs-abbrv.bib create mode 100644 writeup/confstrs-long.bib create mode 100644 writeup/evaluation.tex create mode 100644 writeup/example.tex create mode 100644 writeup/figures/CVS/Entries create mode 100644 writeup/figures/CVS/Repository create mode 100644 writeup/figures/CVS/Root create mode 100644 writeup/figures/fence_sw.dot create mode 100644 writeup/figures/fence_sw2.dot create mode 100644 writeup/figures/fence_sw_r_collapse.dot create mode 100644 writeup/figures/fence_sw_r_collapse2.dot create mode 100644 writeup/figures/fence_sw_w_collapse.dot create mode 100644 writeup/figures/fence_sw_w_collapse2.dot create mode 100644 writeup/figures/ff_sc_rf.dot create mode 100644 writeup/figures/ff_sc_rf2.dot create mode 100644 writeup/figures/fw_sc_rf.dot create mode 100644 writeup/figures/fw_sc_rf2.dot create mode 100644 writeup/figures/lockhistory.pdf create mode 100644 writeup/figures/rcuhistory.odg create mode 100644 writeup/figures/rcuhistory.pdf create mode 100644 writeup/figures/release_seq.pdf create mode 100644 writeup/figures/rmw_atomicity.dot create mode 100644 writeup/figures/rmw_atomicity2.dot create mode 100644 writeup/figures/rmw_mo.dot create mode 100644 writeup/figures/rmw_mo2.dot create mode 100644 writeup/figures/rr_mo.dot create mode 100644 writeup/figures/rr_mo2.dot create mode 100644 writeup/figures/rw_mo.dot create mode 100644 writeup/figures/rw_mo2.dot create mode 100644 writeup/figures/sc_mo.dot create mode 100644 writeup/figures/sc_mo2.dot create mode 100644 writeup/figures/sc_wr_mo.dot create mode 100644 writeup/figures/sc_wr_mo2.dot create mode 100644 writeup/figures/specdesign.pdf create mode 100644 writeup/figures/specworkflow.pdf create mode 100644 writeup/figures/wf_sc_rf.dot create mode 100644 writeup/figures/wf_sc_rf2.dot create mode 100644 writeup/figures/workflow.pdf create mode 100644 writeup/figures/wr_mo.dot create mode 100644 writeup/figures/wr_mo2.dot create mode 100644 writeup/figures/ww_mo.dot create mode 100644 writeup/figures/ww_mo2.dot create mode 100644 writeup/figures/ww_sc_fence_first_collapse.dot create mode 100644 writeup/figures/ww_sc_fence_first_collapse2.dot create mode 100644 writeup/figures/ww_sc_fence_mo.dot create mode 100644 writeup/figures/ww_sc_fence_mo2.dot create mode 100644 writeup/figures/ww_sc_fence_second_collapse.dot create mode 100644 writeup/figures/ww_sc_fence_second_collapse2.dot create mode 100644 writeup/formalization.tex create mode 100644 writeup/implementation.tex create mode 100644 writeup/introduction.tex create mode 100644 writeup/issta15_submission.pdf create mode 100644 writeup/makefile create mode 100644 writeup/memorymodel.tex create mode 100644 writeup/paper.bib create mode 100644 writeup/paper.tex create mode 100644 writeup/related.tex create mode 100644 writeup/sig-alternate.cls create mode 100644 writeup/speccfg.tex create mode 100644 writeup/specification.tex create mode 100644 writeup/spell.lst create mode 100644 writeup/technical.tex diff --git a/writeup/.#implementation.tex.1.9 b/writeup/.#implementation.tex.1.9 new file mode 100644 index 0000000..a741b61 --- /dev/null +++ b/writeup/.#implementation.tex.1.9 @@ -0,0 +1,163 @@ +\mysection{Implementation}\label{sec:implementation} + +The goal of the \TOOL specification language is to +enable developers to write specifications against which concurrent data structures can be tested. +We can ensure a concurrent data structure is correct with +respect to an equivalent sequential data structure if for each +execution of the concurrent data structure, the equivalent sequential +history for the equivalent sequential data structure yields the same +results. + +The execution space for many concurrent data +structures is unbounded, meaning that in practice we cannot +verify correctness by checking individual executions. However, the +specifications can be used for unit testing. In practice, +many bugs can be exposed by model checking unit tests for +concurrent data structures. We have implemented the \TOOL checker as a +unit testing tool built upon the \cdschecker framework. The \TOOL checker +can exhaustively explore all behaviors for unit tests and provide +developers with diagnostic reports for executions that violate their +specification. + + +\mysubsection{Model Checker Framework} + +The \TOOL checker takes as input a complete execution trace from the +\cdschecker model checker. The \cdschecker framework operates at the abstraction level of +individual atomic operations and thus has neither information about method +calls nor which atomic operations serve as ordering points. Thus, we +extend the framework by adding {\it annotation} operations to +\cdschecker's traces, which record the necessary information to check the specifications +but have no effect on other operations. The \TOOL compiler +inserts code to generate the annotation actions to communicate to the \TOOL checker +plugin the critical events for checking the \TOOL specification. +These annotation actions then appear in \cdschecker's list of atomic +operations and make it convenient for \TOOL to construct +a sequential history from the execution because for any given method +call, its invocation event, its ordering points, and its response event are +sequentially ordered in the list. + +\mysubsection{Specification Compiler} + +The specification compiler translates an annotated +C/C++ program into an instrumented C/C++ program that will generate +execution traces containing the dynamic information needed to check +assertions and construct the sequential history. We next +describe the type of annotation actions that the \TOOL compiler +inserts into the instrumented program. + +\mypara{\bf Ordering Points:} Ordering points have a conditional guard expression +and a label. Potential ordering point annotation actions are +inserted immediately after the atomic operation that serves as +the potential ordering point. Ordering point check annotation actions are +inserted where they appear. + +\mypara{\bf Method Boundary:} To identify a method's boundaries, \TOOL +inserts {\it method\_begin} and {\it method\_end} annotations at the +beginning and end of methods. + +\mypara{\bf Sequential States and Methods:} Since checking occurs +after \cdschecker has completed an execution, the annotation +actions stores the values of any variables in the concurrent data +structure that the annotations reference. + +\mypara{\bf Side Effects and Assertions:} Side effects and assertions perform +their checks after an execution. The side effects and assertions are compiled +into methods and the equivalent sequential data structure's states are accessible to these methods. +With this encapsulation, +the \TOOL checker simply calls these functions to implement the side effects and assertions. + +\mypara{\bf Synchronization Checks:} The \TOOL checker performs +synchronization checks in two parts: compiling the rules and runtime data +collection. First, the \TOOL compiler numbers all methods and happens-before +checks uniquely. For example, the rule ``\code{Update->Read}'' can be represented as (1, 0, 2, 0), +which means instances of method 1 that satisfy condition 0 should {\it + synchronize with} instances method 2 that satisfy condition 0. In this case, + condition 0 means \code{true}. Then, +the \TOOL compiler generates code that communicates the +synchronization rules by passing an array of integer pairs. Runtime +collection is then implemented by performing the condition check at +each method invocation or response and then passing the method number +and happens before condition if the check is satisfied. + +\mysubsection{Dynamic Checking} + +At this point, we have an execution trace with the necessary +annotations to construct a sequential history and to check +the execution's correctness. However, before constructing the +sequential history, the \TOOL plugin first collects +the necessary information for each method call, which is the {\it + method\_begin} annotation, the ordering point annotations, the +happens-before checks, and the {\it method\_end} annotations. Since +all of the operations in the trace have thread +identifiers it is straightforward to extract the operations between the {\it + method\_begin} and {\it method\_end} annotations. + +\mypara{\bf Reorder Method Calls:} As discussed above, determining the +ordering of the ordering points is non-trivial under the +C/C++ memory model. This can be complicated by the fact +that the C/C++ memory model allows atomic loads to read from atomic +stores that appear later in the trace and that we do not maintain program order in our +correctness model. + +However, we can still leverage the reads-from relation and the modification-order +relation to order the ordering points that appear in typical data +structures. \TOOL uses the following rules to generate an ordering-point +ordering $\reltext{opo}$ relation on ordering points. Given two operations $X$ and $Y$ that are both ordering points: + +\begin{enumerate} +\item {\bf Reads-From:} $X \xrightarrow{rf} Y \Rightarrow X \xrightarrow{opo} Y$. + +\item {\bf Modification Order (write-write):} $X \xrightarrow{mo} Y \Rightarrow X \xrightarrow{opo} Y$. + +\item {\bf Modification Order (read-write):} $A \xrightarrow{mo} Y \ \wedge \ A \xrightarrow{rf} X \Rightarrow X \xrightarrow{opo} Y$. + +\item {\bf Modification Order (write-read):} $X \xrightarrow{mo} B \ \wedge \ B \xrightarrow{rf} Y \Rightarrow X \xrightarrow{opo} Y$. + +\item {\bf Modification Order (read-read):} $A \xrightarrow{mo} B \ \wedge \ A \xrightarrow{rf} X \ \wedge \ B \xrightarrow{rf} Y \Rightarrow X \xrightarrow{opo} Y$. + +\end{enumerate} + +\mypara{\bf Generating the Reordering:} +The \TOOL checker first builds an execution graph where the nodes are +method calls and the edges represent the +$\reltext{opo}$ ordering of the ordering points of the methods that +correspond to the source and destination nodes. Assuming the absence +of cycles in the execution graph, +the $\reltext{opo}$ ordering is used to generate the sequential history. +If two methods are not ordered by the +$\reltext{opo}$ order, we assume that they commute and select an +arbitrary ordering for the methods. The \TOOL checker +topologically sorts the graph to generate the equivalent sequential +execution. + +When \TOOL fails to order ordering points, the operations often commute. Thus, +if multiple histories satisfy the constraints of \reltext{opo}, we generally +pick a random one for most data structures. However, when those operations +do not commute, we provide developers with different options: (1) they can +add additional ordering points to allow \TOOL to order the two nodes or +(2) they run \TOOL in either of the following modes: (a) \textit{loosely +exhaustive} mode --- \TOOL explores +all possible histories and only requires some history to be correct or +(b) \textit{strictly exhaustive} mode --- \TOOL explores all possible histories and requires all histories to +be correct. With these options, developers are able to balance the +tradeoff between specifying more ordering points and the searching +space. For example, for a single producer single +consumer queue based on a linked-list (maintaing \code{head} and \code{tail} pointer), if we only +specify the update and load of the next field of a linked-list node as ordering points for +\code{enqueue} and \code{dequeue}, \TOOL will fail to order a dequeue +returning \code{NULL} and another enqueue because dequeue does not have the +ordering point of loading the next field. In this case, developers can either +add extra ordering points to order the dequeue before the enqueue or simply run it in the +\textit{loosely exhaustive} mode and that mode will produce at least one correct +history. + +\mypara{\bf Check Synchronization Properties:} Synchronization properties are +specified using the IDs and conditions of method calls, and we have that information +ready after \TOOL constructs the sequential history and checks the preconditions +and postconditions. For two specific method calls $c_1$ and $c_2$, we can ensure +$c_1$ synchronizes with $c_2$ by ensuring the annotation \code{c1\_begin} +happens-before the annotation \code{c2\_end} because any operations +sequenced-before \code{c1\_begin} should happen-before any operations +sequenced-after \code{c2\_end} according to the C/C++11 memory model. + diff --git a/writeup/.#introduction.tex.1.24 b/writeup/.#introduction.tex.1.24 new file mode 100644 index 0000000..02c4ff7 --- /dev/null +++ b/writeup/.#introduction.tex.1.24 @@ -0,0 +1,222 @@ +\mysection{Introduction}\label{sec:introduction} + +Concurrent data structure design can improve scalability by supporting +multiple simultaneous operations, reducing memory coherence traffic, and reducing the time taken by an +individual data structure operation. Researchers have developed many concurrent +data structure designs with these goals~\cite{rcu, +lockfreequeue}. Concurrent data structures often use sophisticated techniques +including low-level atomic instructions (e.g., compare and +swap), careful reasoning about the order of loads and +stores, and fine-grained locking. For example, while the standard Java hash +table implementation can limit scalability to a handful of cores, +more sophisticated concurrent hash tables can scale to many hundreds of +cores~\cite{javaConcurrentHashMap}. + +The C/C++ standard committee extended the C and C++ languages with +support for low-level atomic operations in the C/C++11 +standard~\cite{cpp11spec, c11spec, boehmpldi} to enable developers to +write portable implementations of concurrent data structures. To support the relaxations typically performed by compilers and processors, +the +C/C++ memory model provides weaker semantics than sequential +consistency~\cite{scmemorymodel} and as a result, correctly using +these operations is challenging. Developers must not only +reason about potential interleavings, but also about how the processor +and compiler might reorder memory operations. Even experts make +subtle errors when reasoning about such memory models. + +Researchers have developed tools for exploring the behavior of code +under the C/C++ model including \cdschecker~\cite{cdschecker}, {\sc +Cppmem}~\cite{c11popl}, and Relacy~\cite{relacy}. These tools explore +behaviors that are allowed under the C/C++ memory model. While these +tools can certainly be useful for exploring executions, they can be +challenging to use for testing as they don't provide support (other +than assertions) for specifying the behavior of data structures. +Using assertions can be challenging as different interleavings or +reorderings legitimately produce different behaviors, and it can be +very difficult to code assertions to check the output of a test case under for an +arbitrary (unknown) execution. + +This paper presents \TOOL, a specification language and specification +checking tool that is designed to be used in conjunction with model +checking tools. We have implemented it as a plugin for +the \cdschecker model checker. + +\mysubsection{Background on Linearizability} + +Researchers have developed several techniques for specifying +correctness properties of concurrent data structures written for strong memory +models. While these techniques cannot handle the behaviors typically +exhibited by relaxed data structure implementations, they provide insight into +intuitive approaches to specifying concurrent data structure behavior. + +One approach for specifying the correctness of concurrent data +structures is in terms of equivalent sequential executions of either +the concurrent data structure or a simplified sequential version. The +problem then becomes how do we map a concurrent execution to an equivalent +sequential execution? A common criterion is {\it + linearizability} --- linearizability simply states that a concurrent +operation can be viewed as taking effect at some time between its +invocation and its return (or response)~\cite{linearizableref}. + +An {\it equivalent sequential data structure} is a sequential version +of a concurrent data structure that can be used to express correctness +properties by relating executions of the original concurrent data +structure with executions of the equivalent sequential data structure. +The equivalent sequential data structure is often simpler and can in +many cases simply use existing well-tested implementations in the +STL library. + +An execution {\it history} is a total order of method invocations and +responses. A {\it sequential history} is one where all invocations are +followed by the corresponding responses immediately. A concurrent +execution is correct if its behavior is consistent with its equivalent +sequential history replayed on the equivalent sequential data +structure. A concurrent object is linearizable if for all executions: +\begin{enumerate} +\item Each method call appears to take effect instantaneously at some + point between its invocation and response. + +\item The invocations and responses can be reordered to yield a + sequential history under the rule that an invocation cannot be + reordered before the preceding responses. + +\item The concurrent execution yields the same behavior as + the sequential history. +\end{enumerate} + +A weaker variation of linearization is {\it sequential +consistency}\footnote{It is important to note that the term sequential +consistency in the literature is applied to both the consistency model +that data structures expose clients to as well as the guarantees that +the underlying memory system provides for load and store operations.}. +Sequential consistency only requires that there exist a sequential +history that is consistent with the {\it program order} (the intra-thread +order). This ordering does not need to be consistent with the order +that the operations were actually issued in. + +Line-Up~\cite{lineup}, Paraglider~\cite{VechevMCLinear}, and +VYRD~\cite{vyrd} that leverage linearizability to test concurrent data +structures. {\bf Unfortunately, efficient implementations of many +common data structures, e.g., RCU~\cite{rcu}, MS +Queue~\cite{lockfreequeue}, ..., for the C/C++ memory model are +neither linearizable nor sequentially consistent! Thus previous tools +cannot check such data structures under the C/C++ memory model.} + +\mysubsection{New Challenges from the C/C++ Memory Model} +\label{sec:introNewChallenges} + +The C/C++ memory model brings the following two key challenges that prevent the application of previous approaches to checking concurrent data structures to this setting: + +\squishcount +\item {\bf Relaxed Executions Break Existing Data Structure Consistency Models:} +C/C++ data structures often expose clients to weaker (non-SC) +behaviors to gain performance. A common guarantee is to provide +happens-before synchronization between operations that implement +updates and the operations that read those updates. These data +structures often do not guarantee that different threads observe updates in the +same order --- in other words the data structures may expose clients +to weaker consistency models than sequential consistency. For +example, even when one uses the relatively strong \code{acquire} +and \code{release} memory orderings in C++, it is possible for two +different threads to observe two stores happening in +different orders, i.e., executions can fail the IRIW test. +Thus many data structure legitimately admit executions for which there +are no sequential histories that preserve program order. + +Like many other relaxed memory models, the C/C++ memory model does +not include a total order over all memory operations, thus even +further complicating the application of traditional approaches to correctness, +e.g., linearization cannot be applied. In +particular the approaches that relate the behaviors of concurrent data +structures to analogous sequential data structures break down due to +the absence of a total ordering of the memory operations. While many +of the dynamic tools~\cite{cdschecker,relacy} for exploring the +behavior of code under relaxed models do as a practical matter +print out an execution in some order, this order is to some degree arbitrary as relaxed memory models +generally make it possible for a data structure operation to see the +effects of operations that appear later in any such an order (e.g., a load +can read from a store that appears later in the order). Instead of a total order, the C/C++ +memory model is formulated as a graph of memory operations +with several partial orders defined in this graph. + +\item {\bf Constraining Reorderings (Specifying Synchronization Properties):} +Synchronization\footnote{Synchronization here is not mutual exclusion, + but rather a lower-level property that captures which stores must be + visible to a thread. In other words, it constrains which + reorderings can be performed by a processor or compiler.} in C/C++ + provides an ordering between memory operations to different + locations. Concurrent data structures must establish + synchronization or they potentially expose their users to highly + non-intuitive behavior that is likely to break client code. For + example, consider the case of a concurrent queue that does not + establish synchronization between enqueue and dequeue operations. + If one thread initializes the fields of an object and then enqueues + a reference to that object in such a queue and a second thread + dequeues the reference and uses it to read the fields of that + object, the second thread could fail to see the initializing writes. + This surprising behavior could occur if the compiler or CPU could + reorder the initializing writes to be executed after the enqueue + operation. If the fields are non-atomic, such loads are considered + data races and violate the data race free requirement of the C/C++ + language standard and thus the program has no semantics. + +The C/C++ memory model formalizes synchronization in terms of a {\it + happens-before} relation. The C/C++ happens-before relationship +is a partial order over memory accesses. If memory access {\it x} +happens before memory access {\it y}, it means that the effects of +{\it x} must be ordered before the effects of {\it y}. +\countend + +\begin{figure} + \centering +\vspace{-.3cm} + \includegraphics[scale=0.35]{figures/specworkflow} +\vspace{-.4cm} + \caption{\label{fig:specworkflow} \TOOL system overview} +\vspace{-.4cm} +\end{figure} + +\mysubsection{Specification Language and Tool Support} + +Figure~\ref{fig:specworkflow} presents an overview of the \TOOL system. After +implementing a concurrent data structure, developers annotate their code +with a \TOOL specification. To test their implementation, +developers compile the data structure with the \TOOL specification +compiler to extract the specification and generate a program that is instrumented with specification checks. + Then, developers compile the instrumented program with a +standard C/C++ compiler. Finally, developers run the binary under +the \TOOL checker. \TOOL +then exhaustively explores the behaviors of the specific unit test and +generates diagnostic reports for any executions that violate the specification. + +\mysubsection{Contributions} + +This paper makes the following contributions: + +\begin{itemize} +\item {\bf Specification Language:} It introduces a specification + language that enables developers to write specifications of + concurrent data structures developed for a relaxed memory model in a + simple fashion that captures the key correctness properties. Our + specification language is the first to our knowledge that supports concurrent data + structures that use C/C++ atomic operations. + +\item {\bf A Technique to Relate Concurrent Executions to Sequential Executions:} It presents an approach to order the memory operations for the + C/C++ model, which lacks a definition of a trace and for which one + generally cannot even construct a total order of atomic operations + that is consistent with the program order. The generated + sequential execution by necessity does not always maintain program order. + +\item {\bf Synchronization Properties:} It presents constructs + for specifying the happens before relations that a data structure + should establish and tool support for checking these properties and + exposing synchronization related bugs. + +\item {\bf Tool for Checking C/C++ Data Structures Against Specifications:} \TOOL is the first tool to our knowledge that can check concurrent data structures that exhibit relaxed behaviors against specifications that are specified in terms intuitive sequential executions. + +\item {\bf Evaluation:} It shows that the \TOOL specification language can express key correctness properties for a +set of real-world concurrent data structures, that our tool can detect + bugs, and that our tool can unit test real world data structures + with reasonable performance. +\end{itemize} + diff --git a/writeup/.#introduction.tex.1.26 b/writeup/.#introduction.tex.1.26 new file mode 100644 index 0000000..33c8499 --- /dev/null +++ b/writeup/.#introduction.tex.1.26 @@ -0,0 +1,223 @@ +\mysection{Introduction}\label{sec:introduction} + +Concurrent data structure design can improve scalability by supporting +multiple simultaneous operations, reducing memory coherence traffic, and reducing the time taken by an +individual data structure operation. Researchers have developed many concurrent +data structure designs with these goals~\cite{rcu, +lockfreequeue}. Concurrent data structures often use sophisticated techniques +including low-level atomic instructions (e.g., compare and +swap), careful reasoning about the order of loads and +stores, and fine-grained locking. For example, while the standard Java hash +table implementation can limit scalability to a handful of cores, +more sophisticated concurrent hash tables can scale to many hundreds of +cores~\cite{javaConcurrentHashMap}. + +The C/C++ standard committee extended the C and C++ languages with +support for low-level atomic operations in the C/C++11 +standard~\cite{cpp11spec, c11spec, boehmpldi} to enable developers to +write portable implementations of concurrent data structures. To support the relaxations typically performed by compilers and processors, +the +C/C++ memory model provides weaker semantics than sequential +consistency~\cite{scmemorymodel} and as a result, correctly using +these operations is challenging. Developers must not only +reason about potential interleavings, but also about how the processor +and compiler might reorder memory operations. Even experts make +subtle errors when reasoning about such memory models. + +Researchers have developed tools for exploring the behavior of code +under the C/C++ model including \cdschecker~\cite{cdschecker}, {\sc +Cppmem}~\cite{c11popl}, and Relacy~\cite{relacy}. These tools explore +behaviors that are allowed under the C/C++ memory model. While these +tools can certainly be useful for exploring executions, they can be +challenging to use for testing as they don't provide support (other +than assertions) for specifying the behavior of data structures. +Using assertions can be challenging as different interleavings or +reorderings legitimately produce different behaviors, and it can be +very difficult to code assertions to check the output of a test case under for an +arbitrary (unknown) execution. + +This paper presents \TOOL, a specification language and specification +checking tool that is designed to be used in conjunction with model +checking tools. We have implemented it as a plugin for +the \cdschecker model checker. + +\mysubsection{Background on Linearizability} + +Researchers have developed several techniques for specifying +correctness properties of concurrent data structures written for strong memory +models. While these techniques cannot handle the behaviors typically +exhibited by relaxed data structure implementations, they provide insight into +intuitive approaches to specifying concurrent data structure behavior. + +One approach for specifying the correctness of concurrent data +structures is in terms of equivalent sequential executions of either +the concurrent data structure or a simplified sequential version. The +problem then becomes how do we map a concurrent execution to an equivalent +sequential execution? A common criterion is {\it + linearizability} --- linearizability simply states that a concurrent +operation can be viewed as taking effect at some time between its +invocation and its return (or response)~\cite{linearizableref}. + +An {\it equivalent sequential data structure} is a sequential version +of a concurrent data structure that can be used to express correctness +properties by relating executions of the original concurrent data +structure with executions of the equivalent sequential data structure. +The equivalent sequential data structure is often simpler, and in +many cases one can simply use existing well-tested implementations from the +STL library. + +An execution {\it history} is a total order of method invocations and +responses. A {\it sequential history} is one where all invocations are +followed by the corresponding responses immediately. A concurrent +execution is correct if its behavior is consistent with its equivalent +sequential history replayed on the equivalent sequential data +structure. A concurrent object is linearizable if for all executions: +\begin{enumerate} +\item Each method call appears to take effect instantaneously at some + point between its invocation and response. + +\item The invocations and responses can be reordered to yield a + sequential history under the rule that an invocation cannot be + reordered before the preceding responses. + +\item The concurrent execution yields the same behavior as + the sequential history. +\end{enumerate} + +A weaker variation of linearization is {\it sequential +consistency}\footnote{It is important to note that the term sequential +consistency in the literature is applied to both the consistency model +that data structures expose clients to as well as the guarantees that +the underlying memory system provides for load and store operations.}. +Sequential consistency only requires that there exist a sequential +history that is consistent with the {\it program order} (the intra-thread +order). This ordering does not need to be consistent with the order +that the operations were actually issued in. + +Line-Up~\cite{lineup}, Paraglider~\cite{VechevMCLinear}, and +VYRD~\cite{vyrd} leverage linearizability to test concurrent data +structures. {\bf Unfortunately, efficient implementations of many +common data structures, e.g., RCU~\cite{rcu}, MS +Queue~\cite{lockfreequeue}, ..., for the C/C++ memory model are +neither linearizable nor sequentially consistent! Thus previous tools +cannot check such data structures under the C/C++ memory model.} + +\mysubsection{New Challenges from the C/C++ Memory Model} +\label{sec:introNewChallenges} + +The C/C++ memory model brings the following two key challenges that prevent the application of previous approaches to checking concurrent data structures to this setting: + +\squishcount +\item {\bf Relaxed Executions Break Existing Data Structure Consistency Models:} +C/C++ data structures often expose clients to weaker (non-SC) +behaviors to gain performance. A common guarantee is to provide +happens-before synchronization between operations that implement +updates and the operations that read those updates. These data +structures often do not guarantee that different threads observe updates in the +same order --- in other words the data structures may expose clients +to weaker consistency models than sequential consistency. For +example, even when one uses the relatively strong \code{acquire} +and \code{release} memory orderings in C++, it is possible for two +different threads to observe two stores happening in +different orders, i.e., executions can fail the IRIW test. +Thus many data structure legitimately admit executions for which there +are no sequential histories that preserve program order. + +Like many other relaxed memory models, the C/C++ memory model does +not include a total order over all memory operations, thus even +further complicating the application of traditional approaches to correctness, +e.g., linearization cannot be applied. In +particular the approaches that relate the behaviors of concurrent data +structures to analogous sequential data structures break down due to +the absence of a total ordering of the memory operations. While many +of the dynamic tools~\cite{cdschecker,relacy} for exploring the +behavior of code under relaxed models do as a practical matter +print out an execution in some order, this order is to some degree arbitrary as relaxed memory models +generally make it possible for a data structure operation to see the +effects of operations that appear later in any such an order (e.g., a load +can read from a store that appears later in the order). Instead of a total order, the C/C++ +memory model is formulated as a graph of memory operations +with several partial orders defined in this graph. + +\item {\bf Constraining Reorderings (Specifying Synchronization Properties):} +Synchronization\footnote{Synchronization here is not mutual exclusion, + but rather a lower-level property that captures which stores must be + visible to a thread. In other words, it constrains which + reorderings can be performed by a processor or compiler.} in C/C++ + provides an ordering between memory operations to different + locations. Concurrent data structures must establish + synchronization or they potentially expose their users to highly + non-intuitive behavior that is likely to break client code. For + example, consider the case of a concurrent queue that does not + establish synchronization between enqueue and dequeue operations. Consider the + following sequence of operations: (1) thread A initializes the fields of a new + object X; (2) thread A enqueues the reference to X in such a queue + (3) thread B dequeues the reference to X; (4) thread B reads the + fields of X through the dequeued reference. In (4), thread B could fail to see the + initializing writes from (1). + This surprising behavior could occur if the compiler or CPU could + reorder the initializing writes to be executed after the enqueue + operation. If the fields are non-atomic, such loads are considered + data races and violate the data race free requirement of the C/C++ + language standard and thus the program has no semantics. + +The C/C++ memory model formalizes synchronization in terms of a {\it + happens-before} relation. The C/C++ happens-before relationship +is a partial order over memory accesses. If memory access {\it x} +happens before memory access {\it y}, it means that the effects of +{\it x} must be ordered before the effects of {\it y}. +\countend + +\begin{figure} + \centering +\vspace{-.3cm} + \includegraphics[scale=0.35]{figures/specworkflow} +\vspace{-.4cm} + \caption{\label{fig:specworkflow} \TOOL system overview} +\vspace{-.4cm} +\end{figure} + +\mysubsection{Specification Language and Tool Support} + +Figure~\ref{fig:specworkflow} presents an overview of the \TOOL system. After +implementing a concurrent data structure, developers annotate their code +with a \TOOL specification. To test their implementation, +developers compile the data structure with the \TOOL specification +compiler to extract the specification and generate a program that is instrumented with specification checks. + Then, developers compile the instrumented program with a +standard C/C++ compiler. Finally, developers run the binary under +the \TOOL checker. \TOOL +then exhaustively explores the behaviors of the specific unit test and +generates diagnostic reports for any executions that violate the specification. + +\mysubsection{Contributions} + +This paper makes the following contributions: + +\begin{itemize} +\item {\bf Specification Language:} It introduces a specification + language that enables developers to write specifications of + concurrent data structures developed for a relaxed memory model in a + simple fashion that captures the key correctness properties. Our + specification language is the first to our knowledge that supports concurrent data + structures that use C/C++ atomic operations. + +\item {\bf A Technique to Relate Concurrent Executions to Sequential Executions:} It presents an approach to order the memory operations for the + C/C++ model, which lacks a definition of a trace and for which one + generally cannot even construct a total order of atomic operations + that is consistent with the program order. The generated + sequential execution by necessity does not always maintain program order. + +\item {\bf Synchronization Properties:} It presents constructs + for specifying the happens before relations that a data structure + should establish and tool support for checking these properties and + exposing synchronization related bugs. + +\item {\bf Tool for Checking C/C++ Data Structures Against Specifications:} \TOOL is the first tool to our knowledge that can check concurrent data structures that exhibit relaxed behaviors against specifications that are specified in terms intuitive sequential executions. + +\item {\bf Evaluation:} It shows that the \TOOL specification language can express key correctness properties for a +set of real-world concurrent data structures, that our tool can detect + bugs, and that our tool can unit test real world data structures + with reasonable performance. +\end{itemize} + diff --git a/writeup/.#memorymodel.tex.1.1 b/writeup/.#memorymodel.tex.1.1 new file mode 100644 index 0000000..f60d9da --- /dev/null +++ b/writeup/.#memorymodel.tex.1.1 @@ -0,0 +1,101 @@ +\section{C/C++ Memory Model}\label{sec:memorymodel} + +We next briefly summarize key aspects of the C/C++ memory model. The memory model describes a series of atomic operations and the +corresponding allowed behaviors of programs that utilize them. + +Any operation on an atomic object will have one of six \textit{memory orders}, +each of which falls into one or more of the following categories. + +\begin{description} + + \item[relaxed:] + \code{memory\_order\_relaxed} -- + weakest memory ordering + + \item[release:] + \code{memory\_order\_release}, + \code{memory\_order\_acq\_rel}, and + \code{memory\_order\_seq\_cst} -- + a store-release may form release/consume or release/acquire synchronization + + \item[consume:\footnotemark{}] + \code{memory\_order\_consume} -- + a load-consume may form release/consume synchronization + + \footnotetext{Consume is not broadly supported by compilers at + this point due to specifying data dependencies. We treat consumes as acquires.} + + \item[acquire:] + \code{memory\_order\_acquire}, + \code{memory\_order\_acq\_rel}, and + \code{memory\_order\_seq\_cst} -- + a load-acquire may form release/acquire synchronization + + \item[seq-cst:] + \code{memory\_order\_seq\_cst} -- + strongest memory ordering + +\end{description} + +\subsection{Relations}\label{sec:model-relations} + +The C/C++ memory model expresses program behavior in the form +of binary relations or orderings. The following subsections will briefly +summarize the relevant relations. Much of this discussion resembles the preferred model from the +formalization in \cite{c11popl}. + +\mypara{\bf Sequenced-Before:} +The order of program operations within a single thread of execution establishes an intra-thread +\textit{sequenced-before} (\reltext{sb}) relation. +Note that while some operations in C/C++ provide no +intra-thread ordering---the equality operator (\code{==}), for example---we +ignore this detail and assume that \reltext{sb} totally orders all operations in +a thread. + +\mypara{\bf Reads-From:} +The \textit{reads-from} (\reltext{rf}) relation consists of store-load pairs $(X, Y)$ +such that $Y$ reads its value from the effect of $X$---or $X \relation{rf} Y$. In the +C/C++ memory model, this relation is non-trivial, as a given load operation may +read from one of many potential stores in the program execution. + +\mypara{\bf Synchronizes-With:} +The \textit{synchronizes-with} (\reltext{sw}) relation captures +synchronization that occurs when certain atomic operations interact across two +threads. For instance, release/acquire synchronization occurs between a pair of +atomic operations on the same object: a store-release $X$ and a load-acquire +$Y$. If $Y$ reads from $X$, then $X$ synchronizes with $Y$---or $X +\relation{sw} Y$. Synchronization also occurs between consecutive unlock and +lock operations on the same mutex, between thread creation and the first event +in the new thread, and between the last action of a thread and the completion of +a thread-join operation targeting that thread. + +\mypara{\bf Happens-Before:} +In \TOOL, we avoid consume operations, and so the \textit{happens-before} +(\reltext{hb}) relation is simply the transitive closure of \reltext{sb} and +\reltext{sw}. + +The \reltext{hb} relation restricts the stores that loads can read +from. For example, if we have two stores $X$ and $Y$ and +a load $Z$ to the same memory location and $X \relation{hb} Y +\relation{hb} Z$, then $Z$ cannot read from $X$. + +\mypara{\bf Sequential Consistency:} +All seq-cst operations in a program execution form a +total ordering (\reltext{sc}) so that, for instance, a seq-cst load may not read +from a seq-cst store prior to the most recent store (to the same location) in +the \reltext{sc} ordering, nor from any store that happens before that store. +The \reltext{sc} order must be consistent with \reltext{hb}. + +\mypara{\bf Modification Order:} +Each atomic object in a program execution has an associated \textit{modification order} +(\reltext{mo})---a total order of all stores to that object---which +informally represents a memory-coherent ordering in which those stores may be observed by +the rest of the program. +Note that +in general the modification orders for all objects cannot be combined +to form a consistent total ordering. We use $X \relation{mo} Y$ to represent the +fact that $X$ is modification ordered before $Y$. + + + + diff --git a/writeup/.#specification.tex.1.47 b/writeup/.#specification.tex.1.47 new file mode 100644 index 0000000..cb2aa21 --- /dev/null +++ b/writeup/.#specification.tex.1.47 @@ -0,0 +1,419 @@ +\mysection{Specification Language Design}\label{sec:specification} + +We begin by briefly overviewing \TOOL's basic approach. The \TOOL +specification language specifies the correctness properties for +concurrent data structures by establishing a correspondence with an +equivalent sequential data structure, which requires: (1) defining the +equivalent sequential data structure; (2) establishing an equivalent +sequential history; (3) relating the behavior of the concurrent +execution to the sequential history; and (4) specifying the +synchronization properties between method invocations. The \TOOL +specification language has the following key components: + +\mypara{\bf 1. Equivalent Sequential Data Structure:} This component defines a +sequential data structure against which the concurrent data structure +will be checked. + +\mypara{\bf 2. Defining the Equivalent Sequential History:} +For real-world data structures, generally there exist two types of API methods, +\textit{primitive} API methods and \textit{aggregate} API methods. Take +concurrent hashtables as an example, it provides primitive API methods +such as \code{put} and \code{get} that implement the core functionality of the +data structure, and it also has aggregate API methods such +as \code{putAll} that calls primitive API methods internally. From our +experience working with our benchmark set, it is generally possible to +generate a sequential history of primitive API method invocations for +real-world data structures as they generally serialize on a single memory +location --- while it is possible to observe partially completed aggregate +API method invocations. Therefore, our specifications will focus on the +correctness of primitive API methods. + +Borrowing from VYRD~\cite{vyrd} the concept of commit points, we allow +developers to specify \textit{ordering points} --- the specific atomic +operations between method invocation and response events that are used for +ordering method calls. Ordering points are a generalization of the commit +points as they also use memory operations that do not commit the data structure +operation to order method calls. Developers then specify ordering points to +generate the equivalent sequential history. + +\mypara{\bf 3. Specifying Correct Behaviors:} Developers use +the \TOOL specification to provide a set of \textit{side effects} +and \textit{assertions} to describe the desired behavior of each API +method. Side effects capture how a method updates the equivalent +sequential data structure. Assertions include both preconditions and +postconditions which specify what conditions each method must satisfy +before and after the method call, respectively. The specification of +the side effects and assertions may make use of the states of the +equivalent sequential data structure, meaning that these components +can access the internal variables and methods of the equivalent sequential data +structure. Additionally, they can reference the values available at +the method invocation and response, i.e., the parameter values and the +return value. + +\mypara{\bf 4. Synchronization:} The synchronization specification +describes the desired happens before relations between API method +invocations. \TOOL specifications allow developers to specify the +properties at the abstraction of methods. This makes specifications +cleaner, more understandable, and less error-prone because the +properties do not rely on low-level implementation +details. Moreover, \TOOL specifications allow developers to attach +conditions to methods when specifying synchronization properties so +that a method call might synchronize with another only under a +specific condition. For example, consider a spin lock with +a \code{try\_lock()} method, we need to specify that only a +successful \code{try\_lock()} method invocation must synchronize with the +previous \code{unlock()} method invocation. + +Figure~\ref{fig:speccfg} presents the grammar for the \TOOL specification +language. The grammar defines three types of specification annotations: +\textit{structure annotations}, \textit{method annotations}, and +\textit{ordering point annotations}. +In the grammar, \textit{code} means legal C/C++ source code; and +\textit{label} means legal C/C++ variable name. +Annotations are embedded in C/C++ comments. +This format does not affect the semantics of the original +program and allows for the same source to be used by both a standard C/C++ +compiler to generate production code and for the \TOOL specification compiler to +extract the \TOOL specification from the comments. We discuss these constructs in more detail throughout the remainder of this section. + +\begin{figure}[!tb] +\vspace{-.2cm} +{\scriptsize + \begin{eqnarray*} + \textit{\textbf{structureSpec}} & \rightarrow & \code{"@Structure\_Define"}\\ + && \textit{structureDefine} \ \ \ (\textit{happensBefore})?\\ + \textit{structureDefine} & \rightarrow & +(\code{"@DeclareStruct:"} \ + \textit{code})\text{*}\\ + && \code{"@DeclareVar:"} \ \textit{code}\\ + && \code{"@InitVar:"} \ \textit{code}\\ + && (\code{"@DefineFunc:"} \ \textit{code})\text{*}\\ + \textit{happensBefore} & \rightarrow & \code{"@Happens\_Before:"} \ + (\textit{invocation} \ \code{"->"} \ + \textit{invocation})\textsuperscript{+}\\ + \textit{invocation} & \rightarrow & \textit{label} \ (\ \ \code{"("} \ + \textit{label} \code{")"} \ \ )?\\ + \textit{\textbf{methodSpec}} & \rightarrow & \code{"@Method:"} \ \textit{label}\\ + && \code{"@Ordering\_Point\_Set:"} \ \textit{label} \ (\code{"|"} \ + \textit{label})\text{*}\\ + && (\code{"@HB\_Condition:"} \ \textit{label} \ \code{"::"} \ \textit{code})\text{*}\\ + && (\code{"@ID:"} \ \textit{code})?\\ + && (\code{"@PreCondition:"} \ \textit{code})?\\ + && (\code{"@SideEffect:"} \ \textit{code})?\\ + && (\code{"@PostCondition:"} \ \textit{code})?\\ + \textit{\textbf{potentialOP}} & \rightarrow & \code{"@Potential\_Ordering\_Point:"} \ \textit{code}\\ + && \code{"@Label:"} \ \ \textit{label}\\ + \textit{\textbf{opCheck}} & \rightarrow & \code{"@Ordering\_Point\_Check:"} \ \textit{code}\\ + && \code{"@Potential\_Ordering\_Point\_Label:"} \ \textit{label}\\ + && \code{"@Label:"} \ \ \textit{label}\\ + \textit{\textbf{opLabelCheck}} & \rightarrow & \code{"@Ordering\_Point\_Label\_Check:"} \ \textit{code}\\ + && \code{"@Label:"} \ \ \textit{label}\\ + \textit{\textbf{opClear}} & \rightarrow & \code{"@Ordering\_Point\_Clear:"} \ \textit{code}\\ + && \code{"@Label:"} \ \ \textit{label}\\ + \textit{code} & \rightarrow & \code{} + \end{eqnarray*}} +\vspace{-.7cm} +\caption{\label{fig:speccfg}Grammar for \TOOL specification language} +\vspace{-.3cm} +\end{figure} + + +\mysubsection{Example} + +To make the \TOOL specification language more concrete, +Figure~\ref{fig:rcuSpecExample} presents the annotated RCU example. We +use {\it ordering points} to order the method invocations to construct +the equivalent sequential history for the concurrent execution. We +first specify the ordering points for the \code{read} +and \code{update} methods to help define the equivalent sequential +history. For the +\code{read} method, the load access of the \code{node} field in +Line~\ref{line:rcuSpecReadLoad} is the only operation that can be an ordering +point. For the \code{update} method, there exists more than one atomic +operation, however they only serve as an ordering point when it successfully uses the CAS operation +to update the \code{node} field. Thus, we specify in +Line~\ref{line:rcuSpecUpdateOPBegin} that the CAS operation should be the +ordering point for the update operation when \code{succ} is \code{true}. We +associate the methods with the two ordering points in +Line~\ref{line:rcuSpecReadInterfaceOPSet} and +\ref{line:rcuSpecUpdateInterfaceOPSet}. + +Next, we specify the equivalent sequential data structure for this RCU implementation. +Line~\ref{line:declVar} declares two integer fields \code{\_data} and +\code{\_version} as the internal states of the equivalent sequential RCU, and +Line~\ref{line:initVar} initializes both variables to \code{0}. + +We then specify the correct behaviors of the equivalent sequential +history by defining the side effects and assertions for +the \code{read} and \code{update} methods. Side effects specify how +to perform the corresponding operation on the equivalent sequential +data structure. For example, +Line~\ref{line:rcuSpecUpdateInterfaceSideEffect} specifies the side +effects of the \code{update} to the sequential states. +Assertions specify properties that should be true of the concurrent data structure execution. +For example, Line~\ref{line:rcuSpecReadInterfacePostCondition} +specifies that the \code{read} method should satisfy the postcondition that the +returned \code{data} and \code{version} fields should have consistent values +as the internal state of the equivalent sequential data structure. + +Our implementation of the RCU data structure is designed to establish +synchronization between the \code{update} method invocation and the later +\code{read} or \code{update} method invocation. This is important, for +example, if a client thread were to update an array index and use the RCU data +structure to communicate the updated index to a second client thread. Without +synchronization, the second client thread may not see the update to the array +index. Besides, the synchronization between two \code{update} calls ensures that +later \code{read} will see the most updated values. +In order to specify the synchronization, we associate \code{read} and \code{update} methods with method call identifiers +(Line~\ref{line:rcuSpecReadInterfaceID} and Line~\ref{line:rcuSpecUpdateInterfaceID}), which for this example is the value of the +\code{this} pointer. +Together these annotations ensure that every +API method call on the same RCU object will have the same method call ID. +Line~\ref{line:rcuSpecHB} then specifies +the synchronization property for the RCU --- any \code{update} method invocation +should synchronize with all later \code{read} and \code{update} method invocations that have the +same method call identifier as that \code{update} method. This guarantees that +\code{update} calls should synchronize with the \code{read} and \code{update} +calls of the same RCU object. + + +\begin{figure}[h!] +\vspace{-.2cm} +\begin{lstlisting}[xleftmargin=6.0ex] +class RCU { + /** @Structure_Define: + @DeclareVar:/*@ \label{line:declVar} @*/ int _data, _version; + @InitVar:/*@ \label{line:initVar} @*/ _data = 0; _version = 0; + @Happens_Before: Update->Read Update->Update*//*@ \label{line:rcuSpecHB} @*/ + atomic node; + public: + RCU() { + Node *n = new Node; + n->data = 0; + n->version = 0; + atomic_init(&node, n); + } + /** @Interface: Read/*@ \label{line:rcuSpecReadInterfaceLabel} @*/ + @Ordering_Point_Set: Read_Point/*@ \label{line:rcuSpecReadInterfaceOPSet} @*/ + @ID: this/*@ \label{line:rcuSpecReadInterfaceID} @*/ + @PostCondition:/*@ \label{line:rcuSpecReadInterfacePostCondition} @*/ + _data == *data && _version == *version *//*@ \label{line:rcuSpecReadInterfaceEnd} @*/ + void read(int *data, int *version) { + Node *res = node.load(mo_acquire);/*@ \label{line:rcuSpecReadLoad} @*/ + /** @Ordering_Point_Label_Check: true/*@ \label{line:rcuSpecReadOPBegin} @*/ + @Label: Read_Point */ + *data = res->data; + *version = res->version; + } + /** @Interface: Update + @Ordering_Point_Set: Update_Point/*@ \label{line:rcuSpecUpdateInterfaceOPSet} @*/ + @ID: this/*@ \label{line:rcuSpecUpdateInterfaceID} @*/ + @SideEffect: _data = data; _version++; *//*@ \label{line:rcuSpecUpdateInterfaceSideEffect} @*/ + void update(int data) { + bool succ = false; + Node *newNode = new Node;/*@ \label{line:rcuSpecUpdateAlloc} @*/ + Node *prev = node.load(mo_acquire);/*@ \label{line:rcuSpecUpdateLoad} @*/ + do { + newNode->data = data; + newNode->version = prev->version + 1; + succ = node.compare_exchange_strong(prev,/*@\label{line:rcuSpecUpdateCAS} @*/ + newNode, mo_acq_rel, mo_acquire); + /** @Ordering_Point_Label_Check: succ/*@ \label{line:rcuSpecUpdateOPBegin} @*/ + @Label: Update_Point */ + } while (!succ); + } +}; + +\end{lstlisting} +\vspace{-.2cm} +\caption{\label{fig:rcuSpecExample}Annotated RCU specification example} +\vspace{-.3cm} +\end{figure} + +\subsection{Defining the Equivalent Sequential History} + +While defining the equivalent sequential history for concurrent executions is well studied in the context of the +SC memory model, optimizations that developers typically use in the +context of weaker memory models create the following new challenges when +we generate the equivalent sequential history using ordering points. + +\begin{itemize} +\item {\bf Absence of a Meaningful Trace or Total Order:} +For the SC memory model, an execution can be represented by a simple +interleaving of all the memory operations, where each load operation reads from +the last store operation to the same location in the trace. However, under a +relaxed memory model like C/C++11, the interleaving does not uniquely define an +execution because a given load operation can potentially read from many +different store operations in the interleaving. Therefore, we have to rely on +the intrinsic relations between ordering points such as \textit{reads from} and +\textit{modification order} to order method calls. + +\item {\bf Lack of Program Order Preserving Sequential History:} +Moreover, as discussed in Section~\ref{sec:exampleMotivation}, in +general it is not possible to arrange an execution in any totally +ordered sequential history that preserves program order. + +A key insight is that many concurrent data structures' API methods +have a commit point, which is a single memory operation that makes the +update visible to other threads and that also serves as an ordering +point. When two data structure operations have a dependence, it is +often the case that their respective commit points are both +conflicting accesses to the same memory location. In this case, the +modification order provided by C/C++ is sufficient to order these +operations since modification order is guaranteed to be consistent +with the happens before relation (and therefore also the sequenced +before relation). + +For cases where the method calls are independent, such as +a \code{put(X, 1)} followed by a +\code{get(Y)} in a hashtable where \code{X} and \code{Y} are different keys, +the lack of an ordering is not a problem since those methods commute. +\end{itemize} + +\mypara{\bf Ordering Point Annotations:} In many cases, it is not +possible to determine whether a given atomic operation is an ordering +point until later in the execution. For example, +some internal methods may be called by multiple API methods. In this +case, the same atomic operation can be identified as a potential +ordering point for multiple API methods, and each API method later has +a checking annotation to verify whether it was a real ordering +point. Therefore, the \TOOL specification separates the definition of ordering +points as follows: +\begin{enumerate} +\vspace{-.1cm} +\item {\code{Potential\_Ordering\_Point} annotation:} The labeling of ordering +points that identifies the location of a potential ordering point. +\vspace{-.2cm} +\item {\code{Ordering\_Point\_Check} annotation:} The checking of ordering +points that checks at a later point whether a potential ordering point was +really an ordering point. +\end{enumerate} +\vspace{-.1cm} + +These two constructs together identify ordering points. For +example, assume that $A$ is an atomic operation that is marked as a +potential ordering point with the label \code{LabelA} under the +condition \code{ConditionA}. The developer would write a +\code{Potential\_Ordering\_Point} annotation with the label +\code{LabelA} and then use the label \code{LabelA} in an +\code{Ordering\_Point\_Check} annotation at a later point. + +The \code{Ordering\_Point\_Label\_Check} annotation combines +the \code{Potential\_Ordering\_Point} and the +\code{Ordering\_Point\_Check} annotations, and makes +specifications simpler for the use case that the ordering point is known immediately. +For example, in Line~\ref{line:rcuSpecReadOPBegin} of +Figure~\ref{fig:rcuSpecExample}, we use the \code{Ordering\_Point\_Label\_Check} annotation to +identify the ordering point for \code{read} because we know the load operation +in Line~\ref{line:rcuSpecReadLoad} is an ordering point at the time it is +executed. + +Some data structure operations may require multiple ordering points. +For example, consider a transaction implementation that first attempts +to lock all of the involved objects (dropping the locks and retrying +if it fails to acquire a lock), performs the updates, and then releases +the locks. To order such transactions in a relaxed memory model, we must consider all of the +locks it acquires and not just the last lock. Thus, we allow a +method invocation to have more than one ordering point, and the +additional ordering points serve to order the operation with respect to +multiple different memory locations. For the transaction example, it +may be necessary to retry the acquisition of locks. To support this +scenario, the \code{Ordering\_Point\_Clear} annotation removes all +previous ordering points when it satisfies a specific condition. + +Moreover, when an API method calls another API method, they can share ordering points. In +that case, \TOOL requires that at that ordering point, the concurrent data +structure should satisfy the precondition and postcondition of both the inner +and outer API methods. + +\subsection{Checking the IO Behavior of Methods} + +With the specified ordering points, \TOOL is able to generate the equivalent +sequential history. Developers then need to define the equivalent sequential +data structure. For example, in Line~\ref{line:declVar} and +~\ref{line:initVar} of the annotated RCU example, we use the +\code{Structure\_define} annotation to define the equivalent sequential RCU +by specifying the internal states as two integers, \code{\_verion} and \code{\_data}. In the +\code{Structure\_define} annotation, developers can also specify definitions for customized +structs and methods for convenience. We design these annotations in such a way +that developers can +write specifications in C/C++ code such that they do not have to learn a new +specification language. + +After defining the internal states and methods of the +equivalent data structure, developers use the \code{SideEffect} annotation to +define the corresponding sequential API methods, which should contain the action +to be performed on the equivalent sequential data structure. For example, in +Line~\ref{line:rcuSpecUpdateInterfaceSideEffect} of the annotated RCU example, +we use \code{SideEffect} to specify that when we execute the \code{update} +method on the equivalent sequential RCU, we should update the +internal states of \code{\_version} and \code{\_data} accordingly. When +the \code{SideEffect} annotation is omitted for a specific API method, it means +that no side effects will happen on the sequential data structure when that +method is called. Take the annotated RCU as an example, the \code{read} has no +side effects on the equivalent sequential RCU. + +With the well-defined equivalent sequential data structure, developers then relate +the generated equivalent sequential history to the equivalent sequential data +structure. In \TOOL, we allow developers to accomplish this by using the +\code{PreCondition} and \code{PostCondition} annotations to specify the +conditions to be checked before and after the API method appears to happen. +For example, Line~\ref{line:rcuSpecReadInterfaceEnd} in the +annotated RCU example means that when \code{read} appears to happen, it should +return the same value as the current interal variables of the equivalent +sequential RCU. +Note that these two annotations contain legitimate C/C++ +expressions that only access the method call parameters, return value and the +internal states of the equivalent sequential data structure. + +\subsection{Checking Synchronization} + +Under a relaxed memory model, compilers and processors can reorder +memory operations and thus the execution can exhibit counter-intuitive +behaviors. The C/C++11 memory model provides the developer with memory ordering that establish synchronization, e.g., \code{acquire}, \code{release}, \code{seq\_cst}. Synchronization +serves to control which reorderings are allowed --- however, +restricting reorderings comes at a runtime cost so developers must +balance complexity against runtime overhead. Checking that data +structures establish proper synchronization is important to ensure +that the data structures can be effectively composed with client code. + +We generalize the notion of happens before to methods as follows. +Method call $c_1$ happens-before method call $c_2$ if the invocation +event of $c_1$ happens before the response event of $c_2$. Note that +by this definition two method calls can both happen before each other +--- an example of this is the \code{barrier} synchronization +construct. For example, for a correctly synchronized queue, we want +an enqueue to happen before the corresponding dequeue, which avoids +the synchronization problems discussed earlier in +Section~\ref{sec:introNewChallenges}. + +In order to flexibly express the synchronization between methods, we associate +API methods with method call identifiers (or IDs) and happens-before conditional guard +expressions. The method +call ID is a C/C++ expression that computes a unique ID for the call, and if it +is omitted, a default value is used. For example, in our RCU example in +Figure~\ref{fig:rcuSpecExample}, method \code{update} and \code{read} both +have the \code{this} pointer of the corresponding RCU object. +The \code{HB\_Condition} component +associates one happens-before conditional guard expression with a unique label. +For one method, multiple conditional guard expressions are allowed to be +defined, and the conditional guard expression can only access the method +instance's argument values and return value. + +After specifying the +method call IDs and the \code{HB\_Condition} labels, developers +can specify the synchronization as ``\code{method1(HB\_condition1)} \code{->} +\code{method2(HB\_condition2)}''. When the \code{HB\_condition} is omitted, it +defaults to \code{true}. The semantics of this expression is that all +instances of calls to \code{method1} that satisfy the conditional guard +expression \code{HB\_condition1} should happen-before all later instances (as determined by ordering points) of +calls to \code{method2} that satisfy the conditional guard expression +\code{HB\_condition2} such that both instances shared the same ID. +The ID and happens-before conditional guard expression are important because they +allow developers to impose synchronization only between specific method +invocations under specific conditions. For example, in +Figure~\ref{fig:rcuSpecExample}, Line~\ref{line:rcuSpecHB} specifies two +synchronization rules, which together mean that the +\code{update} should only establish synchronization with later \code{read} and +\code{update} from +the same RCU object under all circumstances. diff --git a/writeup/.nfs00000000020c394600000523 b/writeup/.nfs00000000020c394600000523 new file mode 100644 index 0000000000000000000000000000000000000000..c1d842be7f3b045e62e4b5dc32586e7ee2515705 GIT binary patch literal 134482 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 literal 0 HcmV?d00001 diff --git a/writeup/CVS/Entries b/writeup/CVS/Entries new file mode 100644 index 0000000..e738c4e --- /dev/null +++ b/writeup/CVS/Entries @@ -0,0 +1,19 @@ +/confstrs-abbrv.bib/1.1/Wed Jan 14 22:53:32 2015// +/confstrs-long.bib/1.1/Wed Jan 14 22:53:32 2015// +/sig-alternate.cls/1.1/Wed Jan 14 22:53:32 2015// +D/figures//// +/makefile/1.2/Fri Jan 23 17:16:19 2015// +/spell.lst/1.1/Fri Jan 23 05:47:30 2015// +/abstract.tex/1.2/Fri Jan 23 22:58:26 2015// +/conclusion.tex/1.2/Fri Jan 23 22:58:26 2015// +/related.tex/1.2/Fri Jan 23 22:58:26 2015// +/speccfg.tex/1.1/Fri Jan 23 22:58:26 2015// +/technical.tex/1.1/Fri Jan 23 22:58:26 2015// +/paper.tex/1.6/Fri Jan 23 23:30:25 2015// +/paper.bib/1.3/Sat Jan 24 00:47:32 2015// +/memorymodel.tex/1.8/Sat Jan 24 01:51:58 2015// +/introduction.tex/1.36/Sat Jan 24 03:09:04 2015// +/example.tex/1.19/Sat Jan 24 03:36:11 2015// +/specification.tex/1.59/Sat Jan 24 04:47:54 2015// +/implementation.tex/1.16/Sat Jan 24 05:04:07 2015// +/evaluation.tex/1.21/Sat Jan 24 05:35:18 2015// diff --git a/writeup/CVS/Repository b/writeup/CVS/Repository new file mode 100644 index 0000000..e5a4afa --- /dev/null +++ b/writeup/CVS/Repository @@ -0,0 +1 @@ +Papers/15/issta.cdsspec diff --git a/writeup/CVS/Root b/writeup/CVS/Root new file mode 100644 index 0000000..cd8b2f1 --- /dev/null +++ b/writeup/CVS/Root @@ -0,0 +1 @@ +:ext:peizhaoo@plrg.eecs.uci.edu:/home/cvs/Papers diff --git a/writeup/abstract.tex b/writeup/abstract.tex new file mode 100644 index 0000000..7bf3748 --- /dev/null +++ b/writeup/abstract.tex @@ -0,0 +1,19 @@ +Concurrent data structures often provide better performance on +multi-core platforms, but are significantly more difficult to design and +verify than their sequential counterparts. The C/C++11 standard +introduced a weak language memory model supporting low-level atomic +operations such as compare and swap (CAS). While these +atomic operations can significantly improve the performance +of concurrent data structures, programming at this level +introduces +non-intuitive behaviors that significantly increase the difficulty of +developing code. + +In this paper, we present \TOOL, a specification language checker that +allows developers to write simple specifications for low-level +concurrent data structures that make use of C/C++11 atomics and check +the correctness of concurrent data structures against these +specifications. \TOOL is designed to be used in conjunction with +model checking tools and we have implemented it as a plugin +to \cdschecker. We have evaluated \TOOL by annotating and checking +several concurrent data structures. diff --git a/writeup/conclusion.tex b/writeup/conclusion.tex new file mode 100644 index 0000000..ae07691 --- /dev/null +++ b/writeup/conclusion.tex @@ -0,0 +1,11 @@ +\mysection{Conclusion\label{sec:conclusion}} + +The \TOOL specification language and checking system makes it easier +to unit test concurrent data structures written for the C/C++11 memory +model. It extends and modifies classic approaches to defining the +desired behaviors of concurrent data structures with respect to +sequential versions of the same data structure to +apply to the C/C++ memory model. Our evaluation shows +that the approach can be used to specify and test correctness +properties for a range of data structures including a +lock-free hashtable, work-stealing deque, queues and locks. diff --git a/writeup/confstrs-abbrv.bib b/writeup/confstrs-abbrv.bib new file mode 100644 index 0000000..ef42052 --- /dev/null +++ b/writeup/confstrs-abbrv.bib @@ -0,0 +1,173 @@ +@string{mspc12="MSPC"} +@string{ppdp11="PPDP"} +@string{spin04="SPIN"} +@string{spin07="SPIN"} +@string{spin08="SPIN"} +@string{spin09="SPIN"} +@string{ijpp="IJPP"} +@string{jlap="JLAP"} +@string{fcad10="FCAD"} +@strign{sc="SC"} +@string{iwops99="POS"} +@string{podc96="PODC"} +@string{popl73="POPL"} +@string{popl93="POPL"} +@string{popl96="POPL"} +@string{popl97="POPL"} +@string{popl99="POPL"} +@string{popl05="POPL"} +@string{popl07="POPL"} +@string{popl08="POPL"} +@string{popl09="POPL"} +@string{popl11="POPL"} +@string{popl13="POPL"} + +@string{dac07="DAC"} +@string{sosp05="SOSP"} +@string{sosp03="SOSP"} +@string{oopsla02="OOPSLA"} +@string{oopsla03="OOPSLA"} +@string{oopsla04="OOPSLA"} +@string{oopsla05="OOPSLA"} +@string{oopsla06="OOPSLA"} +@string{oopsla07="OOPSLA"} +@string{oopsla08="OOPSLA"} +@string{oopsla09="OOPSLA"} +@string{oopsla10="OOPSLA"} +@string{oopsla13="OOPSLA"} + +@string{hotpar09="HotPar"} +@string{hotpar10="HotPar"} + +@string{atc="ATC"} + +@string{ismm08="ISMM"} +@string{ismm09="ISMM"} +@string{ismm10="ISMM"} + +@string{esop09="ESOP"} + +@string{scool05="SCOOL"} + +@string{paste08="PASTE"} + +@string{ecoop10="ECOOP"} + +@string{osdi04="OSDI"} +@string{osdi08="OSDI"} + +@string{toplas02="TOPLAS"} +@string{toplas09="TOPLAS"} + +@string{pact01="PACT"} +@string{pact08="PACT"} + +@string{cc08="CC"} +@string{cc10="CC"} +@string{cc11="CC"} + +@string{asplos91="ASPLOS"} +@string{asplos02="ASPLOS"} +@string{asplos09="ASPLOS"} + +@string{sc01="SC"} +@string{sc06="SC"} + +@string{spaa98="SPAA"} +@string{toplas="TOPLAS"} +@string{tocs="TOCS"} +@string{tpds="TPDS"} +@string{vee05="VEE"} +@string{vee08="VEE"} +@string{jvm01="JVM"} + +@string{ics95="ICS"} +@string{ics99="ICS"} + +@string{icse05="ICSE"} +@string{icse10="ICSE"} +@string{icse00="ICSE"} + +@string{sc97="SC"} +@string{sc01="SC"} +@string{lcpc08="LCPC"} +@string{lcpc01="LCPC"} +@string{pldi="PLDI"} +@string{pldi93="PLDI"} +@string{pldi94="PLDI"} +@string{pldi95="PLDI"} +@string{pldi96="PLDI"} +@string{pldi97="PLDI"} +@string{pldi98="PLDI"} +@string{pldi99="PLDI"} +@string{pldi00="PLDI"} +@string{pldi01="PLDI"} +@string{pldi02="PLDI"} +@string{pldi03="PLDI"} +@string{pldi04="PLDI"} +@string{pldi05="PLDI"} +@string{pldi06="PLDI"} +@string{pldi07="PLDI"} +@string{pldi08="PLDI"} +@string{pldi09="PLDI"} +@string{pldi10="PLDI"} +@string{pldi11="PLDI"} +@string{pldi12="PLDI"} +@string{pldi13="PLDI"} + +@string{issta11="ISSTA"} +@string{isca90="ISCA"} +@string{isca09="ISCA"} +@string{isca10="ISCA"} +@string{ppopp97="PPoPP"} +@string{ppopp01="PPoPP"} +@string{ppopp07="PPoPP"} +@string{ppopp09="PPoPP"} +@string{ppopp10="PPoPP"} +@string{ppopp11="PPoPP"} +@string{ppopp12="PPoPP"} +@string{ppopp13="PPoPP"} + +@string{cgo10="CGO"} +@string{cgo11="CGO"} + +@string{ispass09="ISPASS"} + +@string{iiswc08="IISWC"} +@string{iiswc09="IISWC"} + +@string{iccl88="ICCL"} + +@string{micro05="MICRO"} +@string{micro10="MICRO"} + +@string{hpdc07="HPDC"} + +@string{cav08="CAV"} +@string{cav07="CAV"} +@string{cav06="CAV"} +@string{cav04="CAV"} + +@string{procomet90="PROCOMET"} +@string{hpca07="HPCA"} +@string{dexa04="DEXA"} + +@string{lics="LICS"} +@string{lncs="LNCS"} +@string{lcpc="LCPC"} +@string{vmcai="VMCAI"} +@string{vmcai09="VMCAI"} +@string{tacas11="TACAS"} + +@string{ieeecmpscieng="IEEE Comput. Sci. Eng."} +@string{higherordersymbcomp="HOSC"} +@string{ibmjrd="IBM J. of Res. Dev."} +@string{ieeetc="TC"} +@string{cacm="CACM"} +@string{jsac="J-SAC"} + +@string{conpar90vappIV="CONPAR 90 - VAPP IV"} + +@string{asplos91="ASPLOS"} + +@string{ipdps09="IPDPS"} diff --git a/writeup/confstrs-long.bib b/writeup/confstrs-long.bib new file mode 100644 index 0000000..55ff861 --- /dev/null +++ b/writeup/confstrs-long.bib @@ -0,0 +1,180 @@ +@string{mspc12="Proceedings of the 2012 ACM SIGPLAN Workshop on Memory Systems Performance and Correctness"} +@string{ppdp11="Proceedings of the 13th International ACM SIGPLAN Symposium on Principles and Practices of Declarative Programming"} +@string{padd88="Proceedings of the 1988 ACM SIGPLAN and SIGOPS Workshop on Parallel and Distributed Debugging"} +@string{spin04="Proceedings of the 11th International {SPIN} Workshop on Model Checking Software"} +@string{spin07="Proceedings of the 14th International {SPIN} Workshop on Model Checking Software"} +@string{spin08="Proceedings of the 15th International {SPIN} Workshop on Model Checking Software"} +@string{spin09="Proceedings of the 16th International {SPIN} Workshop on Model Checking Software"} +@string{fcad10="Proceedings of the Conference on Formal Methods in Computer-Aided Design"} +@string{jlap="Journal of Logic and Algebraic Programming"} +@string{iwops99="Proceedings of the 8th International Workshop on Persistent Object Systems"} + +@string{ijpp="International Journal on Parallel Programming"} + +@string{sc06="Supercomputing"} +@string{podc96="Proceedings of the Fifteenth Annual ACM Symposium on Principles of Distributed Computing"} +@string{popl73="Proceedings of the Symposium on Principles of Programming Languages"} +@string{popl93="Proceedings of the Symposium on Principles of Programming Languages"} +@string{popl96="Proceedings of the Symposium on Principles of Programming Languages"} +@string{popl97="Proceedings of the Symposium on Principles of Programming Languages"} +@string{popl99="Proceedings of the Symposium on Principles of Programming Languages"} +@string{popl05="Proceedings of the Symposium on Principles of Programming Languages"} +@string{popl07="Proceedings of the Symposium on Principles of Programming Languages"} +@string{popl08="Proceedings of the Symposium on Principles of Programming Languages"} +@string{popl11="Proceedings of the Symposium on Principles of Programming Languages"} +@string{popl13="Proceedings of the Symposium on Principles of Programming Languages"} + +@string{dac07="Proceedings of the 44th Annual Design Automation Conference"} + +@string{issta11="Proceedings of the 2011 International Symposium on Software Testing and Analysis"} + +@string{sosp03="Proceedings of the Nineteenth ACM Symposium on Operating Systems Principles"} +@string{sosp05="Proceedings of the Twentieth ACM Symposium on Operating Systems Principles"} +@string{oopsla02="Proceeding of the 17th ACM SIGPLAN Conference on Object-Oriented Programming, Systems, Languages, and Applications"} +@string{oopsla03="Proceeding of the 18th ACM SIGPLAN Conference on Object-Oriented Programming, Systems, Languages, and Applications"} +@string{oopsla04="Proceeding of the 19th ACM SIGPLAN Conference on Object-Oriented Programming, Systems, Languages, and Applications"} +@string{oopsla05="Proceeding of the 20th ACM SIGPLAN Conference on Object-Oriented Programming, Systems, Languages, and Applications"} +@string{oopsla06="Proceeding of the 21st ACM SIGPLAN Conference on Object-Oriented Programming, Systems, Languages, and Applications"} +@string{oopsla07="Proceeding of the 22nd ACM SIGPLAN Conference on Object-Oriented Programming, Systems, Languages, and Applications"} +@string{oopsla08="Proceeding of the 23rd ACM SIGPLAN Conference on Object-Oriented Programming, Systems, Languages, and Applications"} +@string{oopsla09="Proceeding of the 24th ACM SIGPLAN Conference on Object-Oriented Programming, Systems, Languages, and Applications"} +@string{oopsla10="Proceeding of the 25th ACM SIGPLAN Conference on Object-Oriented Programming, Systems, Languages, and Applications"} +@string{oopsla13="Proceeding of the 28th ACM SIGPLAN Conference on Object-Oriented Programming, Systems, Languages, and Applications"} + +@string{scool05="Synchronization and Concurrency in Object-Oriented Languages"} + +@string{hotpar09="First USENIX Workshop on Hot Topics in Parallelism"} +@string{hotpar10="Second USENIX Workshop on Hot Topics in Parallelism"} + +@string{atc="Proceedings of the USENIX Annual Technical Conference"} + +@string{ismm08="Proceedings of the 2008 International Symposium on Memory Management"} +@string{ismm09="Proceedings of the 2009 International Symposium on Memory Management"} +@string{ismm10="Proceedings of the 2010 International Symposium on Memory Management"} +@string{esop09="Proceedings of the 2009 European Symposium on Programming"} +@string{paste08="Proceedings of Program Analysis for Software Tools and Engineering"} + +@string{ecoop10="Proceedings of the 24th European Conference on Object-Oriented Programming"} + +@string{osdi04="Proceedings of the 6th Symposium on Operating Systems Design and Implementation"} +@string{osdi08="Proceedings of the 8th Symposium on Operating Systems Design and Implementation"} + +@string{toplas02="ACM Transactions on Programming Languages and Systems"} +@string{toplas09="ACM Transactions on Programming Languages and Systems"} + +@string{sc01="Proceedings of the ACM/IEEE Conference on Supercomputing"} +@string{sc06="Proceedings of the ACM/IEEE Conference on Supercomputing"} + +@string{ics95="Proceedings of the 9th International Conference on Supercomputing"} + +@string{icse00="Proceedings of the 22nd International Conference on Software Engineering"} +@string{icse05="Proceedings of the 27th International Conference on Software Engineering"} +@string{icse10="Proceedings of the 32nd International Conference on Software Engineering"} + +@string{pact01="Proceedings of the 10th International Conference on Parallel Architectures and Compilation Techniques"} +@string{pact08="Proceedings of the 17th International Conference on Parallel Architectures and Compilation Techniques"} + +@string{cc08="Proceedings of the 17th International Conference on Compiler Construction"} +@string{cc10="Proceedings of the 19th International Conference on Compiler Construction"} +@string{cc11="Proceedings of the 20th International Conference on Compiler Construction"} + +@string{asplos91="Proceedings of the Fourth International Conference on Architectural Support for Programming Languages and Operating Systems"} +@string{asplos02="10th International Conference on Architectural Support for Programming Languages and Operating Systems"} +@string{asplos09="14th International Conference on Architectural Support for Programming Languages and Operating Systems"} + +@string{vee05="Proceedings of the First ACM SIGPLAN/SIGOPS International Conference on Virtual Execution Environments"} +@string{vee08="Proceedings of the Fourth ACM SIGPLAN/SIGOPS International Conference on Virtual Execution Environments"} + +@string{lcpc08="Proceedings of the 21st Annual Workshop on Languages and Compilers for Parallel Computing"} +@string{lcpc10="Proceedings of the Fourteenth Annual Workshop on Languages and Compilers for Parallel Computing"} + +@string{pldi="Proceedings of Programming Language Design and Implementation"} +@string{pldi93="Proceedings of the 1993 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi94="Proceedings of the 1994 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi95="Proceedings of the 1995 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi96="Proceedings of the 1996 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi97="Proceedings of the 1997 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi98="Proceedings of the 1998 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi99="Proceedings of the 1999 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi00="Proceedings of the 2000 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi01="Proceedings of the 2001 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi02="Proceedings of the 2002 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi03="Proceedings of the 2003 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi04="Proceedings of the 2004 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi05="Proceedings of the 2005 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi06="Proceedings of the 2006 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi07="Proceedings of the 2007 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi08="Proceedings of the 2008 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi09="Proceedings of the 2009 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi10="Proceedings of the 2010 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi11="Proceedings of the 2011 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi12="Proceedings of the 2012 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi13="Proceedings of the 2013 ACM SIGPLAN Conference on Programming Language Design and Implementation"} + +@string{isca90="Proceedings of the 17th Annual International Symposium on Computer Architecture"} +@string{isca09="Proceedings of the 36th Annual International Symposium on Computer Architecture"} +@string{isca10="Proceedings of the 37th Annual International Symposium on Computer Architecture"} + +@string{ppopp97="Proceedings of the 6th ACM SIGPLAN Symposium on Principles and Practice of Parallel Programming"} +@string{ppopp07="Proceedings of the 12th ACM SIGPLAN Symposium on Principles and Practice of Parallel Programming"} +@string{ppopp01="Proceedings of the 8th ACM SIGPLAN Symposium on Principles and Practice of Parallel Programming"} +@string{ppopp09="Proceedings of the 14th ACM SIGPLAN Symposium on Principles and Practice of Parallel Programming"} +@string{ppopp10="Proceedings of the 15th ACM SIGPLAN Symposium on Principles and Practice of Parallel Programming"} +@string{ppopp11="Proceedings of the 16th ACM SIGPLAN Symposium on Principles and Practice of Parallel Programming"} +@string{ppopp12="Proceedings of the 17th ACM SIGPLAN Symposium on Principles and Practice of Parallel Programming"} +@string{ppopp13="Proceedings of the 18th ACM SIGPLAN Symposium on Principles and Practice of Parallel Programming"} + +@string{ispass09="IEEE International Symposium on Performance Analysis of Systems and Software"} + +@string{iiswc08="Proceedings of the IEEE International Symposium on Workload Characterization"} +@string{iiswc09="Proceedings of the IEEE International Symposium on Workload Characterization"} + +@string{iccl88="Proceedings of the 1988 International Conference on Computer Languages"} + +@string{micro05="38th Annual IEEE/ACM International Symposium on Microarchitecture"} +@string{micro10="43rd Annual IEEE/ACM International Symposium on Microarchitecture"} + +@string{hpdc07="Proceedings of the ACM International Symposium on High Performance Distributed Computing"} + +@string{cav07="Proceedings of the 19th International Conference on Computer Aided Verification"} +@string{cav06="Proceedings of the 18th International Conference on Computer Aided Verification"} +@string{cav08="Proceedings of the 20th International Conference on Computer Aided Verification"} +@string{cav04="Proceedings of the 16th International Conference on Computer Aided Verification"} + +@string{tacas11="Proceedings of the 17th International Conference on Tools and Algorithms for the Construction and Analysis of Systems"} + +@string{procomet90="Proceedings of the International Conference on Programming Concepts and Methods"} + +@string{dexa04="Proceedings of the 15th International Conference on Database and Expert Systems Applications"} + +@string{lics="Symposium on Logic in Computer Science"} +@string{lncs="Lecture Notes in Computer Science"} +@string{lcpc="Proceedings of Languages and Compilers for Parallel Computing"} +@string{vmcai="Proceedings of Verification, Model Checking, and Abstract Interpretation"} +@string{vmcai09="Proceedings of the 2009 Conference on Verification, Model Checking, and Abstract Interpretation"} + + +@string{ieeecmpscieng="IEEE Computing in Science and Engineering"} +@string{higherordersymbcomp="Higher-Order and Symbolic Computation"} +@string{ibmjrd="IBM Journal of Research and Development"} +@string{ieeetc="IEEE Transactions on Computers"} +@string{cacm="Communications of the ACM"} +@string{jsac="IEEE Journal on Selected Areas in Communications"} +@string{hpca07="Proceedings of the International Symposium on High Performance Computer Architecture"} +@string{conpar90vappIV="Proceedings of the Joint International Conference on Vector and Parallel Processing"} +@string{tocs="ACM Transactions on Computing Systems"} +@string{toplas="ACM Transactions on Programming Languages and Systems"}, +@string{spaa98="Proceedings of the Tenth Annual ACM Symposium on Parallel Algorithms and Architectures"} +@string{tpds="IEEE Transactions on Parallel and Distributed Systems"} + +@string{jvm01="Proceedings of the 2001 Symposium on JavaTM Virtual Machine Research and Technology"} +@string{ics99="Proceedings of the International Conference on Supercomputing"} +@string{sc97="Proceedings of the 1997 ACM/IEEE Conference on Supercomputing"} +@string{sc01="Proceedings of the SC2001"} + +@string{cgo10="Proceedings of the 8th Annual IEEE/ACM International Symposium on Code Generation and Optimization"} +@string{cgo11="Proceedings of the 9th Annual IEEE/ACM International Symposium on Code Generation and Optimization"} + +@string{asplos91="Proceedings of the Fourth International Conference on Architectural Support for Programming Languages and Operating Systems"} + +@string{ipdps09="Proceedings of the 2009 IEEE International Symposium on Parallel \& Distributed Processing"} diff --git a/writeup/evaluation.tex b/writeup/evaluation.tex new file mode 100644 index 0000000..1bf7c00 --- /dev/null +++ b/writeup/evaluation.tex @@ -0,0 +1,304 @@ +\mysection{Evaluation}\label{sec:evaluation} + +We have implemented \TOOL. Our evaluation focuses on the following +questions: (1) How expressive is \TOOL for specifying +the correctness properties of real-world concurrent data structures? (2) How easy is it +to use \TOOL? (3) What +is the performance of \TOOL? (4) How effective was \TOOL +in finding bugs? + +In order to evaluate \TOOL, we have gathered a contention +free lock, two types of concurrent queues, and a work stealing +deque~\cite{ppoppworkstealing}. As C/C++11 is relatively new +there are no C/C++11 implementations for many concurrent data +structures, thus we ported several data structures. The Linux +kernel's reader-writer spinlock and the Michael Scott queue were originally ported +for the \cdschecker benchmark suite. We also ported an RCU +implementation and Cliff Click's hashtable from its Java +implementation~\cite{clickhashtable}. We report execution times on an +Intel Core i7 3770. + +\mysubsection{Expressiveness}\label{sec:expressiveness} + +In this section, we evaluate the expressiveness of \TOOL by reporting +our experiences writing specifications for a range of concurrent data +structures. + +\mypara{\bf Lockfree hashtable:} We ported Cliff Click's hashtable, +which supports simultaneous lookups and updates by multiple threads as +well as concurrent table resizing. The implementation uses an array +of atomic variables to store the key/value slots, and uses +acquire/release synchronization to establish the synchronization +between hashtable accesses. + +Hashtable updates consist of two CAS operations --- one to claim +the key slot and one to update the value. When a \code{put} method +invocation successfully updates both the key and value, the +update is visible to other threads. Thus, both CAS operations are +ordering points for the \code{put} method, and we annotate both of +them as potential ordering points. The \code{get} method is ordered after +an invocation of the \code{put} only if it sees both the key and +value updates. Thus we annotate an ordering point for the +key read only if the key is null. We also +annotate an ordering point for the value read if +it reads the value slot. The test driver has two threads both of +which update and read the value for the same key. + +\mypara{\bf RCU:} As discussed in the example, this is a +synchronization mechanism used in the Linux kernel that allows concurrent reads +and updates. We ran this benchmark with four threads, two update the data +structure and two read the data structure. + +\mypara{\bf Chase-Lev Deque:} This is a bug-fixed version of a published C11 adaptation +of the Chase-Lev deque~\cite{ppoppworkstealing}. +It maintains a top and bottom index to a shared array of +references. In terms of synchronization, +when pushing an item into the sequential deque, +we attach a unique ID tag to that element. When stealing or taking an item, we +use that tag as the ID of the method call. Thus, we have (push, steal) or +(push, take) pairs that have the same method call ID. +In our test driver, one thread +pushes 3 items and takes 2 items while the other one steals 1 +item. + +\mypara{\bf Linux Reader-Writer Lock:} A reader-writer lock allows either +multiple concurrent readers or one exclusive writer. We can abstract +it with a boolean \code{writer\_lock} representing +whether the writer lock is held and an integer \code{reader\_cnt} +representing the number of threads that are reading. +We test this benchmark with a single lock that +protects shared variables. We have two threads that read and write +the shared variables under the protection of a read lock and a write +lock. + +\mypara{\bf MCS Lock:} This benchmark is an implementation of +the Mellor-Crummey and Scott lock~\cite{mcs-lock, + mcs-lock-url}. This lock queues waiting threads in a FIFO. +Our test driver utilizes two +threads that read and write shared variables with the protection of +the lock. + +\mypara{\bf M\&S Queue:} This benchmark is an adaptation of the +Michael and Scott lock free queue~\cite{lockfreequeue} to the C/C++ +memory model. We ran with two threads, one of which enqueues and the +other of which dequeues an item. + +\mypara{\bf SPSC Queue:} This is a lock-free single-producer, +single-consumer queue. +We used a test driver that has two +threads --- one enqueues a value and the other dequeues +it. + +\mypara{\bf MPMC Queue:} This is a multiple-producer, multiple-consumer +queue. Producers call \code{write\_prepare} to obtain a free +slot, update the slot, and call \code{write\_publish} to +publish it. Consumers call \code{read\_fetch} to obtain +a valid slot, read the slot, and call \code{read\_consume} +to free it. The specification focuses on the synchronization +properties which require \code{write\_publish} to synchronize with +\code{read\_fetch} to ensure the data integrity and +\code{read\_consume} to synchronize with \code{write\_prepare} to +ensure that slots are not prematurely recycled. The test driver +contains two threads, each of which enqueue and dequeue +an item. + +\subsection{Ease of Use} In addition to expressiveness, it is also important for +specification languages to be easy to use. In our experience using \TOOL +to specify the real-world data +structures in our benchmark set, we found that \TOOL was easy to use. \TOOL specifications have only three +parts --- equivalent sequential data structures, ordering points, and +synchronization properties, and we explain the reasons as follows. (1) Specifying +sequential data structures is easy and straightforward, and developers can often +just use an off-the-shelf implementation from a library. +(2) When developers specify ordering points, they +only need to know what operations order methods without needing to specify +the subtle reasoning about the corner cases involving +interleavings and reorderings introduced by relaxed memory models. Take the +Michael \& Scott queue as an example, we can easily order enqueuers with the +point when \code{enqueue} loads the \code{tail} pointer right before inserting the new +node. +(3) For synchronization, the fact that we allow specifying +synchronization at the abstraction of methods makes it easy. For example, we only used +36 lines to specify synchronization in a total 1,033 lines of +code (omitting blanks and comments). + +\begin{figure}[!htb] +\vspace{-.2cm} +{\footnotesize + \centering + + \resizebox{\columnwidth}{!}{ + \begin{tabular}{lrrr} + \hline + Benchmark & \# Executions & \# Feasible & Total Time (s) \\ + \hline + Chase-Lev Deque & 1,365 & 232 & 0.15 \\ + SPSC Queue & 19 & 15 & 0.01 \\ + RCU & 1269 & 756 & 0.11 \\ + Lockfree Hashtable & 30,941 & 25,731 & 11.39 \\ + MCS Lock & 19,501 & 13,546 & 2.62 \\ + MPMC Queue & 170,220 & 93,224 & 45.63 \\ % 1r2w + M\&S Queue & 168 & 114 & 0.05 \\ + Linux RW Lock & 148,053 & 405 & 13.06 \\ + % Results from: 2014-03-25-13:26 + % Flags: -y -m 2 -u 3 + \hline + \end{tabular} + } +\vspace{-.1cm} + \caption{\label{fig:benchmark_results} Benchmark results} +\vspace{-.3cm} +} +\end{figure} + +\mysubsection{Performance}\label{sec:performance} + +Figure~\ref{fig:benchmark_results} presents performance results for +\TOOL on our benchmark set. We list the number of +the total executions that \cdschecker has explored, the number of the feasible +executions that we checked the specification for, and the time the benchmark +took to complete. All of our benchmarks complete within one minute +and most take less than 3 seconds to complete. + +\mysubsection{Finding Bugs}\label{sec:findbugs} + +\begin{figure}[!htb] +\vspace{-.2cm} +{\footnotesize + \centering + + \resizebox{\columnwidth}{!}{ + \begin{tabular}{l|ccccc|c} + \hline + Benchmark & \# Injection & \# DR & \# UL & \# Correctness & \# Sync & Rate\\ + \hline + Chase-Lev Deque & 10 & 0 & 2 & 3 & 2 & 70\%\\ + SPSC Queue & 2 & 2 & 0 & 0 & 0 & 100\%\\ + RCU & 3 & 0 & 0 & 1 & 2 & 100\%\\ + Lockfree Hashtable & 5 & 0 & 0 & 0 & 2 & 40\%\\ + MCS Lock & 4 & 0 & 0 & 0 & 4 & 100\%\\ + MPMC Queue & 6 & 0 & 0 & 0 & 2 & 33\%\\ + M\&S Queue & 11 & 0 & 6 & 3 & 0 & 82\%\\ + Linux RW Lock & 8 & 0 & 0 & 0 & 8 & 100\%\\ + \hline + Total & 49 & 2 & 8 & 7 & 20 & 76\%\\ + \hline + + % Results from: 2014-03-25-17:08 + % Flags: -y -m 2 -u 3 + \end{tabular} + } +\vspace{-.2cm} + \caption{\label{fig:injection_results} Bug injection detection results} +\vspace{-.2cm} +} +\end{figure} + +The next component of the evaluation examines the effectiveness of \TOOL for finding bugs. + +\mypara{\bf New Bugs:} In the M\&S queue benchmark used +in~\cite{cdschecker}, the dequeue interface does not differentiate +between dequeuing the integer zero and returning that no item is +available, and it passed our initial specification. However, after +modifying the dequeue interface to match that in the original paper, +\TOOL is able to find a new bug that \cdschecker did not find. The +original test driver for this benchmark performed the enqueues first +to make it easy to write assertions that are valid for all executions. +\TOOL allows specification assertions to capture the behavior of the specific execution +and thus is able to discover the given bug. + +\mypara {\bf Injected Bugs:} To further evaluate \TOOL, +we injected bugs in our benchmarks by weakening the ordering +parameter of the atomic operations. These include +changing \code{release}, \code{acquire}, \code{acq\_rel} and +\code{seq\_cst} to \code{relaxed}. We weakened one operation per +each trial, and covered all of the atomic operations that our +tests exercise. While this injection strategy may not +reproduce all types of errors that developers make, it does +simulate errors that are caused by misunderstanding the +complicated semantics of relaxed memory models. + +This fault injection strategy will introduce one of two types of bugs. +The first type is a specification-independent bug, which can be +detected by the underlying \cdschecker infrastructure which includes +internal data races and uninitialized loads. The second type is a +specification-dependent bug, which passes the built-in checks +but violates the \TOOL specification. These include +failed assertions and synchronization violations. We +classifying bugs as follows. If \cdschecker reports a data +race or an uninitialized load, \TOOL reports the error and stops. +If not, \TOOL continues to check the +execution against the specification. It first +checks for violations of the preconditions and postconditions and then for +violations of the synchronization specification. + +Figure~\ref{fig:injection_results} shows the results of the injection +detection. The column \textit{DR} represents data races, \textit{UL} represents +uninitialized loads, \textit{correctness} represents a failed precondition or +postcondition, and +\textit{sync} represents a synchronization violation. The detection rate is the +number of injections for which we detected a bug divided by the total +number of injections. + +\mypara{\bf Linux Reader-Writer Lock:} Our initial specification for this +benchmark did not allow \code{write\_trylock} to spuriously fail. +However, when we checked this benchmark against that specification, +\TOOL checker reports a correctness violation. We then analyzed the code +and found that \code{write\_trylock} first subtracts a bias from the +\code{lock} variable to attempt to acquire the lock, and restores that +bias if the attempt to acquire the lock fails. In the scenario where +two \code{write\_trylock} are racing for the lock before the lock is +released, one \code{write\_trylock} can first decrement the lock +variable, the lock can be released by the original holder, and then +the second \code{write\_trylock} can attempt to acquire the lock. +Even though the history indicates that the lock is unlocked, it +still holds a transient value due to the partially completed first +\code{write\_trylock} invocation. Thus, the second +\code{write\_trylock} invocation will also fail. As the second +\code{write\_trylock} serializes after both the first unsuccessful +\code{write\_trylock} and the \code{unlock} operation, +the sequential specification would force it to succeed. We then modified +the specification +of \code{write\_trylock} to allow spurious failures so that our correctness +model fits this data structure. This shows +\TOOL can help developers iteratively refine the +specifications of their data structures. By analyzing the \TOOL +diagnostic report, developers can better understand +any inconsistencies between the specification and the +implementation. + +\mypara{\bf MCS Lock:} Three of the weakened +operations are not detected because they cause the execution +to fail to terminate (and hit a trace bound). We +reviewed the code and found that weakening any of those three +operations makes the lock spin forever. + +\mypara{\bf M\&S Queue:} Our test driver does not cause +an enqueue or dequeue thread to help another +enqueue thread update the tail pointer, which corresponds to two of the +undetected injections. + +\mypara{\bf Lockfree Hashtable:} Our experiment only focuses on the two +primitive methods, \code{get} and \code{put} without triggering the +\code{resize}. We were able to successfully check all executions from a test driver for the lockfree hash table that generates executions that have no program order preserving sequential histories. + +\mypara{\bf MPMC Queue:} The undetected injections in this benchmark are +primarily due to the limitation of our test driver. One +synchronization property of this benchmark is +that \code{read\_consume} should synchronize with the +next \code{write\_prepare} to ensure that a slot cannot be reused +before the consumer has finished with the slot. Our test driver is +unable to reach this case so those injections are not detected. + +From our experiments on concurrent data structures, we can see that +\TOOL checker can help detect incorrect memory orderings, +help developers refine data structure specifications, +and help determine whether strong memory orderings are really +necessary. Since \TOOL checker is a unit testing tool, it is limited +to small-scale tests to explore common usage scenarios of the data +structures. As a unit testing tool, \TOOL was able to find 100\% of +injections for many data structures and to find 76\% of the injections +on average. For our 49 injections, 10 of them were detected by checks +in \cdschecker, and 27 additional injections were detected by +\TOOL. This shows that by writing specifications, we detect +significantly more fault injections. diff --git a/writeup/example.tex b/writeup/example.tex new file mode 100644 index 0000000..3ee4f3d --- /dev/null +++ b/writeup/example.tex @@ -0,0 +1,165 @@ +\mysection{Motivating Example} +\label{sec:example} + +We will use the read-copy update (RCU)~\cite{rcu} implementation in +Figure~\ref{fig:rcuexample} as a running example. RCU data structures +are useful for usage scenarios with large numbers of reads and +relatively few updates. RCU based data structures scale to large +numbers of readers because read operations do not contain any +low-level store operations and thus do not generate coherence traffic to invalidate cache lines. +Lines~\ref{line:rcuBegin} through~\ref{line:rcuEnd} contain +the code for the RCU implementation, and +Lines~\ref{line:testcaseBegin} through~\ref{line:testcaseEnd} show a +test case for the implementation. + +The RCU implementation maintains a shared pointer +(Line~\ref{line:rcuSharedData}) +\code{node} to reference the data shared by readers and +updaters. A reader loads the shared pointer (Line~\ref{line:rcuReadLoad}) to read +the shared data, while an updater allocates a new struct +(Line~\ref{line:rcuUpdateAlloc}), loads the shared pointer +(Line~\ref{line:rcuUpdateLoad}), and then attempts a compare and swap (CAS) operation to update the shared pointer. This process repeats until the CAS is successful. + +\begin{figure}[h] +\vspace{-.2cm} +\begin{lstlisting}[xleftmargin=6.0ex] +#define mo_acquire memory_order_acquire +#define mo_acq_rel memory_order_acq_rel +struct Node {/*@ \label{line:rcuBegin} @*/ + int data ; + int version; +}; + +class RCU { + atomic node;/*@ \label{line:rcuSharedData} @*/ + public: + RCU() { + Node *n = new Node; + n->data= 0; + n->version = 0; + atomic_init(&node, n); + } + void read(int *data, int *version) { + Node *res = node.load(mo_acquire);/*@ \label{line:rcuReadLoad} @*/ + *data = res->data; + *version = res->version; + } + void update(int data) { + bool succ = false; + Node *newNode = new Node;/*@ \label{line:rcuUpdateAlloc} @*/ + Node *prev = node.load(mo_acquire);/*@ \label{line:rcuUpdateLoad} @*/ + do { + newNode->data = data; + newNode->version = prev->version + 1; + succ = node.compare_exchange_strong(prev,/*@ \label{line:rcuUpdateCAS} @*/ + newNode, mo_acq_rel, mo_acquire);/*@ \label{line:rcuUpdateCASMO} @*/ + } while (!succ); + } +};/*@ \label{line:rcuEnd} @*/ + +RCU x, y; // Define two RCU objects/*@ \label{line:testcaseBegin} @*/ +int r1, r2, v1, v2; +void thrd_1() { // Thread 1/*@ \label{line:thrd1} @*/ + x.update(1); + y.read(&r1, &v1); // r1 == 0 +} +void thrd_2() { // Thread 2/*@ \label{line:thrd2} @*/ + y.update(1); + x.read(&r2, &v2); // r2 == 0 +}/*@ \label{line:testcaseEnd} @*/ +\end{lstlisting} +\vspace{-.2cm} +\caption{\label{fig:rcuexample}C++11 read-copy update example} +\vspace{-.3cm} +\end{figure} + +\begin{figure}[t] + \centering +\vspace{-.3cm} + \resizebox{\columnwidth}{!}{ + \includegraphics[scale=0.33]{figures/rcuhistory} + } + \vspace{-.4cm} + \caption{\label{fig:rcuhistory}History of a possible execution of two RCU objects} +\vspace{-.4cm} +\end{figure} + +This implementation uses low-level atomic operations provided by +C/C++ to implement the RCU mechanism. For example, in +Line~\ref{line:rcuUpdateCAS}, the \code{update} method uses a CAS +operation to update the \code{node}. The memory +order parameters attached to the atomic operations ensure that memory +accesses that were performed before the \code{update} operation must +occur before memory accesses that were performed after the \code{read} +operation. + +\mysubsection{Consistency Model} +\label{sec:exampleMotivation} + +In the example code, two threads, Thread~1 and Thread~2, each update +one of the RCU objects \code{x} and \code{y}, respectively, and then +access the object updated by the other thread. Under the C/C++ +memory model, this example admits an execution in which both Thread~1 +and Thread~2 read the initial value 0. + +Figure~\ref{fig:rcuhistory} shows a possible order for this +execution in which the model checker processes statements in the order shown in +the +execution labeled Original Trace\footnote{Note that the C/C++ memory +model does not include any notion of a trace. We merely use the term +trace to refer to the order in which \TOOL prints the execution.}, +which is an interleaving of the invocation and response events of +API methods indicated by \lq\lq\_i\rq\rq and \lq\lq\_r\rq\rq, +respectively. + +This trace is rather counter-intuitive because it orders +Thread~1's \code{update} event before Thread~2's \code{read} event, +yet Thread~2's \code{read} event does not observe the updated value. +However, under the C/C++11 memory model, this is allowed since a load +is allowed to read a value that is written by an old store. + +It is important to note that it is impossible to produce a sequential history +for this example that preserves program order and produces the observed +behavior. This means that traditional notions of correctness that relate +concurrent executions to sequential executions that were developed for +the SC memory model cannot directly be applied to the C/C++11 memory +model. + +This example leads to the following conclusion --- if we want to +define the behavior of concurrent executions by relating them to +equivalent sequential histories, then we must give up on preserving +program order. + +We note that for this example, if we give up on program order, we +produce the sequential history in Figure~\ref{fig:rcuhistory} +labeled Reordered Trace. The data structure operations in this +sequential history have behavior that is consistent with the observed +behaviors in the example execution. + +\mysubsection{Synchronization Properties} + +A correct RCU data structure ensures the property that the invocation +event of an \code{update} operation happens-before the response event +of the subsequent +\code{read} operation. Informally, all operations that appear before the \code{update} operation must appear to occur before the operations that appear after the \code{read} operation. While these +semantics follow naturally for SC, for relaxed memory models we must +ensure that neither the compiler nor the processor performs +reorderings that violate these semantics. Therefore, when a reader +reads the fields of the +\code{node}, +data races are eliminated since the \code{read} operation synchronizes with the \code{update} operation. + + +In the C/C++11 memory model, the transitive closure of +\textit{sequence-before} and \textit{synchronizes-with} relations form the +\textit{happens-before} relation in the absence of operations with the \code{consume} memory order. Since every time an \code{update} operation finishes, a CAS operation to +\code{node} with release semantics is executed, and the subsequent \code{read} +loads the \code{node} reference with acquire semantics, the \code{read} operation synchronizes +with the \code{update} operation, providing the necessary synchronization properties. +Some RCU implementations may use consume semantics instead of acquire semantics, +however we do not use consume for the following two reasons: (1) most existing +C/C++ compilers do not support consume semantics and thus acquire does not +involve extra overhead and (2) using consume semantics provides a more complex interface to +clients that may require them to explicitly declare dependences throughout the code. + + diff --git a/writeup/figures/CVS/Entries b/writeup/figures/CVS/Entries new file mode 100644 index 0000000..998018a --- /dev/null +++ b/writeup/figures/CVS/Entries @@ -0,0 +1,42 @@ +/fence_sw.dot/1.1/Wed Jan 14 22:53:32 2015// +/fence_sw2.dot/1.1/Wed Jan 14 22:53:32 2015// +/fence_sw_r_collapse.dot/1.1/Wed Jan 14 22:53:32 2015// +/fence_sw_r_collapse2.dot/1.1/Wed Jan 14 22:53:32 2015// +/fence_sw_w_collapse.dot/1.1/Wed Jan 14 22:53:32 2015// +/fence_sw_w_collapse2.dot/1.1/Wed Jan 14 22:53:32 2015// +/ff_sc_rf.dot/1.1/Wed Jan 14 22:53:32 2015// +/ff_sc_rf2.dot/1.1/Wed Jan 14 22:53:32 2015// +/fw_sc_rf.dot/1.1/Wed Jan 14 22:53:32 2015// +/fw_sc_rf2.dot/1.1/Wed Jan 14 22:53:32 2015// +/lockhistory.pdf/1.1/Wed Jan 14 22:53:32 2015/-kb/ +/release_seq.pdf/1.1/Wed Jan 14 22:53:32 2015/-kb/ +/rmw_atomicity.dot/1.1/Wed Jan 14 22:53:32 2015// +/rmw_atomicity2.dot/1.1/Wed Jan 14 22:53:32 2015// +/rmw_mo.dot/1.1/Wed Jan 14 22:53:32 2015// +/rmw_mo2.dot/1.1/Wed Jan 14 22:53:32 2015// +/rr_mo.dot/1.1/Wed Jan 14 22:53:32 2015// +/rr_mo2.dot/1.1/Wed Jan 14 22:53:32 2015// +/rw_mo.dot/1.1/Wed Jan 14 22:53:32 2015// +/rw_mo2.dot/1.1/Wed Jan 14 22:53:33 2015// +/sc_mo.dot/1.1/Wed Jan 14 22:53:33 2015// +/sc_mo2.dot/1.1/Wed Jan 14 22:53:33 2015// +/sc_wr_mo.dot/1.1/Wed Jan 14 22:53:33 2015// +/sc_wr_mo2.dot/1.1/Wed Jan 14 22:53:33 2015// +/specdesign.pdf/1.1/Wed Jan 14 22:53:33 2015/-kb/ +/specworkflow.pdf/1.1/Wed Jan 14 22:53:33 2015/-kb/ +/wf_sc_rf.dot/1.1/Wed Jan 14 22:53:33 2015// +/wf_sc_rf2.dot/1.1/Wed Jan 14 22:53:33 2015// +/workflow.pdf/1.1/Wed Jan 14 22:53:33 2015/-kb/ +/wr_mo.dot/1.1/Wed Jan 14 22:53:33 2015// +/wr_mo2.dot/1.1/Wed Jan 14 22:53:33 2015// +/ww_mo.dot/1.1/Wed Jan 14 22:53:33 2015// +/ww_mo2.dot/1.1/Wed Jan 14 22:53:33 2015// +/ww_sc_fence_first_collapse.dot/1.1/Wed Jan 14 22:53:33 2015// +/ww_sc_fence_first_collapse2.dot/1.1/Wed Jan 14 22:53:33 2015// +/ww_sc_fence_mo.dot/1.1/Wed Jan 14 22:53:33 2015// +/ww_sc_fence_mo2.dot/1.1/Wed Jan 14 22:53:33 2015// +/ww_sc_fence_second_collapse.dot/1.1/Wed Jan 14 22:53:33 2015// +/ww_sc_fence_second_collapse2.dot/1.1/Wed Jan 14 22:53:33 2015// +/rcuhistory.odg/1.2/Wed Jan 21 22:50:28 2015// +/rcuhistory.pdf/1.4/Wed Jan 21 22:50:15 2015/-kb/ +D diff --git a/writeup/figures/CVS/Repository b/writeup/figures/CVS/Repository new file mode 100644 index 0000000..aadc881 --- /dev/null +++ b/writeup/figures/CVS/Repository @@ -0,0 +1 @@ +Papers/15/issta.cdsspec/figures diff --git a/writeup/figures/CVS/Root b/writeup/figures/CVS/Root new file mode 100644 index 0000000..cd8b2f1 --- /dev/null +++ b/writeup/figures/CVS/Root @@ -0,0 +1 @@ +:ext:peizhaoo@plrg.eecs.uci.edu:/home/cvs/Papers diff --git a/writeup/figures/fence_sw.dot b/writeup/figures/fence_sw.dot new file mode 100644 index 0000000..1d4bbd4 --- /dev/null +++ b/writeup/figures/fence_sw.dot @@ -0,0 +1,20 @@ +digraph fence_sw { +margin=0 +ranksep=.3; + +N1 [label="A: fence(release)", shape=none]; +N2 [label="X: v.store(1)", shape=none]; +N3 [label="Y: v.store(2)", shape=none]; +N4 [label="Z: v.load()", shape=none]; +N5 [label="B: fence(acquire)", shape=none]; +N6 [style=invis, shape=point]; + +//N1 -> N5 [label="sw", color=blue, penwidth=3, constraint=false]; +N2 -> N3 [label="hrs", color="#555555"]; +N3 -> N4 [label="rf", color=red]; +N1 -> N2 [label="sb", color=blue, weight=100]; +N4 -> N5 [label="sb", color=blue, weight=100]; +N2 -> N6 [style=invis]; +N6 -> N3 [style=invis]; +{rank=same; N3 N4 N6} +} diff --git a/writeup/figures/fence_sw2.dot b/writeup/figures/fence_sw2.dot new file mode 100644 index 0000000..ed4ec19 --- /dev/null +++ b/writeup/figures/fence_sw2.dot @@ -0,0 +1,14 @@ +digraph fence_sw2 { +margin=0 +//ranksep=.3; + +N1 [label="A: fence(release)", shape=none]; +N2 [style=invis, shape=point]; +N3 [style=invis, shape=point]; +N4 [label="B: fence(acquire)", shape=none]; + +N1 -> N4 [label="sw", color=blue, penwidth=3, constraint=false]; +N1 -> N2 [color=invis, weight=100]; +N3 -> N4 [color=invis, weight=100]; +{rank=same; N2 N3} +} diff --git a/writeup/figures/fence_sw_r_collapse.dot b/writeup/figures/fence_sw_r_collapse.dot new file mode 100644 index 0000000..ee169e1 --- /dev/null +++ b/writeup/figures/fence_sw_r_collapse.dot @@ -0,0 +1,18 @@ +digraph fence_sw_r_collpase { +margin=0 +ranksep=.3; + +N1 [label="A: fence(release)", shape=none]; +N2 [label="X: v.store(1)", shape=none]; +N3 [label="Y: v.store(2)", shape=none]; +N5 [label="B: load(acquire)", shape=none]; +N6 [style=invis, shape=point]; + +//N1 -> N5 [label="sw", color=blue, penwidth=3, constraint=false]; +N2 -> N3 [label="hrs", color="#555555"]; +N3 -> N5 [label="rf", color=red]; +N1 -> N2 [label="sb", color=blue, weight=100]; +N2 -> N6 [style=invis]; +N6 -> N3 [style=invis]; +{rank=same; N3 N5 N6} +} diff --git a/writeup/figures/fence_sw_r_collapse2.dot b/writeup/figures/fence_sw_r_collapse2.dot new file mode 100644 index 0000000..6cc0981 --- /dev/null +++ b/writeup/figures/fence_sw_r_collapse2.dot @@ -0,0 +1,14 @@ +digraph fence_sw_r_collpase2 { +margin=0 +//ranksep=.3; + +N1 [label="A: fence(release)", shape=none]; +N2 [style=invis, shape=point]; +N3 [style=invis, shape=point]; +N4 [label="B: load(acquire)", shape=none]; + +N1 -> N4 [label="sw", color=blue, penwidth=3, constraint=false]; +N1 -> N2 [color=invis, weight=100]; +N3 -> N4 [color=invis, weight=100]; +{rank=same; N2 N3} +} diff --git a/writeup/figures/fence_sw_w_collapse.dot b/writeup/figures/fence_sw_w_collapse.dot new file mode 100644 index 0000000..3c0a864 --- /dev/null +++ b/writeup/figures/fence_sw_w_collapse.dot @@ -0,0 +1,18 @@ +digraph fence_sw_w_collapse { +margin=0 +ranksep=.3; + +N1 [label="A: store(release)", shape=none]; +N3 [label="Y: v.store(2)", shape=none]; +N4 [label="Z: v.load()", shape=none]; +N5 [label="B: fence(acquire)", shape=none]; +N6 [style=invis, shape=point]; + +//N1 -> N5 [label="sw", color=blue, penwidth=3, constraint=false]; +N1 -> N3 [label="rs", color="#555555"]; +N3 -> N4 [label="rf", color=red]; +N4 -> N5 [label="sb", color=blue, weight=100]; +N1 -> N6 [style=invis]; +N6 -> N3 [style=invis]; +{rank=same; N3 N4 N6} +} diff --git a/writeup/figures/fence_sw_w_collapse2.dot b/writeup/figures/fence_sw_w_collapse2.dot new file mode 100644 index 0000000..f1325f5 --- /dev/null +++ b/writeup/figures/fence_sw_w_collapse2.dot @@ -0,0 +1,14 @@ +digraph fence_sw_w_collapse2 { +margin=0 +//ranksep=.3; + +N1 [label="A: store(release)", shape=none]; +N2 [style=invis, shape=point]; +N3 [style=invis, shape=point]; +N4 [label="B: fence(acquire)", shape=none]; + +N1 -> N4 [label="sw", color=blue, penwidth=3, constraint=false]; +N1 -> N2 [color=invis, weight=100]; +N3 -> N4 [color=invis, weight=100]; +{rank=same; N2 N3} +} diff --git a/writeup/figures/ff_sc_rf.dot b/writeup/figures/ff_sc_rf.dot new file mode 100644 index 0000000..981e3fe --- /dev/null +++ b/writeup/figures/ff_sc_rf.dot @@ -0,0 +1,18 @@ +digraph ff_sc_rf { +margin=0 +ranksep=.3; + +N1 [label="A: v.store(1)", shape=none]; +N2 [label="X: fence(seq-cst)", shape=none]; +N3 [label="Y: fence(seq-cst)", shape=none]; +N4 [label="B: v.store(2)", shape=none]; +N5 [label="C: v.load()", shape=none]; + +//N1 -> N4 [label="mo", color="#00aa00", style=dashed, penwidth=3]; +N2 -> N3 [label="sc", color=purple]; +N1 -> N2 [label="sb", color=blue, weight=100]; +N3 -> N5 [label="sb", color=blue, weight=100]; +N4 -> N5 [label="rf", color=red]; +N2 -> N4 [style=invis]; +{rank=same; N4 N5} +} diff --git a/writeup/figures/ff_sc_rf2.dot b/writeup/figures/ff_sc_rf2.dot new file mode 100644 index 0000000..40f84ce --- /dev/null +++ b/writeup/figures/ff_sc_rf2.dot @@ -0,0 +1,18 @@ +digraph ff_sc_rf2 { +margin=0 +//ranksep=.3; + +N1 [label="A: v.store(1)", shape=none]; +//N2 [label="X: fence(seq-cst)", shape=none]; +//N3 [label="Y: fence(seq-cst)", shape=none]; +N4 [label="B: v.store(2)", shape=none]; +//N5 [label="C: v.load()", shape=none]; + +N1 -> N4 [label="mo", color="#00aa00", style=dashed, penwidth=3]; +//N2 -> N3 [label="sc", color=purple]; +//N1 -> N2 [label="sb", color=blue, weight=100]; +//N3 -> N5 [label="sb", color=blue, weight=100]; +//N4 -> N5 [label="rf", color=red, constraint=false]; +//N2 -> N4 [style=invis]; +//{rank=same; N2 N3} +} diff --git a/writeup/figures/fw_sc_rf.dot b/writeup/figures/fw_sc_rf.dot new file mode 100644 index 0000000..68ead64 --- /dev/null +++ b/writeup/figures/fw_sc_rf.dot @@ -0,0 +1,16 @@ +digraph fw_sc_rf { +margin=0 +ranksep=.3; + +N1 [label="A: v.store(1)", shape=none]; +N2 [label="X: fence(seq-cst)", shape=none]; +N3 [label="B: v.store(2)", shape=none]; +N4 [label="Y: v.load(seq-cst)", shape=none]; + +//N1 -> N3 [label="mo", color="#00aa00", style=dashed, penwidth=3]; +N1 -> N2 [label="sb", color=blue]; +N2 -> N4 [label="sc", color=purple]; +N2 -> N3 [style=invis]; +N3 -> N4 [label="rf", color=red]; +{rank=same; N3 N4} +} diff --git a/writeup/figures/fw_sc_rf2.dot b/writeup/figures/fw_sc_rf2.dot new file mode 100644 index 0000000..6f947b1 --- /dev/null +++ b/writeup/figures/fw_sc_rf2.dot @@ -0,0 +1,16 @@ +digraph fw_sc_rf2 { +margin=0 +//ranksep=.3; + +N1 [label="A: v.store(1)", shape=none]; +//N2 [style=invis, shape=dot]; +N3 [label="B: v.store(2)", shape=none]; +//N4 [style=invis, shape=dot]; + +N1 -> N3 [label="mo", color="#00aa00", style=dashed, penwidth=3]; +//N1 -> N2 [label="sb", color=blue]; +//N2 -> N4 [label="sc", color=purple]; +//N2 -> N3 [style=invis]; +//N3 -> N4 [label="rf", color=red]; +//{rank=same; N3 N4} +} diff --git a/writeup/figures/lockhistory.pdf b/writeup/figures/lockhistory.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3563feaf3937b7420cf9b49b3955379e2e28180a GIT binary patch literal 19791 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ý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%0DDI9DIj@-_w?eTBEQ9l~hL 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 ZaaC3V;+YH&03bjASf2Z;Fw4u;{{x`cCE)-7 literal 0 HcmV?d00001 diff --git a/writeup/figures/rcuhistory.pdf b/writeup/figures/rcuhistory.pdf new file mode 100644 index 0000000000000000000000000000000000000000..07df89cb02131a3ca510d58270d9eb1266f17fac GIT binary patch literal 20096 zcmagF1CS;`xTZU8+qUiQY1`e?w)=0}wrykDwr$(CZDV%k+_UH0-MbsNDyrhkFSD|u zs@{xvE9)t;Um{|3O!TbKWCMi*odeASxzNmnjD)s^7SKFA3^D*4QztV*mcJQA1~GFh zCx8Qkn3aJOKm=f9YYgDygLZUs02o+9yJanDPDGNA!1eh0isr(7E0(90>tm@?T=?0_ zfjdBQSzAG{zz?Q=y^wqrURV1}d1)LYqq`KEC$~TPJO**g>e>8B?|-yzEeTJ*0Z0)+ ze}2ff^mwy;eTXG~e|)8C%|a~La*&n#>5&H>S)r3w`tg3PT%Fh+rhR`*d|!13%@-bKeE%R)4wk$V6~;Y@yT3PkL9*2nU!4)m@Ne?*611WrCl8fk zuiG~~=*at`=Im7A>Z$-G7vkzbh)7;@MINluy2jpb;2mpXwq;fLhuwJPL3BB8o(T%V z6VyBkP?c}*C?GL`b?sJ$ZHtRy9_No>x6~>{W>&QB-Z&WTJr9IWsPyp6mh zceaQw@7UDc>r0JjucLNIwGL@-$4|7uh{QNtOL;VOOZ%F?j9v*n&#IX5ewJ>AFJOO` z!76eeJD9v#?-@#{sRXwTE>?KM4%!fDXD_<6IG$`U1UU;e8j^4w8+G`7tSOJ zhyEmjvQOJT=o;?Dm+ULDBV1@l+Qq%f!Z9WLfO_sQOC}uu!h-&Wu>=P*i^A*rzLbrtuH!DZzohRx zR#UnGIlO?Z?Z$7hl+gTTVIJ6L_{k(HfSnqYfHWLGr_3fPaWz_kH`_sVYyr|cM}{8x zoPi^`M_^NDA(bTVrVN~B2+!}v#E;w38?dw+g;kF6ug zInoLrN>R1-X+9;%GuhK6(*AZ6q9^F}-Uc}N@gHTpnn7}jg^gxmr*L6i!t*}nv$tXY z(K#f$Y9s;c`xnXx!X8Q^XQ97%g)1XO@K15tCGaD&AsNFltnbUFjauABJq3zADrpKO z6Y4T^puIexxH&tec>(M_>tCm%{V31{(@0iG2`_^27MkJIQCKody>==~o*D8zc*sSl z&NeK$s+c)&2BTKB*tAShX_>bA_VJx0`JZqg(?ecoX83eHg#f4KgD}ZDtx82jT{_mY zHZ&Nmb`~1+IRhse>Pee6q-{+m43?~BVV#ZS9EDkS_N0x-=39}m(WWk7d>xYdqIaVb_*fng|JrXip|Ka)Ej~wjz8aqo2-cR8+%& zNxT0*8--an)d}@#i&2dX>1YvmTdJVUq4)PwJQL~D&@}QdWVVVY+{|F(M<%VwVB9wC zD5BC>+py2&OTp6|T@JS1Kj!dDJR=p*tx?pBlfm@CAu_vZ75aw`dBDrd$6NdSFUEKW zo>Kdtr_q&-+w};SCOHY?q=XZ!ks`k&!IIgZtUC*v;XGn!OO{mc2t%xn@cOjH(hp~jl zU%y@a4Jlz^4TODxs=@=&0Q3Rgjl)#@`?nZ4atC|>{CO{&ohN%Uqho3_*c*1(q#68T zdE($*Rh=38{fF4+WHSlHf`E+4VPJ}(GI#23L7_!E;aH5^=IornF(^{Ea=< zWCeCu#(6`2Y9BI?ToZSA#>8@&C1`W_oV5y^vRIGKQg$1?X)0#@kbeiC%261Rs!?0{ z#fHt0(XCL@W#b6N15u82Ri z+`{i4{5r~4gK*m#cXI>n=jBR}ECC8cEX{pb9Wi(WZ{CdfzX);_l!ZWn=)De!<4MOE zj``8bBYJTQ~%Wqw{z#lziW-vB?%j^VM=v5Uwx#gM8^3VTkO zx0q$pY@*ue-kFS_2cR)4!i#sQWp?5iRua=726U-fzTjLkl%OCOu;><*s^#RLSoH z%$sKIwaPT@Y@}4QaBHWq3LB4<5!5<8#kw-i-og0c&38xq8D5#@dSk0Nv*(5w?;~eF zsdRAOijp&XC-69jf^iDgsVBL;9qWq+^Mef78t@{mpQ4`gvg#hCyd`XW_=MHCh{d=t z9&r0O)hv7MxAmo!XqI0R))J9t4JI-BgiUD~Ix@b>Ox_tQhiR@yg<r8 zY>lIyk}OpA!mJAH1dq>FeXZI=jp>epz=-OxC|-H)vo!sFtOOPzCew8kC7dWOgVhQ< z`k?(CLb(Q>H+@$;G>(k{4npEfJEpogHLq(nHpLB;c0b|YB0M220kw29P%2lfs&T^@ zn-1v;H1~Zjgu;lUM4nGd@Q^LEL^RL6gqm(*b<5xk@PI=+=G=QE^`NfPW{LlRegeew0 zp5ZeKk`o`!rSZ`&X9*Xfm4(r+7XJ@+l|g@kP>;UYFQc9Xg|_|B8Zj6h8MRO1*iS|E z($zn1B208`?*0WmjytIK(@{dWbtvY77 zTyMDCM<-z`vgV0~F@EOL_!vw+;seQzyz)4?NRe0^Rm;-p%?8)SG)6?&3$2(Pny&Sp zQ9q!$%4Je7A#8FaBL!N>eATwaD-0|*$&Ob!g}oX~5bj?HS)Mfzd?yLQSPSQEsjdy^ zF^)OMm)Y}7M>^JD6@1nZ%p4!RT{A8VQ%!4C9@!-r&9eo!;uaoNkbJhQhh{{i8>41custR-i!p`6L47Lfa+dM znJ|l6z4oO3o{0F8f21+^G`{zx+Pf?Z#2uAvdjob8q%X}Bdza}VW_gNT@CBOaALxPx z*ckt(IsO~{^V87(Z1lf?nUjU}U-f?^+5SInoBjXdw*S+OGZ8W|vvD&1zrFX7hozg+ zO4F|HM;6JMI$z4+3y9W?2eU*GT#rjRKmpz3LGhr1`sF$cN zk-3mnGEXTXgp`b#%%9c#VB?tls%tDLvzt88#cqRiXJzA8+9vtJ2B_yUU&2&@`Ee%q zgKdn{w1($Z)3WZrosWe7UN#@HW>8!Ur2lEP4$zy_6~{bM4pGqX z3+$84jD7bX3Zd2>#C!~omgq-Ze4QsKA~9ph_Vtqo7uSv{cp>I$Vna~^Vh_`o3#hTl zJ_oU#=iY13I}Ta(ZoCP+4e*Xm>CKMXuE~=+?b@vl&r*OoVB`vX_p}AI1htIv_VXc&i#49eV(1AOj_CwVdQVENc1_0<#9@q% zWtPLod)~c$%C@eI#*R5+KXSUC(hPRX%E$9!2E(M*+FtL3Jr244dKjQQ!91hjw%K(9 z|IY5>q&fEq=`7uQo>DvC+Ejfxe*sSgD zYp}V>*toE*a9nA(D6gPat3W%d7?+Zch*Yhn)K0k>)yl|B%uY@>kXEY zI=?|1w8h3#j>p;9xn5nGWV?Sqtt3r6)k6t7t~StRTG}{k$!$C=uYkG@i_{{a&}oO?y}L|<;n`d z#c&_v$aZjm0800~YpCUHcb9{JTzAr~UtQHsZf2@@vBJ=(%}sRGknTCm5U7CKHGV4K%aSueS`U;n}&1IIA*f(s%(7t`U_4o%`GGTqJQ&+KnAKk zrV(@s&-)khb)}`ZH)FAZqhp*&`yn5L;jNZ|QiLL^^aM}z$&CsMD`*CYbvb3_0fO!? zNec7;Be#Il-|--KDH z5~wDugD3o2%g%iK*o%B>~&6JsW2pmuU{Y5)fn}GD;6>l?-@=J!gS) z%beTAPHD3Mq;JAf8RuXxLDHvKdMz3JRPB~5?cFRJ=Vg!`iJ&YQ&(3e8%(FD7AF|-u zWOTqxQ`mY?(Iz(m9#lXr$V;O`NuQaRV$ZD_TBd+dk!QKUVTm<4s%2u$3>_)IE1riN z7GgmHt2lv~OcPAyJrX+rw`{r>n)8-+-tubVv8i3M#Wd}=Ht+{!tARm2?zf016OHsi zpJ7kM2*f1Oj6AucQUTO$j`X{1s;=PBk<2@mkn1Xl5El$%{Ju*;6H5RVb_l z3wOA@`a?DIRL`Oh zt<66mf{{T@WKu6~w`VyDQ1L`o0LIBuYj(~pwsz8{Qnj^uY%b1|iez6{fBnJOk*%p2 zUx8^GDyoawfKhV1Nqe00HF)M`>T4*^v6THT39=Jsdqi8ypywqA-trsQ7V9K0&JFYO<)`w3K6vcu~mQ7Kx z#F|X*b6S(Z(n-3Ia(3|4@d)wc6(y}BM4n$GvT)kZ)V5p>vh{1vn5YT8Uz4K{+poG04U@C} z@XX&k;30O>qzk6<3mS9STWYJ7!a=#sx}utIuM_9 z9G1W>B!OPatI*gQENUNVW@3^dJ%s`hDHcf{(VAagx4O=WPF!anxoK~Y)}#vG`dNNP z?NJY1t{$9a;z$F>bvFc;pLS^#3nqRkLK_{;=AJO+E{6bxGjV3NVGvI5qFvn@2ad@L8H{*o&%nP!;Gn@%3i6ytxnDV zYYvOjYOhamR&!;u&mrFVnp%hW&=6s6!6E-QzXj>J9cn6xU=J%XUP>#3`!0a>j{V!_ z8|vFVXGF2klhKDYXINb7E^Cbpn;eudKqC%JW%sFHojA=YXEXvb3{jSeNWQ|YV`?lQ z9zb03;2`8*0Jk-{U3^s1jF(Y@rfC&CojlEHnnh zWbv#{Ue=`9n?Nw0uX!HTx5t4Ax<59FYAoNWaVugjrDtMfP37X39o>||=Td7wjA(Ae zr3~YbMuVchUWkrsm%^?{#EsC%6soSZRcm@8EV;TlmGO!+x*_Y zNGF<%=X0hwe0!hnx=5O1g^Lg_q362+q-ZL(r-Q=&vyDQ@7U#@sSt}(+-V=g=lAF?2MUnmN)gtF<2@qnV)x~$CrQom=Rh%xGiYPz(-~O zk$!VC^UW)V<+k!ddLMa<#}@HKBn@dV0aDOjvyegr6M00$0?j|nPNf17tBs6zp-T>Q z5QdyD#_C7^We}BdXm-)s?2yo4cQD**{b!nxDQ>9w!EKx43FzC~$)BGCsb1e9%?9KM z2YgTRrI|v_Ju52D=CJEK#P$7lJ3C2+*bNGFgLlq6cjp;SL)5m_drv}fVzkCo%yy%8V!pfqf z*UDMdj9lG!zAP2>8V@--8o6$9v9VgcX;x54QQu-%bsc9}*u2@AJBPQPR-R#Or?xAU z(E%4te0V~kJVD)NWJeY;T=e`g!$VZ@sw=GAzRZbU%)-^keF6y%hWlHR@pC3!;e$w7 z;^yVqb@CqkFruVjyKlp%fg-FAA$ld>G1{aE^##1P*K;J2i6&!H{|~Kdd*i zTSEuUZfK~}Z)T0oxf>QZd5~4FyfyvtGPKeWbM_pIc;3K$hcN`~Zn!?@t}7f{VXr&B zJV%E=&Yw=-@H)I~g|equ)3+2SHzjG>@SoC9on~z+a-**Kza3AU@59TpbXGMbIX`3=zI{-bHyt zI3-wc{3#52>aL4Awa%FWolod6Xr^mL%dWVM8A*r9&+KDzsLRpMbg(d-8np>TavG%} zmRdLBHalu(OBig%n9rpr)7TzurQ@Q)7J(b4%_L633FV4zu{%$&*+F`mqF(^Igj^X% zC>-Dhi`BJDT6dFo(ZEv`2iI>3fm)ThTK0%TJWvMtjN6aeP^V z5DeBYwaRiQ4Cy#}AjC1+Ier#yog@>|>nu>C`9defePCoKiCId2>OKc3V<^_;$5W9P zNhr#L2MJ;1g5@(3H(dnIjWd}bLm_)r&H|JOy4}tBAf&i2;TJxc2S6qx>vsAn85G$box&L)PE$#0YA zFM_`AHSz5r%COI~OAr*3`~eNA(VrKEZlh2nnzpJ$eZVv{xMia#N#iN%ES1JM^ia_wWk*ur_`zlI_k7`>|wE7UWklBHeud2S7KLOPZ^>+C;)jUaI?NH3Z{vd-H z(IP%{>Yi3VDJsDghw>J(D2%_0Qj@B2U)zAc0UG&AfJHLNod4ARdJ!*f`uZfO=C8UX zQ&krO>|M=9;9ji6VX`Dg8l$Yom`dmDj+NrnQKq*P=g_Q_HMj)=5%sF@BxwoR$k#Un z?p$2jqbCHr&1!F#?%VYSs;VlRxz_atzG$1FIFAs-JcJb(^aQbOl?i!iM*NTHRa2w3 zg0fncr*CDCklsYlYjSbOuIR>us-OcoVAug4H&i7B48Mr;AI89T$1sk<=j75`aqg2m z=EvAmTPB+3;1(?0Q>c^2g{P_o@rcshqD@Zf)jy+`1r5$Mb0aQ2UbX<2gYPNEx75wyt(KXT{*4RQnz2IXm1&p{ z)n~j7#U|ek&4(sidx8or>dKYx`qeG0^~7EL9Qh$es+K zC(?I2R$lZsC(BEw6B$O68_BJZ`C9>_-!xBrqBD;N}e~~0v}R{&k)s67L6SZZPut^^2Zx>Qaq#)iDP4XY#ojXP%T&VUX1%L zvdpF^i%MAU`FW`A=izVmEgc9^Mm5?%Bo(;8k1>2 z0@w*4gaJ`MVZqiaS8uNy)p3a#R_C5jbzjOuq?h2XA;&%uLNt)Jmu~>>x&hvhCrl$p zA{6^!yXmZjA&dis*Qm_7<`eMNGUOg>Bu-4c*4=TH;?2?idhd`!H-_?9X*MAr_Oxk}6 zDlX{?4nXg&Fqc$xIobUEHa8|ZNl+-Xn1FI7vakTBym)vBVKMc}ez zOA5=trp^;ZI+>OJc1_F*UJYs4rWj3+x@YRZ-rCiq?s+4&OjXbQeNp*5_e#2uGA|VhbfdO6y2>|_MUA90LpHngEE_huViDfuPZVMf&K#{AeW+a1OI$@|S1c-2 zt}1osI=b~;lvJ%vH5|N!J-)7^P0?3US1pEjeDwbei7!8TCXTBe+vRsv(tkwyetv~+ z;&68_CFbsYROMw;{7gM`_D!73rLptvPn$3{B|CFuS=W#(mVQFy6g;-Otse<<$!ANP zk~a;c!Wr)GfvIgsD3rjs?q3ZdB51)>BkLoq%Y~j~A`j2z3-Y0Uoo_%s8YW55f*(Dg z)xJ~vk`tJj{3B&|MPxHj)q~74?>&WdzQM^i-o#Qa=*%?|BSk-*o1#tD=|2gn2Ie8@ z_nVP!76lj<$_SVZO4VN%?Z;h4Xi;q<70|KJ(n7zeftUdDrmp!3ja8Y`S5$y~#6K}PJUf@KA?SN#be*{bj_4uXL zf*R2CuHlDpCCC69q={#Q4%7+|+qq@ zs9wKJ=yEY$UOijC!0%8YJa10=dis{wuHu{$;Kp&dL400#cX7A4hpK&ac!6wn8@QKw z!SvA$MRyzU2c{k!)pY7Q!|eSL16%B9*&(=vBdPZluo>Toqwwqm+7S?VhIg8XhKaiH z@Oba=!mgj-z`Z5D)BlaowAt?1y0f#jGo<-&LPx2`#>vBqxlFmcag?~?1_G4pYxkQ0 z5tG`U^Sb?_n#VS+6~_Fb9lV9RyPTep`S9ZT?ZXqIcEjD<|7s)SlW#d!fZ+Kq1pfs# z|Ngr#r&nj&fZ(FX*YreHPfY+GmbglOJLC&fK-Ko9cBUo!$*H9HPRIL8$NPSCS8i=% z=?Dk=F zMB++Rlb{%gq2HC*ChpM-@X1e7%K>MIQ5)sft-T_6$Zl;VMov1B^bhJ%{AO%AxV`1l`6y&oio5)B3N zID5K41UgN8&f|W)*IvG(!Q}tUM5`XxYxNi8Z z)~xmB=bbb6VKFob0EtG2($!Q7Uqq*CHB;*kptt7(jNWj%t>A~)B9$MwhckOh@-a^+ zYB5i~ttsj??U&2XGzDsep z@8<}Pm5vO7C;flF=EG#UKzb6j_X2qJ?0vT0`W^~SZLmyoMeg2OSx|E{9Cd z+80nt$_^fP&sOASvX67!cm~ehalvEzEJt?JXqMh{W60ITW94wOxyO(A^ZA5E@cr|` z>!5ye0WF|lP@J}tT#19n+Ck_zE~C5*_H)(Rb?Yo2EL+d|kNUfOze(!Q&J z-Q)K(nbsC%1Nseyw%wTXkm!guq8{RkF_2PXTkoQXKPwPW#gejt1xIv-TjH33rYSb7 zY#M#~vCKR4pbnFLt1?a`1Q31iq4EKEN7r|NkBztYubVa8AmP4AxXUv3MsVlQfWk6o z#|PBj0lF9dN5nFjDg<;ZGkBN6=0%7Oq+eK!A%0xW)H%w{pr8KPE-r$Qgg_lzH>QZS z3B1ZBg8DB;Yzc3FUsXX}kbAZWe)JHScK+D^ss%IX$<6!n!*%<(BD$jl0<#qadW8%U z`S_B!5%=*W)PX1?H~8C7NXXVri;kI* zg^-Tr?~aL)m5Y#ziBX3^(#gQe+(^*I)Cxez2+bhqXaulvBIIIZgJ$@5u73qOW+o=IlBqfv`2E7 z_ZxmOaQTLuNKNM&vbP<}$8r6MVa?*-AgOt)>pA??kW6jfhSw#SelevL+RA<)$rBf7 z=%soD_t^=@qia9?05_%2gZ@8gjO)K2#(&9)LCM+B>7TZg9h?FGkrgs<1pIrV|5sI+ zJ2*NCn;AI#Q;Uqjf5yx#&ZX6C;_`CHGz!t!4^ zHbzFm|7gR=2+i@I_3TWHg#Yp!|J$)T|BvGSdms@08z+j;49d1DHs=2zdcuFQ`(JeU zx2yl1z-MCm*XaMC#s7kWIJww4{}(2R%TgKVBzcFU00UV91bv?<9E*u3NDx+{6Ydmf z-@u;?(ILos4Ov2c)sGR`<#L$KT%H{&+^9u%Bdgsyi?w5e)byawMKkM}b(;O^jLTVW zGm)=(BlL`YgEceG#5FPNiaex?1^G3emG|np2k$Ji?dHbkmI7(pTT4kKQ%;RZIp(OlBs6B&fvI0SfVzkKZ|qWEBKsm&Oyp- zkW@S2BgAuNH=fRrXPC8fs1W@v%iWX^Jdkc0UO$~pncg5z&##eh%Ld(yMU@~Q&ZdE@ zvtu^7DiXhwKtG9hCuNL(He0TIi~#*%5{hVO2sb`AP16+)lY{zPYg@f+skYPw`ZNd{ z6&4t{MXI*?0RWbZLoSo47WkvbaE5k<=A`YxF)l7X^g)+e2xmTr6tujf&Cjq2mSLyY zaqwq3GWzvEDl5__aM_-Z-H^)zuggzYaE1uK%WFVy(oY+Xeh9r%tR~-e_GJzS)7MPL z^?)aCLX>|*lQp_Jk09?R&vfo&Ze{LlGFxZ&kKXb0Q})CGtmsv$XS+Cib2cM$iuBun%z5uIe3L@ z@l5Q7Q{tbg{&K$|_>AxFCLa#rdctjgZ$7=ux<6Xih6`9C1#=wjgnY^Em>h89_;tqe z2zUh&R{O%o&HVmiBz`^l)kh(Da)nYuw!BY#3;9m}j<8R0YTh3kgTfHlWMfY6gUlNd zH^7Sx8}%9*>a~p*2$FO4<=w@5eNCUbU~qG3wzIsvKEJuBt~auzX)&3Mb_B303#VT^ zR>XFWkxDO$nUqr98b}&Xg%g$?(yga*3o}B+EDi=yYncj>$k*7eJ&HWlTgO&?}kIYG>mC3gUSM zbE5pNiO+PkJ5y(>jw@Dey3bcDf@|+F^#)uz-YojcP2C*vXQHW?80bpWP409+Ck)hf zI+Kydei6fL=z$+!iSZOk9x72l_%1JX2vw7;DjfG<%60rAL4Po8HZ<@n^Kqfioa64+*a$gd0u1+AkVa5)Jy5$D~B*-DCvM!Nl2V5>GEA`b= zUeGpe6kmc0WCg>P9d4-jGiG;L9a?GW_6#8%3-pl9t9iR*##(wB7W$7ER;57EE-?M= z^s8!U*F*YF0VM@b*}7Aj*g%)Q9-o}p|zHlra|*y zY$XD5ywDC}oJ|iwKhX;m4Y-}3tkn~tC|A$U7c#|U&n6Uwe`Joyz+yuam3rgQ*5m#J znuTN}NeEI$hxW{Ys%LUZie~8?z(8Fl4-$`ZAjdSEWNE{01M8qtM)u%X!m%<@==1oD46tW6Li9iR;z4e%Eg(~4Q0@6OVxXsSMVwPZ~B0jW`*x6j(t369|bG4kRD(=qVK!k}ga;Tmtd#4iF`hVHg-P z_sSe!tboG`Y?i<}MKm7-Q?HB}iYffZg++mg-!*y|W1yfPU;Jknq!&}{np_zCMq3b+ z278UM5xwqEJ7~Mk?~Mhgbb-`?>E54KWn9e?ZELPDbp2S8zinDYi-6p;QVQ0|qFSFH z9K!9F+DQ|?>%Vv;e}tt-_|u||o*dODAgs?A`P)pe9i?PC$Zml)sD=<|L`sAF`EqJG zB$Oy!?sv5PNyt7$qvas?XLBoY(mh0Rd zY>@L>3ip=7{fP>VS1#t#s#>ylT2aT^|*_LC4-Rk&;@3tL^E()y=Zb_c-P!TE+|- z%a6|c4G4)l2D~l%{K>tiech!)P8X8m)4$)ssKH`v0$q=qjPcBGo{Ip106cYNO}C#c z2yY}E;*NTVE8XKER$0;PHfLk zrDhzTFkkJ{!?s~Ys~87VcAp-(vN9^yJklgvVtHe=RZ8rDn* zvwmbpSq@zR*_PKU@O#@*^Kv0)IcF(BGiL901DE|NM^#s)no?5ET+Ji7uzs{6kGfM4 zukwsK)EgK5Ww_iM%`tD*;&fIlLs(t9)BveT#7LNe=#}2Olx!7&Oz(bmmBp6V?KZum zT}Zy`ZFVnGoO|VaZIxABt--RiLLgbR1y-F_FtQ5=`|f;T3oYu zdh=|(V=C_ECwdi3(o?kadDCJWm24Wc-NqoP>Mt* zV#)Np%k}BJ4c*2b&G~)Gl6?jk5n(q{mSlCb=8YGT-lkh}Kr05oB#e^52 zyk0i<(hxuE>vX$TR+<-dWyh2i%YqnJzm&YUQC#gb)|!2L*4usEGBe^V7S}+hiIXg% z_iddAUb@4QXS1+BTGl`1EOk|u3{KYZj=U4Ek<}osqS~VIhRDDl1aLM`zj5@w zD)FT224^|V=&r4*h#M?^@*E@NWWTRFvAiL3|F(TK}4te_M2`zN4_mK++ z2NqnGu4${noPb<1y0%~rQ5Q?<#ta8yYC30Sys5cc8E-sTGkAMtJeV-HfmBnG9=c9jBd%GT$s1KO!Dfdlh6$bhg3lsRs%RYBEv*>c_hNi^A78ZAwonNBvektN<18(ZsBLvD#{ z#tQyaRUvd_gQQS|_h3%^_;USbK=GDNCa=OXNGSt^SWE*nx9Xw3DA2Tph0SwgqlK2H zR$0n&3c7of40ZAtk3+C(^{-#|U|g!BM?Xn2YnF~rJe|Nabp(BYiVB>frb_}*SDj}r zzJDhkoS%oR zBp=62^){xN8#%$%`P|Wycv5P6nJ9E z;%_>(G+5=cCdDWz`?Bo11C5V>Y(}e&Coj%Co}wgb=?A#hX{(2PVsm_e9059?XEBG6 zT98ov#!yJ>96XDCNzex!9%8v^!yX_;0Ee}oj+_#$4NC4WZ9kP7hT|QpPKN_2vf(`f z!ltnnGPC!z=q%wa%5HrJ;t7fyQ!|cEx(k zHk=+_W8Y=3%FpJ!V*dT--NDTTx1ua`@vvr=HFi6{E{j>aW5(S!O2ZosJn7tU+d8;+ zlqjwgr^{$Gr*z~5XXUtwhrEhmIdXxN9-#H!>1b`dBDsFtBj%E~s-s+ME*|&Nt0rbK zk0>V58gE&tJ}G6lfLOPlAfEB=51I`B>qJ1KjK{k(pA;=n%bTb z01_HOmkrp!OWc^sc8nFzRp)N$@P3c%pnHhk$&Xlq7;)M#)U6|c^~b-IraYd%Jq4DMYGE z*dgZb^-Us;SIimS_|Y7w4foFbyyr`bPjo^$kbqD)B9dDl$IpV{PdPeH@0JK7DIbUc zyyWMaAH4(nVxmg4$>z5gl>#kms*kMlo13K;^lVOzr4|)XAdRIS5;6P2T#Jh*+%w$^ zT{zSSn-#q1Mh#NY8)}r4`o4|JKn3PEKzN&k5!-WC)xk#6mKj94~$t_n%NGWS;CXK7P?7dgxQXL zo#aaqd|J?Q{_mNwuadeJlGAv9aSTOPn3&e8;;ZjK%Z?!_OKyVcYfOG7 zB_o>tt!!-Ju$hh^ZF(3p#IU`G6ka*B< zHMTzWjmzNd#Eu?K zM)5Ku0BUhic2*|9OkPQW7Rt8WxE~J6nJXhx7$b6Q*#DmRU<6@!Kt-PXV+|AJE_}+* z!uXFiEjwMMlkVfIgqH))G_LFw>k&Ur)7F=P68+;+l>2`)a^`VOTw5GxF^{Dx4@51k!W6_kFEdFd$)F@Afgq@W;DRDT z2mz5L7sw}oHlol01s)!59B8Uj3$dg4-5dp=g5)JQ8SWJM=d(G!F zFu9z$=iJ{t_x^Fd%#AWza^K1=dzG2mZ^-jGx=}i6#OQ_05SePN(X4J=Mhe7I-^OyI zxHS?!96S4`PK)M^l&ojdY8cO};sdKy8;v90?@CQ$@q6;?o0sfdK!4W5H|1or?l;F0 zD|0WfSi{5r%6;*wckYF3i@&_@S=WWAEckT#nB61&_B1`Ole#%PraO;R#rSUM+Y)Q> zwnE~0Q$I{KU}ee?^&Q(=)>|j*57Hi|#-y`OvG^Jf$_#B==3r$d+?4P`oKl!|Kuy_64eV)L*_5A_g2%Sd>w7l;mss-+} zHzv1?GwvR)8Ho9yZ!FPA9iCcSR5kEqDgP`-;yu8Ki0tC`bE z6PrakCLNBKC6#AHUs@2g=y_5i&GU8zPxPDY_|P`#W~-2wCZ5H*j(V->tr zvT7TRy%#z*N4th5N4pX`_P_0=c5i4?gE?gx(QQ%ei>`MFGm9%~->wm7$jU++UljMX z_YHQ{JqSNDnA2}ox@WzWW2IAHt)S~A zY6pGuV{HdhYi}39_8!ZoSNM6X`p42p*1>bR1Ny6U?KS&;e<*#5wfbZw-q~(sl2&l- zQ|2!Pj|*goSd^bRvv+&m`&XCiO8D-?5XM_I=kwvJOBSl@Ei+i1?8I%hZvW~`n8aws zr>+x*ao4l;{hhUU$Hr9+CO58)^g!v>2$h9zZZx&7sqgt*WRzN`vH0a}GoO9XTpzV#8)t#~vD>ut@~hqNEc>(O z&F{~KzMq!kH5fd!r8MSo6Dp-HqUs%ttq()Bs+Uxw)y2HbTp8QM8oH*_Mwp-4F5DC0 zeaqFQcS~x%&hD_QBKqOJj>^wBpCE;a$DiCibK~NZGSeiZZ%Vs6tvksPVdq#CaR<*B zGPR?)Dsxn_lGd1YezPw3=+7TLelgq2S8-_2%-TTSQp&b%Utm*{xaY|6^R|>#7TKyu zdY#=SlczOaMWOaEhY4yv&S~ z9h636jB^o0;Y676TKt!a_7}9noeJ#`IU-+=5pFX^c|hMvn1?Znc@Q!kupTm|%y|F; z`g^1Ye{^cpBd@3{*VxBi#{F{24S1_|iUPZ0P2DAVoliMDJ+@Can;8=4zR2gKAt$SF znz%`$@;~bHobOFf^waN7j$}m!ef!Got>%j#2NPUMoV^OY@^=VzG7mK`j=6ntar8{s zo11WSDe<$p&Gl2?n=IcU^&5agJqv@^H91!h4e7-ti&xxG=abH=TuOibx}!O+$TdT{ z-ykXP6m`Z%IF@O5(>&3@$)R_}?1#-FDfDq!*uUr1l5bmXx7fWSi_gfC+U1>T7$AX}~|7#{{$005Xlh@45uf!XN2(l8W2>Bw_1 zX@hr=uW%*LlE;H#lmf#vF1RpoQNabk7#W6P3c{3Q+92l5=HiSXP!0_-7 zVgV|GRLja8jt4yg4?Ap|cZ3sfaB~-ElZ4{7s6WUM;NS_I97>/OCGs[6 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + Adobe Illustrator CS4 + 2012-11-08T19:47:19-08:00 + 2012-11-08T19:47:19-08:00 + 2012-11-08T19:47:19-08:00 + + + + 256 + 120 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAeAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9LXvmXQ7HXdN0G6u1i1b WEnk021IYmVbVVeajAFRxVwaMRXelaHFVlz5v8p2qSPc63YQJC4ilaS6hQJI0ssARizCjGa2ljof 2kZeqmiqAs/zM/Lu8svrtv5m0trURpM8hvIE4RyOI0aQMyslXYL8QHxGnXFVSL8wvJc+oWGn2urQ 3dxqbBLJrXlcROxSWQL60IeJSUtpD8TD7OKrta/MDyPoi3/6V16xtZNMUPf27zxmeLlE06KYFJl5 vEhZFC8mH2QcVVW87eTUleF9e09Jo/W9SJ7qFXT6tH60/JSwZfSiPOSo+FdzQYqvsfOHlXUNQj0/ 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 FjtYUjUiqBT8Rrsq/wD/2Q== + + + + + + Adobe PDF library 9.00 + + + application/pdf + + + release_seq_final + + + + + 1 + False + False + + 558.000000 + 261.000000 + Points + + + + + TeXGyreHeros + TeXGyreHeros + Unknown + Version 2.037;PS 2.000;hotconv 1.0.51;makeotf.lib2.0.18671 + False + MyriadPro-Regular.otf + + + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + + + xmp.did:01801174072068118F62BC2FBF2D0DDE + uuid:b6550317-f02c-e943-99b1-a50cb06f5ab2 + xmp.did:F77F11740720681184ABF8CADCB1BF49 + proof:pdf + + uuid:ba4dbd99-36b2-2d4a-a0d2-e8c58b81b3c8 + xmp.did:01801174072068118F62D9F7CDB3ECB2 + xmp.did:F77F11740720681184ABF8CADCB1BF49 + proof:pdf + + + + + saved + xmp.iid:F77F11740720681184ABF8CADCB1BF49 + 2012-11-08T17:43:18-08:00 + Adobe Illustrator CS4 + / + + + saved + xmp.iid:F87F11740720681184ABF8CADCB1BF49 + 2012-11-08T18:19:13-08:00 + Adobe Illustrator CS4 + / + + + saved + xmp.iid:01801174072068118F62D9F7CDB3ECB2 + 2012-11-08T18:34:52-08:00 + Adobe Illustrator CS4 + / + + + saved + xmp.iid:01801174072068118F62BC2FBF2D0DDE + 2012-11-08T19:47:17-08:00 + Adobe Illustrator CS4 + / + + + + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/Font<>/ProcSet[/PDF/Text]/Properties<>>>/Thumb 12 0 R/TrimBox[0.0 0.0 558.0 261.0]/Type/Page>> endobj 9 0 obj <>stream +H‰ÌWÛnG }߯˜G莇œ{ßjÇPÀ(Ò胮Ç-ìNÚ¦Ÿßùh¥UKN ++‹æpx;‡ÜãŸNÕñù©Q'/NÕ@J>Þ Ç/_õîã`”QÞ'Åâ·Ãíð‘üáؤ¿¨?£½a…'ɃYýür`õI9u®.ˆßu£†G‹¤œÍšBðŠ’×^]?”›tÌ°Œoç¼Â?­µjÌ^3iòAdc‘_£×)fH¢ÓތD8IQtX§„³äY›VFpˆ’ÑQ §““@ØhŠP†]+Ñk\¢¬…;±á V1è`Þ:9í3— ®‡»áõð +Ÿ“e‰Æ”D.éR^Þä´1¦*÷¿ƒb‰%'§–Ã⇣å’Ê”¡³¼ßW!'U ª€‹üS.¸&ÐýHl‚U`c7úW05Áûv-wM骂·í–Ô¯ýuщ]BM%Û*¸X|w”áï›å"64·í綻Æ}3Ýݹ€ +›ÅU3•ÝÙÊT÷òHÙé'-TÚÊpœgØ~ƒ ó᦭ wGx–a$ø©îxºód#Í-Ü®ño¸6nZtÎmäýl¹›. + €#&J Ê%ð':ðQû Y¾/ЪŠ@ÕÚ©È:dxŽ׉„ 0 +Á=~_w ¯WÏ9hÊõkØ~Òd“Œ@œÓÁ5`ouÈoO'¨™'Iƒ'w™Ëe#nOÆ+'ì˜ÁsN!>J0 +¢òÂz-ÍêfhL¡tVí¶k=ÀӒ_yoJå^¹¤c@TlPɘ©$ã¡&#ùÞ¶BÁ…{q½'ò³ÞŠÏ ÃŽ‘9X/ÐñD¸Ê(¤ÙöÆ]ur?>¡°«\Ío¸n‚þû±Ûè>ýݶ ~ï˜ëaìÁÏBT¨EM¨Üªª±yLAt ±Ã¤C×0چbR–}U`ò(Dš:g=çH4e†£Ó0 ×0¤¨­V)@ +:ã²CZ‡Ô…pnÀ¨'f0~Ôlž¶|{xÛ¸Þ%úˆÌâ¶O¯í ÓOnQý¬.w2¼.§ F0·jƛ#ÊxT¹É[]כj>]¿Šûw Ú/pÿÖ°Þâ~{@§~ŽÚØYM›XÜ°m¹©v.¸8‚ײWÁ¢þ`<·TÌøŸS#–¼(¼¸7M[0RÊ9+&Ò!Áâ5õÑþþ‰`ª÷³@P  ¸k­£˜F$aqºßÛ[ö 6ž2ODºUáÛºîÄÂÔ¯âáEU ®×ýÐh½ +G’ÝÕ]»‘Ñ5î:1öîºlqµù]màäy×­6Ž'#û( ÝR›÷_ÅþW8±Vöò ‡|L(<¤î¡¬®è´€Mjd#öü„•Òdê2yp@.‰=Y‘ý`ët.¤Ž7-Ì '˒ÃÛÕ!Ôî ¼Àå5.„ð̀g¹Ì4þLr¢¬È  Ž(öǝ•%®¼§bÈùìâ&îzµowÖað‹ æ¥á'_¶RHou +Í×zj³LY +„иV&Ìn–°n°cÒ²æRºƒ*ÔG»óHd +_õ¦ÓRzô–¬ÆëÃ~¯ÕÙ$1‚ †\8,ø-/KX„²pëÁ]v~ªðõŸÒj‰ endstream endobj 12 0 obj <>stream +8;X^=acXLq#Xrl5!h:6uI-P+\M-NSacjlKJm&EpL/R(-:5Mo"@rfI.==)2c"%X:Ua-9Wt7C;u[ +:bOoR%n$'j&P3-EB-'m6Q?j0^Ak"Gfd%mUtM,X&9FB!22>F!O5]<*CYKrfdBFp\@$ +GZ%N63\rfIN*Se]%P1]:F^\4GQ;OqUCXmM'Wha.32p33moLj_\WI#0,K3QG[k2^I0q^H'>7amk"$WP12 +]<;58LL#1)~> endstream endobj 13 0 obj [/Indexed/DeviceRGB 255 14 0 R] endobj 14 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 6 0 obj <> endobj 15 0 obj [/View/Design] endobj 16 0 obj <>>> endobj 5 0 obj <> endobj 17 0 obj <> endobj 18 0 obj <>stream +H‰|T Li®¢»ªaÔV(‹u»fªj=@Q :è ‚ˆ‚$ŒÝÒÜØ݀JëDéæÒu‚àȀ8Š‚0\‚ 2^Èpj{Ž'‡ºÊxìh^áÏl¶šÄd“M6ùóþÿ½ÿßûò½W…cR ÇñÉ˼6¬÷öŸ¤Úè½C£òQi´æ8'0¸0E*|9žFóQΧOŸüx9Q˜dÝöå/m0 1û7>Äš¨HµŽŸ¿h‘³£ÙºŒY7GÞyÞ¼ycօ_¦LWñ;´:Uœ–_‘ ILЄéTJ'~Yl,?¡å5*­J“lhtªñžßÁ;Šñu¼øæ[WGWwg'~µX9LÉGiyU”N­Òða"@d”XC#æé4aJU\˜&†O0ßü—»õÿÐá£ây‹Ž2{:1¨åÃâ•sE”„±* Iñ:M”Jë4wE`ЎDïÎ+U[1Qìpl†MÄ0c0lªóÄ°å¶ÇVãX†­“aSÍ⭝ï±zìö§ñüïø#‹µ?X|”|%q’KÇKWK›‰IÄZ"¸A<$ƒÈ<™Dæ-+’õ[αŒ´¼i5ݐÙ" ·à¢Þ"ɔ +†‘€Q 9è*–Â?ƑˆG—h0;£‡e£äwcgXŠDŸZió ™=9j£4aä2þëm lñ¥ýÜ|6Z¢ =hr‡;ÛCz½  +V(À·hÓös +̸-@èŽ'Ý09 6ZÂFo ý±ÞäMû6D!ò B´×LV>;/gÉ}dEÿÔԒҧ{§è—'òIþ–r=Øà­0Nzºªôä¹*m™Z­IŒŒ,M¬àä¹ÅÉBç£ÌÐ?¥ª@oût„õ$©^4õë" ډlRž›iŽ˜p$Â[jȖ]¼@ÀW0¥Æ+^¼Fü2ßø­›ÙŸV'N7Ÿ¾Æ —¯YéðµZŒœ¹>D°L¤a ÛÁ¿_H@¯èª’“•Uº²È(Ͷ­j3ôQú?19àÅɠ{"ÇB;uOð5} © ±;GÓÄíυÄÙjâXÝêeAmn]îϖÙd®27âèæn´~Šüçý=PÐ ºn›»ý ôyA}¸›M§ŸjL¿Î€ÅÝãõ\噒óWo=/­:ÊæÈ(¡ïDÕ.Å¥¤u[xԅñ_³ŸŠë_Kç”äÔ0×b–ø‡Ì㍬™~û÷­çúýèC%Ï3à7d‡dpÈ×~òŠÉÊIbåúL¤ß‚(~G찇0…F§M£øŸ …I&tÒ¡€”µøe‰§t“`h‘É“õÑɐÙ:m* ì)Õ,̇úuä;4sMÀNM{<€(©hÊodÞdå-W*öʐÖ´UÈJáÕ²â÷Þ֊ê“lI¥^C< œ5ÖÖ)6ÑTó÷{ {ÙðÝ᫘ͪ²«ÿ¼èµ‘“wéûTÉ’^ˆM±1õùAªÙÖ4•ºÅbŒfïTó¡âÌúU]Nìc‹g° ìÜÞ¢ K£‚c9#\q!ûG—ÓÙGròØ®c—ë®1¯ZÜg!I°§Óª uí»8CnF^žB¤¿)`}xõ D°Lë5Ñi›˜Ùßô‚ôíõÇ ¹p6M_Ìï&òµ¡ùä<áÈÍ|5ì:/å•pòvýMåg²Õƒpª_”Ç~$„FuFYuRH¥'ƒ¬ìk‡ìŸÏ«WkÛÊÆä8èFÜ'gÍõ +á‘Ìeô ½;#͐ÆR;»‚#˜9!ÿØöÛó® ¡Aù\Ž>+U¯õ½àÑS;ðê'÷T"„C2›•L1,Z€þæŠHd‡ìg‚ý¶¢‚rvW±;F©÷cœ=›aœ‘Ëê ÛW?bޔºepr)þ\»añMüQ¿–Ø +®`Ս¬Êdw~è¼SVt`>{¤‡8¼sÛá&|óž˜h.B¹kµ·BçãÓ=ê*“·Šù‹L¢¸iô“íœ' ³òå³ME 5W˜Ç§|—p¨|je°xZotì¾Ômlbj’n·ÆÒ—rô£ˆ²=å=à67w ^‚«­°}Áèvõ®ačŽNÒÄÅkÏT—ž.O*‰/N 1W5— Qà‰ˆ²øÖ^qržAœyQM¶Ï <š]xèÛPPÛÐÆtW-åPý3h•æ=˜ÏÖVW]dú*ƒæp¨ìTÉÀñÎ746-)žMIMIIM°4’W’7Õø2‹¿ÛšÈÄ!L@,%³#²#6*äú.Áª ¯‚Æ! ” ûhôWÞ¹¢9ïgƒ-X‚õ}ðû9ïÇWÒÔN_„p?7Wÿß>>?ÿú_œü:òJÿ>ïÛûy’†{B÷ $õ°%»>»†u'©aÃrÂH6j7Uy23•òEö/fqÿRuÓI.›„‰Ò=†é{Xÿ”õ:fVèãaÀ~¹÷¼«14¸ÀŽ^ŒZR €Íø +ÌÀà÷à³¢w­¼}À÷ÎÇáÓ_µ8ªL¤o³¯§©¿¸®zž Ëœq`˜Z$KK=Q´\ãkËs¤uabmlL_]›pû@€Ôcvø4ÎèápèøÒ1@HÖûœ°R•`£pt ¬}´­¦‘‘œ‡Î‡~}‰sZz­Ç÷™÷Îû÷»€ÔbvøxwÑã÷|ã¸ørøx3û¼zˆ{†c{bbP> endobj 10 0 obj <> endobj 19 0 obj <> endobj 20 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 14.0 %%AI8_CreatorVersion: 14.0.0 %%For: (Brian Demsky) () %%Title: (release_seq_edit3.pdf) %%CreationDate: 11/8/12 7:47 PM %%Canvassize: 16383 %%BoundingBox: 6 14 564 275 %%HiResBoundingBox: 6 14 564 275 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 10.0 %AI12_BuildNumber: 367 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 6 14 564 275 %AI3_TemplateBox: 487 171 487 171 %AI3_TileBox: -3 -211.5 573 522.5 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 2 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -74 406.5 2 1835 980 18 0 0 43 129 0 0 0 1 1 0 1 1 0 %AI5_OpenViewLayers: 7 %%PageOrigin:181 -225 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 21 0 obj <>stream +%%BoundingBox: 6 14 564 275 %%HiResBoundingBox: 6 14 564 275 %AI7_Thumbnail: 128 60 8 %%BeginData: 5086 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FDA0FFA8A8FD7EFF27277DFD5EFFA827FFA8A87D7D52FD057D27A8 %FF7D7D527DA87DA87D7D7DFD05FF272752FD08FFA8F87DA8A87D7D52FD05 %7D527DFF7D7D52FD067D27FD3CFF7D277D7D277D27272752F8F8527DA8FF %2727F85227275227F87DA9A9A9FFA9A97EFD04A9FF554F7FFFA827527D27 %7DF8272752F8F8527D7DFF2727277DF827F8275227A8FD3BFFA87D7DA8A8 %FD087DA87DA8A8FD047D52A87D7D76FFFD0BA955F97FFFFF7DA8A8A8FD06 %7D587D7D77A8A8FD087D277DA8FFFFA87DA8A8FFA8FD4BFFAEAEFD0FFF83 %FD0BFFA1AEAEFD15FF7DA8A8FD48FF7E8383FD0DFF5E1083FD0AFFCA9AAE %83AE83AEA8A2A2FD0FFFA8FFFFFF7DA8A8FD43FFA9CBFF83AEAEFD07FFAE %AE83AE82FD0DFFC3FFFFFFAEAE83FD15FFA8A8FD43FFA3A9FFFFAEAE83AE %83AE83FD04AEFD11FFC3CAA8FFFFFF83ADA8FFFFFFA87D7DA87DFD0EFFA8 %A8FD40FFA3FD05FFAEFFFFFF527DA8A8A8FD11FF76C3FD05FFAE83FFFF7D %27272752A8FD0DFFA8A8A8FD3EFFA9A9FD08FFA8272752277DFD10FFA8AF %CAC3A8FD05FF83AEA8A87D7D7DFD13FFA8FD3CFF7FFD09FF7DA8A87DA8FD %13FFCAC3CAFD05FF83FD18FFA8A8FD3BFFA9A9FD1EFFA8277DFFC3C3FD05 %FF83FD17FFA8A8A8FD3AFFA9A9FD1BFFA8A8FF5227A8FFFFCAC3FD05FF83 %FD54FF7EFD1BFF7DFFFFA87DFD04FFCAC3FD04FFAE83FD19FFA8A8FD38FF %A9A9FD25FFC3FD04FFAE83AEFD18FF7DA8FD38FF7FFD26FFA1CABCFF5E10 %33FD19FF7DA8FD37FF7FA9FD26FFB5FCC3FF335EFD1AFF7DA8FD37FF7EFD %18FFA8A8FFA8FD09FFCAC38CB5FFAF83FFFFFFA8FD17FFA8FD37FFA9A9FD %17FFA8FFFF7D7DFF7DA852A852A87D52A8FF9BA15277527D52FFFFFD047D %A87DA87D7D27FD44FFA97FFD17FFA8A8A852A8A8272752F82727522752FF %59F852F827527D7DFF2727F827F827F8F827F8A8FD0DFFA8A8FD35FFA9A9 %FD19FFA87DFFA8A87DA87DA87DA87D7D52FD057DA87DA8A87D7D52FD057D %52FD0FFF7DFD36FF7EFD25FFA8FFFFFFCACA84AE83AEAEFD19FFA8FD36FF %7FFD29FFC3CAAFFFA8AEA7AEA8FD4DFFA97FFD15FF7DA8FD12FFCAC3CBFF %FFFFAEAE83AEAEFD15FFA8FD35FF7FA9FD15FF7DFD13FFCAC3CAFD05FFAE %AE83FD04FFA8527DA87DFD0BFFA8A8FD34FFA97FFD16FFA8FD13FFCAC3C3 %FD07FF83AEFFFF5227275227A8FD0AFFA8A8FD35FFA9A3FD2BFFCAC3FD07 %FF83AEFFA87DA87D7DFD43FF7FA9FD14FFA8FD16FFCAC3FD07FF83AEFD49 %FF7FA9FD14FF7DFD13FFA85284FFC3CBFD06FF83AEFD12FF7DFD36FF7FA9 %FD13FFA8A8FD12FF52F8CAFFFFA1CAFD06FF83AEFD11FF84A8FD36FF7FFD %27FFA8A8FD04FFCACAFD06FF83FD11FFA8FD38FF55FD2DFFCAC3CAFD04FF %AEA7FD4AFF55FD13FFA8A8FD19FFC3CAFD04FFAEFD4BFF78FD13FF7DA8FD %19FFC3A1FFCAFF5E5E83FD0FFFA8A8FD39FF7FA9FD12FFA8FD1AFFCABDB6 %FF5E1083FD10FF7DFD3AFF7FA9FD2CFFCAFC8CC3AF5D83FD10FFA8A8FD3A %FF7FA9FD12FFA8FD0DFF7D7DFFFFFFA87DFFA8FF7DA8C3BC93FF7DA8A8A8 %7DFFFFFFA8A8FD05FFA8A8FD3EFFA37FA9FD10FFA87DFD0CFF52527D7D52 %522727275252F8FFA84BFD04275252FF7D2727275227522752F852FD3FFF %A97FA9FD10FFA8A8FD0BFF52527DA8527D5227527D52527DA80552275227 %A852FF7D52275227522727522752FFA8FD3EFFA97F7FFD1DFFA8FFFFFFA8 %FFFFFFA8FFA87D7DFFA8FFA8A1A1FF7DFFFFFFA8FD05FFA8A8FFA8A8FD3F %FFA97FFD11FF7DA8FD1AFFCACACAFD0DFF7DFD42FF7FA3A9FD0FFF7DA8FD %1BFFC3C3FD0BFFA8FD3DFFA87DA87DFFFFFFA9A3A9FD2CFFCAC3FD48FF27 %27F852FD04FFA9A97FFD11FF7DA8A8FD19FFC3CAFD08FFA8FD3DFF7D7D7D %A8FD07FF7FA9A9FD0FFFA8FD1BFFA1CAFD06FF7DFD4AFFA97F7EFD11FFA8 %A8A8FD14FFA8277DCAC3CAFFFFFF7DFD4EFF7FA9A9FD0FFFA8A8A8FD13FF %5227A8FFFFCAC4FD52FFA97F7FA9FD12FF7DA8A8FD0EFFA87DFD04FFA19A %FD54FF7FA3A9FD11FFA8A8FFFFA8FD0FFFA8A8A8FFC3CAFD53FFA9A97F7F %7EFD12FFA87DA8A8FFA8A8A8FFFFFFA8A87DFFFFFFA8FFFFFFA1C3FFFFCA %FD53FFCB7FA9A3FD15FFA8A8A8FFFFFFA8FD09FFCACAB6C3FD55FFA9A97F %A97FA9A9FD21FFBCFC8CFD5AFFA9A97FA9A3A9A9FD15FFA8FD07FFC3B5C3 %FD5CFFA9FFA3A97EA97FA97EA9A9FFA9FFA9FFA9FFFFFFA9A9A9FF5252FF %A87D7D527D7DAF27767DA87D7D52A852527D7DA8FD58FFA9FFA9A97FA9A9 %A97FA9A9A9A3A9252BA97D27A87D52FD042752275252F87DFD0427F82727 %A8FD61FFA9FFFFFFA9A9A9FF7D7DA8FFFD047D52A8527D527D7D7D277D7D %A87D52A8FD79FFA8FD86FFFF %%EndData endstream endobj 22 0 obj <>stream +H‰ÜWýrÛ8¿Ð;ðæ&7ÉÌÆ´üíô/ç«ëÝ&öÄN¯{™Ž‡–`›JT)*©ûô’’¬$MânÛIöš©E?€€äÎ?ǓýA(ç°ß¬Õ‰·³s¤€i©ˆ¥’¡Yª•!í^ì¿U«#h0ìÍrà{P)—ñeY橑Þ=TœÅä¢ôz½Gv÷1åZ²`)ÌRø4ƒëf- {ÅÚ¨ì˜iÄù>íQ¿Aº­.Ÿ>‹oXšò/†ÛiöšH;”Yòxy(?ZAڝitÛÈû•_@úàXY±+@šI!Uz@ŽÖhú["‡‘?@yK ®+"§2֝‡·k¿‚’i…{BøUÌ`؞r¦ˆiâÛ  †~cv˜qžgÑ0€ÍNא›3kÔeŠÖ aflÈÝÙ0BÊ´F×p ø‹·‡UGhÿv¯.`Éí&bl?îåj•L"¦®ÓûA1Ì)D‰ÀM°1kõºÄïúÅ7G –»ß$û ߯µI»Û$íF£–ëØÄn8ܐsƒs ôÄmb«U¯»_ǹȨ˘›°5 ©ïü?“!ėò§‚Y·íŸ¿ùu€)SKиùRdÚfg¯XãûŽ­Ál³ï%Oå{kã~·EZõzÓ ~¯Ù&ý*îYý­&ñýrI¿øuz££PŽ»·3Æ-)¾äñßó1N¶Û¼·Š‡›½ë6HÏýXj½Êÿ~ñßيnk qn;æÌÑY%êµ³ .{‡G22±7)yˆ›c^¹t¼rl9(ž%ޕ×ìÓO™Ô¢.¤ß¡KÅn]îÑAÈA!'¥…lz`Ù +Áè 2 ô\câ0^–ÌA˜ÕFYÀ¦ÅBÀgÊ6'Ϭò PVÒ£àD¡" +¥(wê¹Ãð +†—˜Øª÷¨tXé°²‚•%V:S2Í4Û@=š•Ø-— hˆÐãMS J/RLâÑy&hš0e"¬(JD,磤l]¢¶2Yc¦¬4Å: ÁT&u6”ËÕb©CXÐÁ ¥‚¥+¯$%ؤ#gPñ]CL£ì>Ù{€+¾R… @U<3ŽXdÂL +Cz¾ú§ Rãd(oc +ŸÁ";Äìâ(PJ-°†yüЌ%¶<‘ăa¡73 l¼<1ž§ €Üf òdË?'Tš‰C4‰Bd?6‘1ÄVi1q:ílCwĐßp“ eÐʘÿQŽŠ¹=ɔ´–ÚJ)í¶3«Î£ Žçé+Óב¡I»×›:›ã1Xh'Õ+™¥˜"TRô¤2¸Ì8);q¡:ú°š®Ã4t ‘*ú +¿Gqé—U5—ŽšÂ˜V¤ÝFD,P&ß±Û[ lA¸’víÑU/™Ê"Á2uˆÂ5 ÊyÓÛFۿͦ)›Ó¢9³mê$¤9ÅȬzœÞ=[¯è&½ƒt]{ú_§û`¡’LUÓuޕßñórƓ®I1,ð)c'Êã–…^WŠÍ„°WâÍãl&özSsXóš3òł¢O‘=~i¢d˜Ø8jÔ¦·¡ú^ŸŽ"X2âùý6Å`ê‡øý.e +|έè÷è1¼“4üVž´Xl_ ^i´ê,0g“u4—bFÝ7?±œçmΆwŒ{cNï<ñìn,2d½U2K†ñBz»î +8ÅÌ7aÍÿĦ†w¹œ°M2®¡Æx²÷¤"<¼ÇDa;-¾ÏKÃoLqG=‰o@Ȥ¢¶¤` ‘ÿ0•<¯z,X̱ôRó;Ž§ß˜aŒ6º7´-”2½Â[#v¦´Ôé¦wõ9Úóú&9ú9TYº"S)E©ö.«Ôž“-Õà_Çc+b ‡+å€û+á¥ïÕ­‚èÇW@ækÖ~Äðxµw|m¯ð˕ï[Ëv"žF›|ªPƦS&k¼ EOi3ÑÀ6b"Ú¦³±VF‰yè‘ÉŠ%`uêÕ©ENJ…mÓö«­oÿéžøÍ}Ç1½ÆãÁ£¿Çx%²r€Ñˆ%Əž³È/p|gAÁ­“‘W¯uÛõ¾jn¿ÓkÚA½Ñh˜7@ÝÇGšëæ˜W¼{p²ÆÉo8øI·¤EÎÈÕÇ: ‘úáÂâ>àmÂõ²7ÁCdß{¦]!•eB|ƾ:þk¸?káÅö ¶vÈÄ!Ü°MôŸÝÂ1ÃÛ9>2Ì¢ãùÖÆî^]Ø«»²g:FÌÆø‹wŸîo|XšQ¬ö-)ôÕU7灗ðWrÕ¯;–«D£æ9Ý#>¢<·õXâ]o{ÇL3ogF‹9挙q{qfjýÕy‹Ð!Bw)Ô&ÝÎÌ'ô» +ÙM©©ÛÈQaÂkŽT/P »È=>[®©Ù!ôðò´›°0t´7Ø4†diI.˜yñ/pOºFl$Š¤<ʄÝÎâôá¹ á;¼þ¿g"ƒÒrk¥Ǟ6—L…“ª¶ü#%“^‰›\–”b.$»uRüù¶¨êuÒ)n»¶;­b¸gÄübŠ%<Ñæê]ø[.hÖÈmí41Á {‹-;bñ K'eD至wç2„¯n*þá;/„}lé²H ´Íb 7J(ô^è"ÛJbâX®d‡Ò_ÿŽìx ¶lú~á|4Íræ vØ$Þö¸Ìí~5 áÁ9áSt…¹C˜ñ‹WƼäÛz£þ6Ûé:¸BHQ,#ºÜ«&ü¸p^%÷¤³ì0lqC­hOà¡#nü&½ˆÂœ›‘Øãr±áãj‰ŒxeÀ]“_:Ñ «†i8Oaú–&Ÿ×Ò[Oº¤vî¸ñ*‡Õf×Ða6Ô§Ãå4Ó°Áw±¥üß'çœPx¦aÄFgËVsÀ¼ÚG6£è%ÌËúî‚hÄQÅ&¶´ ‡krµ\5ð¬3軦ê†0ŽÃ×пªº&!z×78ÞV±Ï×ÔÎüv%æhìë‘øªQ¦Ý.ñyŠ*©“ø\‹gõär„.V² Û/ȹk:d¢³,ª”LÔQg ŋê(+ Ôuûwƒ"¬D3´ò@Õ2”¶ ‘ä\XyϦ¹ÊËÏpPÉж“s|fØ*ÔÀìÔ5F ¢œˆ7°bþádlKÏù|õdp"æõQØÕ`Qu`)Ñ-èÒÝÀ4]h ,j]!c ‰O™,qODˆg4%io~]*ýïáÄn¬v{Øö¹ÇJ§^ߗX:ý¤ÐG‹cÁƒ9$°£¿äûÐœØr_Dƒ~rqDyÞ’n]/¸õÃÒó}¯Ìr՛S™'Ï)Ìã)£s’í¯ü±É?;û»£÷ÊóºâÕÄƆsòtÁA}~Ú¿ûb<UÔǁë)› ÿɱ«hÑ)&ÖÒ¬.Å|÷ÅZnƒÕý£cÂfiÐ`pÙ%…-`Y0 iºEÒ²ãþ²øÃíONŠªö³¯‚‰»||±HeŒìE.ô¨%˜ŒZïŽ16dÜ]²‚µðµBüòfF—”'EX¸£1ªbgˆŸàz鱂âl?³9 ¨ùW§ª¼F!&J¥ÞÒõ"r´à” ݟyJRŒ$Ž§ÄB/D걅âóQÔ Â\ü»£St°Ò7œ2úÌ=“ð3i쉺Ȇ4!ñ'Ÿwµon‚ ‰‹v\µ@þ!‡ +A†#À™øI,^ض¡|üàrW› +÷–B¸1±"3þm$Éïè8ºÞàȵ`{´ÊÅ +LkÌ°c)”Ž¤‘«Šf§–s%œÌÖP¹r]ÖRàDՋÂôòÔ3Dþ©˜œ9þ½žºsÕ†ɥòn€ÊðÚ5ˆkòÿô®h˜v1‹Üʦâhµ¾»áŘj<ÿµ× ª’P:ž½¡!“Ö+“L[܆޵‚窾49²'=4·¡’<]º¼£¾Ÿ«ò ³ddü.0ƒF¶tñEÓêix€eo‰zcÇUW¬q¢êÏ÷)šØ²À¬Ù(ü²—\3c~ŽÙL>›RÄjÂ|Žÿq­"O®¸#™ÛjYhÙì ‚ܒܾòåèo%,RÏ~0A7åÒ#„+×O6É?4 ¼Ô4èD±g†+(üÓ¬½p7L¾FÔê PøØè–.¥ær‰=¹ EïÿuœøÌ!²(¢ 1…&¡ÜpˆTz-¸ÑçŒï6JP葇í éÓ[JŸ«¸ô ÕZõµNåƗf݄4‹dR€†ÒÒ  'ô¥VZQG±Å'84±ü{‡DŒžÊè‚1ðÁÙAxŽ 28Š ¶x¬|Xá`ùð—FË?•®ŠbxõŠÙj¡ÊGê\24WVØ6+k ÕIkYYJË%QBþRXCà ݙ.Ãt˜‰šÆø¤¤sà¢ú„f,ÄÚ!£{qޒó»¶âI6(îHZx<#u¡Qô@Õ¤oÏ š¬<‡Ó2ǘ^¦lR–:¿Ä,bº5Å5l’ÀV.n!ñÜÙ¦L¬øÍⲐƉiÇÔªœÌgeî<™’HzU®â< ,‰v¶ËcØvt3‘’T ñïd+.›—M² ¦¤‹xY5DkJÜåe‹L@Á,dïæe VjÉ1fMóÄß3>YÁñ)Ö #¦¢Ä2cÁ´^!À8ê—]VėŽÑ€}³µ5Éjå¸äé@w¥óCÒÁp\ÞÀLg×Ò +‚‡Æ–E—yˆf×3T kóq”>—Ge*ìo:º/n/.ïß E]AkÕÓ¯z+Ôq¥;ŧÿœài¡b’¯ŸÜ1ƒbûÊ®P0ű%>ÊQ‘3¶."gZ…²õÂÆý´…'jo³fž1¥ $lyH'`­ýÆÉ¢ÖÜϜ¹>Vm ’ÙIÇcQ¹Ósö,¦bê„-Ë®8ôR«R×Ò%²=ÆJXŠÃ\5œ9–pŽ€ú¶¢§²8ð/ȇÛԑ¸*¡¾WM¬ÍäC‘2¡ qÎõ…N)û½, ”·JÄme¨ðÐÄv¾ÚXâ$ +Á›¶ÄÂ0”‹õ?ž½Š²Yä ¤Ì13g‹õ ÐÒBÁ'Õ`ºë64ˆ®‚™0+M(O”ÿ6jR¦bÆ%Át tSŒ +€CŠ(€e ¡›‡ŽÓÄA&|ŽÙŒ'½.½.€y]÷:U‚%Þèr¢P­+þ”t±¯m6Í%yªl.„ËËq’rÊgiB†­’·L¦!'E¨K¨/Ÿ¹Øå*mÉpÞڛ#†Ÿ* }ÍovHôê #BH؂hó'_F@êLýp„JA­†.ã¢NGŠ¡­ )Ùwç@¹hD×FClM\ tImwecè Wá6¶¹_êèT…sJ®¯APÔـdž’.­£3ª¢ ÿŠTR¥ë­¨…*Qo0x»¯Á€âcãÃÅæÝöñí»­#üeçloób·Ûf§óikb½>ë¿Þ)mõ \æëŸÿ>9Xkµ?Ÿ¾?o|h ï·ÎÛÌ՚ý“úùۍZ£±V­råA™ìT×ÛGßʵwlÞæÿÔ+¯6ÚGÃ×,9ÝÉߟ†íãõŒwï5¥\ޚ<»j¨ÿ ÷5•þF«ùß©£<|í6þÛÝéÌéw#gºýþ`Íí+õÛuûjCWÏÔTcëÍÃqóæÓÝ}çºW¾É¾4Žk}mÏú_Û-^žo+;n¿tª_mxÁêÿø~á*㯷ͮÙ6¿´Æݩӛ6ÿ«%ÂñcSÑjßíã[·¾p™÷¾M¾Qømó§2Я»»oÖ;£Ý5Ë÷á ÖÝW‡¥míDÛÿTêMߏŽ;{›Ûݏ;?¶Û½­Ïýqÿzs¶6=Ò4<¿Û'ãáÔ¿¹V­à&3Ö´Œogz×Üø°µË¶ïÝÎp´ùSøÿ¦}t6Ý{µqptóµÝ±´­ùö»ó£Js~ÿÎh6+|¼×aÚ ¶=kÕB‹šrÆo lÍ-Ҽݫê-£WÁßÚù»ÒîéšÍ˹ÿ‚‡íÞàxíödçpŸC^wkï›=úmûøF¿kÕÕµ¯žÙÿq_]ë©#Iø ü˜Œ@e0"ç`&Hädxÿ-u $°=sfg¯ö†¯QWWø+gvn0(Cœ†Kt‡®í œ2ÂÚO‡ÌÐlϊ$õá,I‘OÖ£8ˆþɐBCÄ‘<¹ÉÉó[ ‰ŒÂš'¶#«˜\ ÊcÌ,ڋ¾AèvI"“‘ƒQ)«¿š|:¯lz¶*‘'o +¿Š7¥‘P¸)ða)@ù^ëÑ<†¾Å‚4BPKó¯lŒîÓ«)ߔV„¤EÔ£üùéu ô¤Ucªîn‹¯ˆBUÒË#wüHéOn!ÖkŽ0˜}z֗GÑb]¾¢H«ÎH\®èHZÛºuEÔ˜'õÙޒ—l·*_)TEòÏTŒÍhûàýó!\#²íÏ#6(C'?¹tóüÌ7 çËwӐµápuD÷串j@æTÄó“[îÏÜztÌf%Ryç^P°cV‘ :ABØ3ÃG_Ý#kwìÕ8r²‹¯ B l±ãT(æøQBÇôXñij˜'Ùf?êw Y¬È=ô¥ÎÌŸçàt}-Å°bE*$@ooT˜†<3"”ƒ¤ÚzÀ4§_ÔòW"=mÕùD?ÚyôA5¿ißñ~ÎÉ¡à„ùÉ%Ìz®ŠOn¾YšPa2Œ${럴E”6º\/¡AÒÈQ2š‹•¾Gιªø«›´"ÅûQ"“‡žÜ–]`ÕTSd)žèP¥ +N˜Ê·ƒH¨Âê<Û +›]{Ï7]°P‰ƒƒܗ£Š'”ðumá…g&Š \-ý’æÍÓ í~« Üîæ¯%¨Í…Ó_»FK“آ÷ÜÓ¯{:_o6ÉÕ&Ä¢Šf5bÝï $+¬}‡¥Âæ(Ÿ­¶÷ëO;&ÐKlŚ"'Ù÷zìXæá"ÙwNè Þ¼ñí>9&Òo_Tì©3.P—Í€oŒ ¢yËðcŽÍ‹a ·¡ +=Õ¿ŒøÆ¥³n1Ô1ø°åNӔ{˞Ÿ‘›­ˆ»DBýt’…ó€#UßV†Ÿ™@ªÔŒÇ§BS7ß>9û7JÐ b§ü4ª>]¼>\ÁÉÏTñóõU惙 ËÖᴒ0‰I|ÀRnêDv>HÊVzdaSþö¢°žI¦6X%C9Ät0¤`3GC)¿ÐÀßLfÈ*$ÅxýÑMåG¡EÖÄø![YÛë¹ÂQ+ ?Þ%ïrWٚ Œgß[¾rò² åÞQ?»öŸ:âÁ 7)QGî +(j’2WœîàÀtÖ_/(r ÉßuøŖ?q ²Ÿ®ÍÛ»¿FX~ù%0þ",úŽ¢Ý*+T¾ƒ…. )?…mEH\á°Ùlÿ*Š ›Í&€7Ä­†7¦¼‹{mlIŠÍdî„ü°Ðnå‹å­{¯bì Ž˜ø)Ū4ž `R$j…ýbÜÿS¨ÿ6^ä]lšc7Ç[opêâ†È%¦¹1”Ɇl?]¹žA†ØRïûýèà›mu§pÞy&}-jo ¿ƒ^©•q©—R0t1r>I%¯Ý>ä‚ÉEZsgK—Ã'O×Gne¶q"~®þ¾ÎØÇ¢ƒÖØÅ¤‡üY<úUßüïV»Û¶H'×öúqq©÷%U= +vƒ„Ñœ¯ï¤ +מ&0Án¸-u/…@»CªLnFlh¬ìo#Ïþ,¡íƒ< 6#Œ†l{#%LtióÖleLJ… ccNaïɊmu³°š»-³QöϾ1èÆàYh)ÕßyC/˜”`Z÷ÿÍrò«‰1)ýËåäVsê»EhÈ0m‚ç_W‚ÑíÚàoŠÃµµ¡$7áSÞôA˽6ç£nA@c¬…“Åêÿk³Hœ–®ñuŸÊ¿Kª@{A€"Ô¸A@¨¹?Îh& 9*ñNö]…}†VÃÒÛ*ñiÁ›…œ ?¿Ë'ڛb“¯´TwÈNœ–"¿-Ï Mn 6´>@Óÿ“Ûšÿ¿+:¯H¹µ{éUƒ›ÛLá<çφ!Ò±ò=Ûâ/K +ëÅ&Ç76¯õ#5­g+Q®å`ÌMµ˜Xë˜Q¸¿çU´¿vŠ‹wG +®Þÿƒ¹aÈ}a]"`©j±[‚¤ŒÅ`(¬£¯ëâìdj¶Ý†› +¶ý¬R¤…•ßÃ7. eøp*òîYu3Û$Ž¬ +2H&¦Å‚P«rÕ¨¿·-›Š^zn¾Vn´É?»^tV/&Æ{™X_&U²xor_•ùéA²™•²ÿגŸÜ·T¸Óiъ¥J,&³é±±Ý‰¤Æˆo6ޕƒb¤‚­/ǝCžI«¡ÛE3v /y´‹ÉAîô\È+0åªûMp¶ƒîTW”‘ß±0,}áØÉpÇuj„'µ Kh~Ì +Ź­:WŠÕ0Mřš¡ó!©p +ŒqŒ}‡œÁ”·ü½cögÙ¥yê€c›¿/’F&½6EŒì…Up¯‰Ë¯% ¹¯…0?ÈGñ#³ž«¢-Ñr½„6ËQ2š‹•ÙÖй¯ÙûBåDuƒHRTÒQ†Ü÷÷ªg^íQ3ìÆWµ<“f[&x >ß³¤y³¤$杸…öŽL8LåÛAÔ¢ åâ©ùØ37qÊW#Â&\§€ic‡ÆŽ'7–Xn%?äÑÐ=åuw†¾[ÇZÜâª.ír̛Ñstyé/ïgT±t¿ø4ûuQ‡I)Ñ)÷½S&Øy.+“Ì&i£àh~yJï|ÌÇÔ üu’x0Å¿896ÛòHoÛå@ˆ·»a¾¨ê|½I(/îÜGBXS³“}TÁ å5"½ Šcب#¨Îlã'å“M«¡Œœžž¤^Â&é +JŸß‡†›[î£IBw¯!&˜ç´æj,~ƒ&Zÿ’‰­Ùۛá«ÃHrm×ù|“\ëú\T`ãâÍpèîÊë ß9Ödq믆ʩÒJÓRKo­#]W¤^>ð“iwtqâɝþØÞÿŠ¨H”§éÊIz>ô¯E}!¥Êzz)÷} +*cœâqå#·=¼ÝêZa¾E‘ó zIi™,Ý͉e±}ˆ ڙâZ¹Ì(¯®%e¹%ú¾Ã˜*˜PÓ8*ÊèŒÌ¢‚V:çÙOƒ çsþpc!{Ó¹W¯Ö_@›-H2}´±Ã«(, +á•ov¡9+/r…þ¬âxN8Š·­¥$øšÄ¡ÛÉÍÛã}qåò¤ °“ F˗÷¯jÈ̋Ytýì@ÔçhŒidù*M²;ó¾ZFh=BœML¦™ô@yçæÄåûêÉ÷#žÄZ÷K0÷‡=f¿l„ bÏÅr§KÖßï‡ñ`T¡l«’|O¼*bÃð“&Zmqó¦ùWkE·Pd ¡H/Z¢'+3ºa^_aBkº+•'ŝlÖ»]tVVt栏ŠËäˆüS †¬\A},ÿ©§š÷,…*më;$Ÿ.‰0_Ž}²wOT€’7˜F‘mBu¬}tw.m²óxåÌE[J„ξ¯76r?î´"SkûŽ¶v=2ñdÓï)üþ-ºT‡ã[¨Õ¤=bã̉CÃàÂS§‚oj±wdw|êÏziº`|mú&S"cÀ¹¤¨š„rsI‡e›ïlX6ã’WpViÝ=˜=3¼Ö‘¯f~ö„-²u$“Tò9ÿQ§>•ý%/¿~ÈÍURB ±4±¤1X¼ 4¡¨Æ?ëé)ŽÇÛåðÞ$tø¥J=zËh3ÿîÊ.\¥_±E¦Î€Ý¦iµJ@œšà Þè‚C¡³‰­ldNéwO&E‚…ËŽXƒ»ÝÆ&ÉÛ½ª1Û؞òSŒòÛüU"~9`¶•i͗nØÝÓÚ×N\¸qTnLis¾[mŸ/–?sáØdœºÀgZâO²q[5Øßür¾óùhý¼Æ\è¨bóQ+Ù å/8)óHÏ@‡‘¿º—¯CV= Yˆ¾ÒìðÞuË4µ‚vþSXû÷¾3[øX|牱5P¼Ñ'àhiº” 4ƒ=sCyGWî,u%´·KÂh‹â€‘ø–N.x&S2Nl$³ŽJ¤[Œuv©f};ð¹´kÎw‹41¹0SŸÑòÌd¦‡…m$X€ÛoNDàz{ŒœŸUý'ôîCjûâBmoEãðâÇѾÝzEÞ>KÊß×/n-½VÌ= å#ǁPu¦¦!/‹f×b'?;»FL&u™„ÿQ^0Ž4•MnïvÝLºP‹Ë/ÅenX.šj&†\µJÊ÷¤Ñ«Ï€ O“ƒÐÎtÁâáã P¾¿™;?0­mJ~áÉ'm?]\µ’€²w³‡W€zA<þÑOK£³æðÂÍbŽ[¤p>¯ðü1ÄÃ: +”0»VãŸîÐtä+Ž×¥âÇä贋ƒ%-e€!ƒbº­ì)`ãÏ0r¯o>«(3)Ÿ„>Øm$&•>ûŸäåÄÞ£x½ò>œž…ñà¼äÊJÙoíF-,%­Dؓ&à‹•9‘!ñ£MÆ۞$ã;kfWÊÂn½ÿ³Ø.×áØó¬5ϏÓKÉŒÔIKØz]Ïw²”^¢<–aD0ƒÁ¨÷ã5/Ábý”Ä…VèŒ +÷ª,“ —My¾øbõêýù[r® 2ÅΘFUœÀ\ôÌ8ğLjº`8¨_äDÞ¯a{EùµWà‰ýŠ~.;8‘Þ‹ëc¼ÓøZ_¦&|ÿ*[žÈ=?Ã)¶ ®ÒZ¹ ››ìGìœnÂܯ ~(gOŸô2 6)'"¶ì¯†á#qF?V'…Ü7§`¹¢bÏúîRB9è—iv“ã«žÛVhw9éî¶&ÁÌÙý&"Ñ,.i%•·EùÇÈÇâÍo·¨²ÈËG?¼·ùoøÛØ2‘aeîŸ)~*ñ©2>iî›ÄATz"{lê*'Íw-7ŸÃ›–˜bÇ{9—å'ãu˜Ñ +ÎaÄÍføæ*Î9ö0ï&{4$Ë ±…g?;SðE®JíŠlÙšß›¯xÖ=ÀÉ’«“hz÷[¥Ó¨1O0ú¬C6٘7–"F_Gè:$ =$ü,/‚¨Žïà!:ü—‡XȺà –‰Ia‡Œ´œLÿ—wxGä[€)Çâo•ýô­q8­öšñÆMN“à[NÓétê -k§·Ú«ÿª—[äú¾?µÔÙ^WTåò +rT&F¼¦pûÙy§j'S¨ù2±êb¥IêN·3j¾·¿y˾¡L»X.gRÈUTS*’OÓH¡;E1©#HayJ˜Oñ$ÕÌ&îÍû“u@& +҉ÞPڈîVnbþüý4ŽäZøÒÔuÌÌwx­9u"³¨Çüyw†—ë^4Q#œÐäoÒHxš–æd¡1Îcâ¸R0íÊ\¸ ª³g©×d®Zv¶o§Ü&Š)‘K¥/³j &1j,¨ìà£Np}®°$ ±L” î|íâ ¼åø¯12‰¥ÐRÎb°yUúo½_üéhz š¾xá‘òå Dž¶3 aóïK×ò‡ u»+»«““ûäîÅ¡#<µï—FjÑÈš=¦øb–‡eú·±È€æÌɗœ¾¤7ê7±™RB&Ýsø[Ú·=Îr¸>ŠÔ ]'¾> ?šl쉰”–bßÉÏe-üRé`ÁŠ¿*ÅãkÔi՘]í]éT¢ˆüZé;twÛÚ+¥†{ˆ³?”ZZ.jÅ|óÿ¬WéZò<½‚^KöB«¼ €PÊ*È&È&*n¨ì÷ÿ%-%]’RÄ?}”´9™33gNâ?]<¨è뮞ë5,¨»0‰ |![¹¡hB¬—ïÏڗ"€öÇ|áõ¶…•]×L´Ö»œ/½ò~Wq «¯dšzéñ¬vq +j̐Õ_¨\7° îÂw‚oów8P¾°ø(A)š©Õg2>V±?ãå;Ï>ÒÛ{žžGº-_š›†•'´â@^Œ°«y«©‚JÃyÁúæ«¥„Aý–H‹óU\ÌfD(P˜ê÷ë Áš@ÿÕ¤ñ tÌ׿ê-\ äÕќ«#ƬëcNìÙ¬¾gÄU0ÜÓi´ja,*vCSòשðk‡¼šMˆ¢ cÑÛ´° ]_%¯ˆ«If¹˜W]L w›¬ÍëÞZz®­>mÌ«1>ÿM\ \Ǫy´ja,p}Õ,¿^*‚´¿ñ‰AÅ"6×>Æp5«ýà®fèfqQLµóóh.)ßç=³r+Ÿ ´ÚÿB.fþ’7‘-›+ô†…0 Üyå3°…‡=à¡ §'ò‘zòpK`dš¦¹¿vÇØT#´¿îtû ]¤iÀ*Iõ²“Ì úH¬#µ?,IõvÊeñz@)Á‚yŒAùï¯@Áe'Þô ý¡’}=¬.Vwa)AeÏC‡ʖžÂo(tzØk—O*¶¼z‚1è Ãxtô²q©`½ÖÇe_ÖHðˆ ê.LÃDPåæ€@ab…w‡Ghb*{/‰ `"û!V`,€#™’@›6ôÞVº†¹oŠ:cV½p5xø+´7[þTÄÑ{BŽ7ô>éMþџüÏÁ{ŠQCjbZZ[—UØI'ŠÞO¥úÓ ¹—‹±¾‰TfÑgé Ô=r!ýÙk’à½(à×&ê'@ë…/]lnÕsƒ¿€šÈ.IAFÒ¤Áwà_ú­_P ´ + œäE=OƒYj/µn”-ìñå šFô’{iïý¶²j\ð28æÍJ}E 0v8r6ò>ËÓðá9°ã×˱.ˆ`N½lñ@`LO`Z¢÷`m¡àÁ~!ª°1Êx$O4؉ác ð xèççª#Êaö9©rŒtå1íåáá}ÄøïU¥Š‹¢õÂ)ƒZþX·ƒüÁþ¼G÷¡ý|1E¨X_[²珟}κʬtL–Ýf›ù=q+ŠvPî‡b_D¥ÑFvZY¨®ŒY­¬«ðéÌxŸ¬µJ>›ù×\x`Ï;eC–Iz¤aÚo”É,=‡èMÒC-Ý~pm ðpd£ôÌaF5eVî$XcóDÉæ<“ ´½û•†ùÐIaFR.ƒz…9´¡¡ÎøhÓÄ¿FÝý½ë;‡»)åöE“ªEP%'WäͲ‰²ƒÍ°[AÞA,¨ï¦n9`컂Ӿ³ï:XÉO±}.#ždPyìUPv1ز˜º'n\:Š!¡´šPEýÿ=I˜Ú( ÄÔÆ ?Ûv"¦s)±>ÂÉj1b‘÷E eua–”( ÙßøT§hH‰|̅9–ž™¢£þìg?˜ŽzFýËó[âX¢è“ò ?ޝ½/›uÚJ–_?xÉGš¹É³òæp–N¶3tõ¦’:ŠvšA¢¥Ó<…½ç×g0AÛ‹ò×ÕÉö¾’ÏØìˆáQv¡h‡›EÎ RS~m3þï‹þ%c±¿dL8±½ÓØZÐzq}+ò/ìT:Ý£³Bo O›í½Ø+‡ÎÐâul›qÓ1ÁÆwå[Ñ8ãÏéÊmÆëÀî+=; –Åf2ÛÛ҈˯Øa_>·4³ÃϦ“αKÚÞS`!ˆe9Ö/ÒdÅ3:%üQ¢'q‚=ˆÅ[þŠ“#Š¢0\ÑÔ½•1#ªšøi㴑`ô¡‰Á¦²ˆE­~.¿->ÈéN;Ú¼mOð¸û,#6²sù 5Èh³rDÑ'ê—p¨±ÃëÀ+ˎ`´å²‡9t!Óm×ì)§’þ~d"ëÚãäµ›'wSTü+»ê!e€óŦ!ááÅV2Aío£S/[tPŸÔÑ nÞÅsÈÒݒJ'·¸×âû€¢å©Á)Zð&–;ÒÍ +à'dã»llpÁx¯Dʆ(‚7ÉymOƒ½T覒DzÙÁ²¡¯ å1íåí +í»Œü»Zɾ:Ž„&rljfࣩ»%™bËø¨|Œ¾Ø£år¡„îš-ç%VÆQvІ:(³F˜ÙLË+”áÊ)1DZÊk’{8FŒN +’+";±ìC¢|¼’‘n> >D‘ÑJG¬VzY1Zi3ù”3­æ Ó x~ÉÝޏ)ç1Bk1Ø9a=wÉ;ÖTú»ØIƒ„–<¿_–ã üMg:´êAÙVºmW,sêaH•jÇ8ô~#É;ðc†y÷Kb.퀲Œ:‚—­Xݱ9¤ó²ÐG]Zn|ךú¨ào¶}gßu†J"p }¶‘iÍʧsJGæu³¤i­_HÆCÛ,µ=S“{-ؕɻÚYµªdÍväQ´ó}ŒÉSNgåaŸ³;PÝE»M¢]&Ÿ²Ï©sOuJ„ÍráÁo‡¨*Z À¹ÿ9ãLŽþ¶ïœÈ‡'Tû6”] NàV™ˆBcøêûˆEº[pžŸ¯û9{áÐ9ÊÒF¥J*í'ôÃ\RÚ{óhɼ/£¥ª=­0Ì ¶3O3¼•[¯Y`¬°Õ’…“ÌZ³À˜ˆh X3Úx,G”°e`ž<‘ lGˆÚ3­€\l;£åwd5&i¥iôeK;…6%wÙiŒ Ã~ᅤãÄ y Ç«0üRUʅW|u°H†ü&Û{LäN¥‰$Êïi·QÐØL;h´[¸ý]ãò{Ñ+íìÎï+î- sÅ ?¿§Y‰(AvÄ®!ÿZæ!ô5Äoá>q -/ÃÐ×ÐÉ~¢Ón¡{+3µd!Qéfì'ˆ €¸fÅ F\h)M8š“Læ8ñ¥Óµv24ö.H¦ L-b„)û»¯˜Ýu:inK¦"šèB8·1xM9™Ûr¯öѤoyt"r" „Ä©9ÉÁð"ÓÌðŸ%ðë,áºRà0Õ³*“=åÞ¿Ò`EËX›½{‘Éüg†:%.‚K)®ÌeqrÉéïd“À%™ÆÒÕ¤ÖaöÅ[ŸqkyBc)Ž1µsµÅ:âV¬XüìŠSŒY1Åêd.âhŒA1 +µá„Êô½‰€}±fB((Á‰ Áå\d º6,`#®ŽèʹbٜqpqôöôvÔxlîÏsëڕ¦ÿªL*? µ^˵ò¼}ߨ¦ï²8ޏÆ7às«~™¨7‡ãæk!q&5LcÀ¬œ@Bv>Éðž¥Àʔ4ãøºz‡2Ñ%Po?]¹;|7äÁ¨gußÁ´\LÛí¿ Ð㋳rýiäW®{ü™Èç*Í®—RÃlñêí”æTß¼”UÂ)T¯ŽÛ|3¿×e8=”cGw©g†ÓјéԐšË"®^±\ó-ù±Ïtš¸œe;N[P§§Ñê´t* )p8}Çe¤À‰£¸î:-bNÞSÉêÓºÓRê9¢n±\§Y¦Ó|³sÚc8=”•ÒuãÅs +rÁ +<á8mÅÙN[·ò#ÃéñEDQnþëN¹ŽîØN¯;¶SMë71vÜÆàß3î'ë—úf¯’ûÏø]±žçÿx1}¿ì•XL—¿ÖšG&AΣ’õ~à&<‚é)‹aݽ ”%åœ?ôªŸÈ>·V”ƒ&PԃÜ¥×k %ÝÖ)Û¸×ÀveIcۖ:¯ÓƋ&eÕ7 —ÖV!¹*‰ ª®³$@Í&†È‚g‘ó^ÜðXŸ}P‘[Ò>P[J€ÇŠv¬®6ܐ”ˆ(ÿm×~›Ö9ŠÏê^ú–:}ágvŸ<ô Dr±G uÿɯ“W%G¿pŒ ¾Bç½€ q™VØ=¿ñ*/ÂEÇw„HHö­ô53v­±k´ñٞ•ËµkB#wŸ6 ím|‰À ’¡!ã†èdù—ÆY­VÙÐÕjb[®ÈÏGûQ&35׃÷Ø©õ Zj@ñiã‘DhÚíSãSwW‹µ:q¦4Ò"YÍ{Ù8µ[Ý×|àÛ)¡ü[b5PI©¸¹mÊ,9œß“!þ²`Û&@ˆˆÊh +Q¹öÛʘ]y;=D8µ›6󯉩æå¼ëNnn%z-T²dï´YxÞÔ:A€]Òk'Ï ++IB”\Æý]šT†OD’»¹U3}5ã>Ö/Õ©´n¹—˜ö+­ ¿;4¤Å±ŽM&@Ŷ¦ «!scŸÓb5÷بAéo+˜v%ð*²ºûÚ{ å&ñx+Z¬“(­Xö¶´‹U™%‚*ÔOÚôxTÚå–hP23(¯ubý[Ä̟ ¨$o.ÑAvÿªåÛ.¿E´ƒùùtÒßq`ÅcóÁ÷LV~n,ìIoŒ¸*á*ö¦J£o«Ø[9ùøMs7Ún+eîP©»>[ƒòTG†¸6üeà|lG±>Û0qE@=¢0LTÙû‚0Á2 ™b¢7TÍ'ݵá*& b"bïB\ìù©˜in˜ `dÚûË^rLZ j2ɅìЙîË^í£)¢yè°ø}Œ}¨_‚ÊAq”±gò1Árð˜ Lg.xB]òŠÃ#÷ý<òãç‘Ô’G„G2&ù2˜g`aú¥’Í” +ÏÆJÚB®Ò)dºšÔ¨×|'>ö¼v$ñÞá$³ê$Œxž¤!¥ÁûŽ:5Ö¦¸bŽ@Ä'%Ø#@ˆÂ-BÂô J՞–È* + ³ÀãÔ $ìlÅÇ jÆä÷A!Y[ìûŠc'‹üÇk×DN²ÆÕt،ö“´+Æʒ„Ϙ›:6øqkðé+ìo›£ãÑQDd@Nô‹!ÑÞCƒË”¬äÔDèԊÕÁÏ.‘š5c˜âmYqS¯èß*/’Õ¼—{GËbJ7XÏqðí”q?M]‰ÏÎKlЗTÜ\Œ6µ7¸Pô÷+‹«Å|…9( ²¦ÒºE\ÛœÈ$Ëô‹Œ“åj¹·&Èr±ÚW¢¸âó9"ˀËÉ9GÈqÀî@1{É]"BT줵ìž7µNP/á°AË·IZjèE¦M:™Awç¿/åÛ(~ô&”:Ÿ çE"!tÃ'tÖ-·®«’è.;¤Rݸ ,Þ²¹° Ãà›xuŽ„&™…ß%jñ%•ô“×á½è¡s°Ï:uùùt’Þ~ 㝬ÃI~)­¸½”ÕL_ÍÀÇbõÀߨA3L• š)0É,ÚÉbÐXezÆ@½w:C@kÂj÷1¼ìjÇX<DcnžB4î ðV4åä#ӊ9cq[öÙ[^qŒáò‘’ß”s‘]²iþO~þ1O—~—å#‡)³àN&`ø1âB,†‡›Ú3—äc·‹YÊûO~)ݾ˜}Z8$²5ø“;Ì øî51՘ûµ˜6^4iˆ«àœ¿‰ØtÐVñýïa–©jRëpK¤€)Ž1µsûƒ/ƒßŠÀ%”Ž(¡é„iGÝ«}4¹Ý´£=­£qø˜igό€\%ejI{€v̄!˗vÕiüÍ­{]3ö¹0-ý0ßqaH€0¢°a¨/õªl80Ah¢2<  Eö†QòØ8¬wx‚ž!@ˆ{Ù†BêÕ²†ˆÂà+h‡!ÕJD„Ú[Æj'mÓ¢*²q“BÛÿ“Ä¿•†ˆ¸F3•®¨4¶2Ž–ÄÊp7Lk¼ú†F¨’¤^™D‡bŒTŽ|šûÂ":ÀX)´t՞Ç•´û¦z0I'ßJDÐÎà+L4 ÛÎhùY©³Hj±`;æ58ÏÏ×ýœ=C.¿›Jë–Í“ý-ë°Æ7^ãsï_é +@ –aaDxêe‚ïúüC„Ý!k¡4ÀÛTiV)‡0— Æá¹÷Å#ðyòŠI+%p:‹ò“$L£½/ÀØ»-üx!Ü:Ne¹¿üóDwZ=2RóC%œZÙr›o¾]ß3ÆÕöä_–ÓWÔié>†8=¾®ÝÛWÌY™qÙsjÈïso)1§Çg«Ø_7ÓÖÌijD8(X+¦Ó|ó$Ípú?ëU»›6 EŸ A $@`±¶¨´4 tŒµ›ZJʇ jªªˆ­€xÿىãÄv®cÖþ‰°ì{Îý:çä8ÿ{ḿG½™V€±¹»&ühÏ\ŒÀGuß8}EX’¥”«Éý¡ƒnw÷íø(ꗋYõŽÉªßŠP¿H"JWÏk•sóýúw.èîäÉñfîŒo2oüöJꎬÎ.Â<½ä„(uI c-,Tw¿…‡uS ¥b¬A°´[ýü[4W'v¼±ÓªÒ¾¶±ÿruÑ_|ï’'ø,Ç6~¯ Œú‰ÍÚÑԐ´‚RP¬æCÂ,± ½ªÁíBâ^QÞÜ]rõT†–‚þM ©c8.¤ /0O%'vÛg¤i~'NúÌSÄÒyY+€–‹îxƒª'¸êþ›?C¢j\­žêþnõp8>fòG«Ÿ„OPãÿOú…ð®Têª6ùœ~9o¨ò”в¡˜ŠBBåÚ.ãúüI+ÕÁÎ!s,ÝY)ÒæL¯·rߨαÚÐtÆæ·}b,<îUs +9øh·º@óŽ`‚S€öµ3ºÊ­ÊÆ K`±_œ©]QAåß֊dY ÓÉá„?fL̖ ú‹¾K*'(¥b0PB+z,Ï|o,ózÿ bRh©´ ,ÙöCîÔðe ¹“Ñ +òËX™PEÂÒeEBJ«md¤V­ki÷êHÿ MÚW—ÎxW.]k¶ï²?„æßôœ>Y®q%Çÿ›]ƒ•Œ¬"‹£I7¿¨R0ÑF¦‚uªïÉ$/šA®Î¶Yó5†Ô½2Ò0>ŽPAqsG+7ˆ1t¼‡çXOºA2ò~î±mf±ÓR®ÿjuI endstream endobj 23 0 obj <>stream +H‰¬WéVâL}‚<KK0  3â[tDá ãȧ,÷ÿº;!éÝIGøÓÇ£±–[u«n•ÕYLû< •÷9#½O»SEUR·÷©Âü<”*§“eðÉÃUªpZ™çŠwϵ>i—ÔÆ©(*ÿ.§ñŒTT¯U%÷ÄTñm“µŒeŒ[ô?…s}¦gJÎð£lîÇ}>ƒ{‘«2öXþØ!E€VPÊ¿H^vžÂ2>û*衘eç|œ‘.çQ󓝃Œ\ia”Qy{©D4¹£ÉðWúÀi¿b'yg®§Šùû[ô‰åà¹QÜeßi©õñVþne,dEi`©/“q'¸1º©÷—.@ìHƌù#Ӕ 3ö*­zGCìU ÷”äk>þçhˆ½–O –“ÛX£6…•:“e¬‰K½'ƒÙĨ…:Pv¤ù¶¤3kSØò’f"¶)rÏ F Å°·ÀÊ­ž†v—z+6»!0¢ý´Q…´äÏië1‡ÝõTQkÞxvDL¯ÛEa™ø±¤Œ‡:m<  `¢ ·>¼+m×¹í "ˆ&cåÀ + -Yz¯¹F9èdóˆÒ€v´ø[÷ç>  ÇpŒ, ÈJú‚Ky$äÅsC.Ü1/.äa¹µ•ŠñªÙIðLuñ~m´¯.̆äS $ÑC]  œÇ§M<æ§.8q’áä {ŒÀÉ_Xp¶À›æ„dÍ1Þ Ü!qŽÁoãJç@!/fP@'*™ÙÆ §›Ü0ÐÈ4·Øêùr½´ñöÒäÞ·Ð#Lº"t¶ØGC«Ž ݦav†èћ1æLÎFóqbiï ¼ØÅS’7 sšXBv ,Ğc¢õLzï óÑÈF/š7¦–‹£Ô "9R‘ÄLE +ÄMazV‰˜`æE) æäÿRB竬kZîõŽù¼´Nb,]ÓØ[äû°\À¸8K²Ä +8¿ra³Ó0ò\e Cìs"+Së?Rá¼}w&̲ dü¤êáÀ–PH™V‡ó;ÐÝý´NËyÁÛÁ£ò÷>ETþEò2z\’Ûâ ÖÅÎ7É»–LÑíN͖Ü;ËêtÏÔ¼ý ÷ ½C›{Êû Ä1æÄ]ù¥„BCVð£n±#žJÜ&ò2^ûñЗ€ft2‹¿¤þ…3R ”±¬ÀïØÍ ˆ«nmïÉ;ïJړU 4©[)S€O·"S£m©‰L™jœ1³àã­7¡1Žmç×coíÐ+ ÇøÁv •¤_õ9í¤¾ v%!;òQ²J»¬ì¦%iÛ%“ðFg;á ™²æiŒ”š‰„kóAæ€å1?¿ö`Îx+Á£HF̀9÷gÑðwp…ÇÔü02®a†ï.&”³XF᪠~Hzˆ ¬ÉÓ´ýËñ~—_¸Æz¬´a~[2ß]’îð®¤1ޘ»³æUSŸ¶ÄdœaÐXæÜx?„¿(œ+©×9†œ@Vº~Õç´Ó_ŠÆ¼+)vüd<_4 ±]™±í\©/›Žbu‘ïD»P‰ÂWæNᕷEêR°—,–—€/$Ý4¬ËÞF‘†ýe ºš]| Ý_¥•z$SnæøÏ1 ±ìájâ=ŒÚh]DBA<†=¿^‘€4¤n±îQhØÝۅ;¾”öÈØÔ cš²îJËXNnc-óƒµ æ€ßͤIÕKJß.°‘QÎk˜¼½&á¶q(€ŽÌa]¯„Ðñ”92Gà:–1­yóÅ#ê±ÞÙb÷÷í'•5´pÚ³b{ `GK–Þk¢±ªï¶sÀüŬL¢RÝÿóµCž‡܊\Š[í‹£”ò+Æjy-Ÿ ð©ûÜ(î +w¯ÉMFÑ€„æÞ·i8^ïÓü.0 ]$4'Lä5Ø°hHÈg‹›‡2w_¢øCB`'ª²/”ã5YJ’–)§.Ú'ÛØh[júµ|,S¹“•ãu6zѼñ3ÆÐ:$bgǺ+A%»î#Õë®d ®žç¦ & ‘ëº{‚Ñ\Â0SêõÓ.a¼”zOÞ»„ó>›ÌÁ„,6 üÅ¡ìÃ\ꌀø ¬ê³ë[êͽϢˆËðׯ0êRê­¢þÛW4·/*ròç´ÊˆkCÕw_Ð0ýT1ë·5ÇÛ¤3<ì+i¿–êËdÜá4ÆXå­<È}ىõà;Ñ@H`Ýô™ªï¿àOŽ`/Ù~cPüYÒï²}öJ6/´\i?†äîӃ †äñìw(ùûçü©*ªJ7ǧªÒ›³ÏåbŽ‡W¾£Ÿ”Ûª\ö¶ëõPü${óúÃvC!Z%\Dã{KQqDÇë0À©•FARt±Ä]$+Å8}‹O£í¹Ó¸Ó\bè85g2æÖמÒL§j­tvÇpz‰~f/Æ4§‚ÜöŸ˜¹a=tÊvªëë¾í4K8ý^¬Î¶CäNÐ$À#Üiî!Š9ý~ÕƜÎb±ˆã4uñ_çÍ© "€“WÉå.WÒi®ßg; ×þªL§jmT7oˆ#çJwÊr:ñpª«yšS€t»6þ6" €Ï"¡aä¬Cwú#${ezCNí ª +©™F Ÿ¬BüÚÎ\Õ§wya~grßú2|wⰸގç"¶&aÎ{¢sG\ð¿rܜÉØòt(Ê@jS¶]œ2ŽvljÅ>€.”q Í/<¯R¾Ý܊- Q™Ó•z,%ÑOÇic„tµâ L¯ Ö® \!Á~ŠÛØ%{oPJ‰yƒZ×Oé¶b[fH‚HÇ©%I œZ¡à¥uÙ J +'g¥ÛÕÇÎ+¸Ôá>ÇÄ$».RÞ!¡Gàì§ ùüÐäßeø*­zŒó1X~'~|áœ)xC‚¹x¥‹/êëMnÈꮃâ1/ö¸ê˟h\aV‡å¥Óñ˜ê :®úòšãS_Z'1A´Žœ=m]õšÎ&ò’ÇtÆ{z,3ږš~7+|¬¸s Fjé035bÂÀäØ©ñ(ýçD ˜íU\˜ª¡¼D÷ËJoƘ"Ô¼’¦%¼PªåQ+½¿ô?©bæIe— NK¢P^'‚0,ä:æËW 4VúsÞà8€‘jÌD~—$8põ©Bj»PÕ³Ï9'Ì$ÜÛzÖ b_Xä¸êW(å¬AÄâÕ¦o!àcu`‚A¾IÍ=A±™Œ?çìs"¹ltZdèd%y¥¾l:Šò/’—Ñc#6Í&Ĭ&¶Ê˜Bþ¥Bšé`2Nªôˆ ÒhþÝ`}'P'ZØ 1ZuA 6‚è­H8ë«CDêÌ¥¹Ï=\gº¯xÛ-#2$1"¨M±ÁZj¾jœ ɞöæ-FeGQÎÏ£~K”Nù*øyPýv¹˜`魏c5ƒþðIîýƒŒu}.dʼøü‘[å@Ć>‡O€$Çë#"FN´{Ù°Œ]¹'-Eî+l ++—>̔zO>r©ÃMaëìJ?%Ì0Q q°îJ– ß«¬ÕÓÐãMkà¥Ô[E=í§m®·äÏi•R¿zª¨5oh3íJR Ð¥XÝ­-Ù˾Pd¸ؕ¦ÊJ€ÈXaÂkédß" -Yz¯ñ¬Ê"@ˆý­óŸ”,<=ç† r‘ rû¥\ A c† *Ÿ xR—ô!C:u…¸iÏ~V¤zJ﫧÷koõ$¸%‹ ×Péêü™¶$É Ï%32V჋qûEñ@ÌQjÖÈË.F<§ˆ‰õ …tnIÁXö#®&Ò¶«™¬A ®&g:÷Í=W#KY=µÊ츒mGI~!7·šµø Së¬ÙЋ#ö3[..dïáöÊab³AÂ:ê\ùmbí[œøéÊQÙµkÂ]öƄىwSvˆŽ³N•ìÛ­ ¶’]©ÒÚØ»œi¨½TR0Ô¸ƒdEé;µêûódu/Ðø]…’,Zk1I<%YEÖkø£[‹Ø{¦'Å}bÙ29ó’w“‚-d¹È%âÛ»tÉËñJŒe˜bÝmUËî1&Ö'b¶]ìxÿ£ÐÖsÎ&'lV<®íˆ¡ü{闧!l¹µS®Ë'ßj—ˆßÎbÇرÂÐ:åæ­|@ t˜,@l0¬Œk™mâ¯oôîv¡äq^@{ý„!ìC‹ƒêj«”~Î 9ï ¸„aç(Ú@ˆyÌfìtö—6þFãÞC›|;§ÀÐdƒPå±Óìì€áŽ.vÐÎZ¤½£°ß2 1–HÖ~iLÐÚ?hþeãáj‹J‚‰·±¿ù,¤_:”×àkËc îÄãeŽS‰^W“£ ™¦¢žÀÉ£ D{æßÏSLÕ%¢ó¾¶Ôìt§òf—Ë.+jcgð 1egKlg´2Ûᚒn'‹f›¶ U‘ÞZ&ÞMÙ!aM‰¤*Yg]#ñÂë‚K‹a·04µÂ ‰Øk«Ö9ù·0­öˆ’­ °w1Î)%=|—ŠCã1˼<ÚB©ª‹kË5§Ô~®±ýË]yS¯¾ èË­z²PnZt06w…JŸ›ˆe”›æÿ3WŽVh6µ]s T…ám}ÖêÅA:–¦Â¾‹ŠÀ5vP‚Åéú§0„=—ÂP›^¥¡”ï=;¥ÖBFCÙӑ ¼äØ,TË¡PN×V¥°KÙ‰ŸÎƆßùú!¤jÍXtáhLöŸ×‡Œ¹Ò0>î¢kº`bÈ䈷™æw4æ€Ïþޖ·³9x{å²"5U)ÑÒp=åíía¸~Ù8Y®êÀ,;–f*³H»K:Yñ¿ëáxÄú©èç¶iû aÃUðW²ò˜ú±°=@àŸöTÐȋFÌZ±¦À¤c­…OÛ$ê ðÂ:VID¨àw±›ïR°{·Ô>Í +«UJʧÛÃ>C>ãQŠVP‰ +-în(I¹krçÿ”<—N­²\»þJ£âÕRF¥d1‹JÃa•Ãß·¨Ï?B^P3´æÑÝ9Cw£Lµß§Ï¨C¾¢NCüBe͏º™é%^Ïëh¸á{hT|¢qè6€ÆOìju¡WëÜðlµ^««oeó¸ö-óy¹‘ø†ˆ¥nÏ^©ÐË¢•>£©f;â̄žµ|‡û´ÿs%”‚RttEï”„÷¾ö'ÂݗZtúæbv¯}à`¼Ò•Ù ‰7‚´ö–ªjõ6×oÍ[Rɍ]„¤é#röí_’âþEoàdIÿö“ÆzµŠ²}îâ"¢ì  \Ô87™Ç»/ÜùŸ(üeÒ¨tß-¡²oÑZ­Ýç5í_,‘ê}c÷\JˆtñA¼äo¨X|VëÁâ²»>›dWQbÀ'ZšÔ¡*'Ô^)5’&Zۇаy¡Â¯ï=*Üy*Ráf·G1‘‰*m^ÃË9ÉÉ-*"ŸpØÒTäóf@qø$>œÁç´ªff›l‚ä*÷±h¬sõn÷‰» ÀK‰©T«0~ J#ö±˜îÇ°âðc† CÍû"ê䔎 ÖøQÐH8V¡õ_ —.}ƒ—õ<„aI-æ¸_‡ñc÷J²Qày¼Áë¸b§WÁçșÎ2_x›"ÒQF?è=3Œ²}¡„ŒbñI¹Ø¾È‚ã4¸FzûªÄ›^ ¿Ÿ²Û d¼0»/+,¾)kö\Îräcð‚£gö].EŒ°E { Aí BùÍÄ8ٟüØÀc[¶CÀ+›¤f Uàð'aXâŸðXèýK,\^°ÛàÉGà Ê¥u‹0c‹°<ãǞjVÎÜòjþX?ϒ¡ ý*É$x)ˆçšÓþ5¯y‘ó 9q>{bÿ^ÏJ×ù _ÂT’$µ˜PUcöéuËü`ñVØeÏø½Å62,žµSJ!מ ¯ñú2wŸûì4IùÇÐT2©_öOï-{Þ VP^÷²^^cs~§°ž° @“ÿ€½[‡( ìuɪ¿&ÞN„ü‚ß…È/Жù¹‚ÁއRº¨’_Zj§/1‚Òs0oó`¢,BÖ4y¶sŒúkâ/¤´ÓÌ'’~š)˜og<í«—h©(51tbÚ]zÈgê´ÝFcÛPK[šQöÓ 0 &;Í°W ð + 4ó­´0×T¨0›¹ßA3:E7ƒ*ͨŸê3¤Éu±ƒºÜ"þn©}4ù^‰õaÐhE$lÌ £Íöº˜\6é/4{Ÿqø‘º ~ ¿ôy„¥¿ ƒ±6K µìc† “9—$Gxëm‚Â[XáEƒÀ,Ö~”~‘é\ÕՂÔü¢ ^â€ètœ53Œ†ÕtŠÛ¹&,‡g|—:e¼S)Œç¹g’UƒuPlZÇJ¢.V)¸œÿ:ƒä¼\“Éâ*¤ßWƒœ†ˆr!¬îM¼UhVå*¯æÜ]E\aÒü’.éªÒèY&Si ÍæJÕZ%òï‚q›´5D’4¾_áhGÐlªœÁ’J¼$k¸&¢ØK”ÈJ2ØêK/^Þ +Yi,= o­žhU”šx3•3›¸Ï´$˜°³Ä%öávDº9 ŸÏ—v†ÁbYl¥ËÊR€ՀQaä¯ìžc·‚$éÖcÐFS\Fbr.äÏÀˆûNú~[;Yª§õJcV!¾‹: 4_ŠÄÆ#UG$ûªÇ¡8}ºNƒ¿p\U^RGøËðóò˜ËKp‰{ C9y_º€S„CChj~€¯4îóf"VHFA]·w ܚ 0Éí¨±ƒ ¿c`´’gÒ!!Z@P†ó;¸´üv}2ÊäbÛ~u¥ ª —d„cÀzýÊk‡ÊÑÆ«´1 6<àMb÷‰¾ A°ÊF&þ™¯u{Œxƒ ø-8’Äý1*}ØЫo"èöŒ‡tÙÖÁ<¤í-8·i„p±ß¥Á;½ôË7!7¤BD3€‡üU6pÐÝö½ :öWw³Á…8À½Â°ì7w°aÚ.¬!8!öîpeèX9‘òïUCÎ^ûýzˆi¦±Â1©îÛ¸BpÙ¬ø-¸÷ô+!ÎÏÌæZ{K—ÊÞ÷ø ù=ßRN6uÄ`“x—ö¿yH‘c±ËŠ?T“cNá¿#ˆ I8Æ¥Èڕ?JܕŽÓ~Ù®&ÇxÑmÒ·wØã˜MÇóòÿß¡N])Œ`•ŽÈYrB*»;H¬ý´ùòý-Pˆ_j?@ho"ÿ¦ã%'Ë lã6Â%¹UI<à˜´/’¬›ÿ¼#Ì©ìm‡yaN”#…ÓPÏÕ6®«×öªº¯4lyŠå7_ð®ý‰ g¡¡,ðÓ/vçá<*ú‰Þ}îžÆ´ œa]ßUõÔÒ´WhËôak#åLÁbNÒ¥qP¨–Ä8ZÓÝÂF+aÑ Áv¼ñ x‡“Cï?h„ð å|LŽwS ÅCæºTr™M +7>œÎ?ò6›Sê°8ôï™Kÿ»f.µSÒÒòbu§AKCøb‚ÈŸ­=äÓM®ÎÓÝp=Ïý)0l…‡×¯8Ül$åÞ?jëÜe¯w/gn>óÊó”~Vcw¦z³VeÏÂê®´wSï ‡»²©ìá-.­>ÀÀÖ ²pŠ-’ã²f9¥@&›Da“r¦³ÉG6Mߢ4Î^òo±³˜À÷_ÏÀ1¬§;™wv Y.’.nß0µÈÕIÂ)è~Ñ,®Æ˜AW8¨ ªß½ò'zù™ëä–=p-µ¸”ÀèR +<ôŸ³É±Bu 3*Kn‹þr¥"©™èƒ‡4õ8- õZAíÜ㍄{úl؁zˆ0é&M‡×a¶¥½˜NÂz.3éC *£!:~ˆ¡+ŒÎ¢i+oº[­!3Úë>ƤϛÌE\Ú]o`dQ…ÊPœ&õnö_:^z™zH© _”™Œ$•»»/²† +’ íC\½ùÚ;ù׊ûû* |$þ…¿joÂÒd¯`[(Ñ©[N +øî.¤|À¡òüŸ…ꯉ´ðØý¬ê]2èqˆO)Ô*Š”Êe³’Éñû¤jj l…Û4£•„ÎÔÒ¸´¦Ùÿaô….§Zzã¥ÂÅ}S¯—¼~Ãa¼Šò»a2šLn+‚~ƒýFÖWKþ™Mä„jãöj¾¾2§ +uVnüñB&ç´$SA®¿­(ÄMN¡žëE9Ï?Ôqqä\PVõâøç·(XE¦z÷—åkDxk)™ºÈD¤ûúc‹´²è‚°ØLsÀÚEO#¢MJéš ½ÚX ‚?Äë56#ÈeôàròàxºNŸ>š"µz 2ñóÂ(ù¼Ž~Xo»ólº;îßizhåõ¡dîî¸Z…ÕgD¥(zJg?t~öG+S(PïϾ¶N‡Þ/…+Œeè1"«Œ°xY Ú Œ#<ŒOKº[¼(„?ðyýÙ¥Æ89¶Ù]‰ÆÚ +Ó¿Æó…Ú{™öÕ]®q£±^ª±ëx¬TÌҋŽZ™§CÀûb± ]Åн$‹¶óW,Æ8—kUêr +Mš^H—èaEDÍî“Ô‡F½“µÁ«nû÷V]#õ' eMŒiԒNµ¾,Õ@±ý7‘­1,ÔrÂ"Ð9cÜ®ùzñ‹uŠ,äâ[7Èê.ɶn…ê;Äö·È^µ¿ÐÜç#"’3šj‘?Ì:w­ŒÔË +цSRep©™šaÚU)ߎÍ+!©ócFiû/-1} »®¥þÞ\bO¹öÖ÷\Λh9ïˆ;)¼—ÆÛ»¬¾ž ¦aËzVžnâÆÞÖÐö1Ø͂¹è>èòzÎú‚8«Uz}µ±5Pÿ_p<› +oz]PĸPT8„<§•q¼þá;@}Ï.X7Û:Ån_;Ͷ]i»¯ýz[+”9mü‹¶q5 ´ºÀDN€àFSy½ˆ¯ÞÆ– Ƙ>ð0÷÷²þ7ê²/>ÿÄcLF.ãßy ¤üù7Fx¬…C'eÒµà:[‹³ø‡£ÌCº\rë!] ®¹…}Ì­à:[è}·‚ë@n“Ï2”Áu ·÷‚ë@nµ}̕à:[m¾8\ĶÁu ·Àd·‚ë@n=¤kÁu ·Àä“x‡¿äö.+˜r‹6¥Sx{¹EÛø)¼ƒ½ÜÂ)'ñörë!m·ã¥O³ßB¿¸\r‹ºÒ¥à:[ÜûîׁÜzHׂë@naŠ¹\rkñ/¿\rë!w‚ùw£Ìs"ï`¬eûé(kÒ´Sd µüÉ(ƒö‰~4Ê<äi¼ƒý(C^ìÞÁ~”A.'ñÇF™ÈÒüx”áæÞÁ~”¡ÝòÞÁ~”¡\þ£½º÷’ç¡ðpŒ–UJȒ"” *â¢(¢¼àâSqÿßI:e´TÚúC›&'ONžáDv0—2|÷ͲÃEb9:•É®ï`›ðGd=„-›ðGdáôíØ“0ð‘{M‚‡°eþhàVÚ± 4 à”vØ9ª8˜Ê€ÇŒ6á”rEʌ*枔!kÃ&üÑ$x[6A“2ÚV*óz.sOÊd})¹,e؍+¹Ì )ã™×»@±¥ÙÁœ Þò¨ì`N +JÌI!vPvC +²ŠŸÌIù1'²ƒ9)h*vdvÐý-nñ Rðæ×R€s1u¸Î‚ÚÉû®3¤€\߶ÃEÊØÊæÈj«™̑õÎdsdA_ŽÈÌk;AàoÁ[:’Ìý­‡p&;˜û[…ùÎæþ’ÅùõÛRæ±p¸ÎHb~3‡ëŒ”a†1q¸Îø[aîp‘2¸/¦×)CÒ=)ór™{R¦û17¥LOKi_ʐŠI¸Ð-d±c ÷ºE|$á@·ˆ-Èæt‹ï‹ÙÁœnÕ,vlv0§[XŔpIex/6¯}d=„ýÄkYÙ)ÙK¼»¥ìeÜ+eBÏeîI™‡Ðs™{R&3?ﲔé®IÙõÊ)3¨˜‹R†î‹šËܓ2ÅÁږ2ږ”yg²ƒ¹”a}q ;˜Kî1²Ã>)ã1²h»‰×>²°ŠíÄkYp¶¯}dá¾Ø± ”2Ýõ¹)e bvlÂ¥ 9%6ÁBÊ^Û z—”Á*ڮݓ2t_4ZwMÊP'«¹Ì=)“]_Ì(e7)Úi)ÛT1w¤Löc/.Kêd5—Ù•²ÂÁ©L^å(Â=€n±c ÷º•µò(µ¤Û¯B̶ѳŠŠ9mÀ6zVÍbv-ŒU! õ½ ¥”å{Œ_c÷ì¶y¡ÄŽ)Au™x^º6È×ñIzÇ ™zàSE–£r:ˆj%µž +'O¸rì“áÉH¬„îþŒHêt‡J½il{²»4º4÷ƕŸg58«ÞrëE¤U„Žð…™É4+0¯·ó&ö–u**H÷1$y•Öo;@Š žäë|AØ{™‡qbL˜‡Æ’†>É®<•º¡ÔÐÑÜE°ÐðAÉ-Pêóuýz¥>ƒuMVBÍâÓˋ +Ep8«1“å4ÿòY¦"ú¸ã¡Ì' †L×Ð|µv}ÃO–_r°ö4-pq7쟥àÅûšy þPÚÿ’Ü`EÀåZS~ôEN# #MW,õ–ga\Žd^³¡$4Ã( +žÌ=dpÁdOgÜqŽÿ ÿË©“-"ø3}‹v¾€k^*AQƒÁ~ž`©ìå©.K0_ _õ¡<ÒU¬j +¶Õ!ÿð'J›ÂÑfU¢8ÿŽŸ§')>[†ÏÞglDŸ!æçۃ…¹YjHn”ÄU¸7ñ÷z‡íå[åHú÷g[eþ†ÀCȅƦj”£êa£ÓjJéÒ¿gÜ ÿŠ£$X-¶¡ù±£à +[ÈÎÅÂïõ@Ŷ[Œo¢®W…àßÛHê^;n_ŠÇªæ뱔ø•Ø85äÇÖÅ}ž+ä‰mzuýmò萳­_êu²ù×ÆÇL#ýSt!Üp̋˜2€ŽMž<-$yÒ,Å?jOmäú’ÀIíÚKáSöÊ4&D÷œí-\Å?¨†HH°×¸ðWsÀaÔç¡lòÉ#޼ѕF¥òÜËb’Uؒ™¼ »U”d.'ÀÓÉáJHÈ=Â`òG{¹@u!cQ*Ú¤¨Kˆáq|áֻƺEe•³7JÙ.$ñcUÈJøÑ ‘õe³0w#V/eG!´e!@ÁZ!²îo—‚ø×¢ÚÚõ·å»‚÷²wУ%0 M–CFKt.ƒ&+Ë!ÿy͇ ½tî,·Þ‘f–Cç{‡€ƒU -ÑéŒ,ÑéL–»†ô z·D«!³Mqm Zø¬æ‘-”†sëN–F–JK¥÷¥u'ƒ²œçÛ@iáµîdim `ßï·îäÑh*óŒ&–ŽÞ÷¨uòhº³Ñ ¹ê{"ö{Ï#1Ûþ¥<1“·l¤ôYÅ~š™|N¾*ÿ¦?àÒD8~~½J€¨eñ¦q`þf” žN¹RO¢ ,‡]9öʒb¼û +M*;s2ùîÉ»7–Žµ½>±èCù$¥›\±ßÐ|;P^ÔDJf~œOe PÒVÄPz«0ÿK·¤j@³€;¹s (û„F™.íECΑ.iýžÜæ³bñ–Ì}Ÿå˜»€² ++ùßhLDýЯ¢PÂħŠÕ_í¡;àHfwŸ·‰‹bj0Énd­íU‰ôÀiõ M'^µò»Ø·€(܀S/àß̱½9ØÿûG֓ÄZUü´Òlæä˜|õÚ7O^r¯qO£x i9vs£iÛ͍£!ӑP]‰5@­Ä±¨EƸzÙéÐs—ŠÕçÙvö½K»;wõ•ØûÞ³Ö©íéT£öj&v¯71¯6ìEå½Öº¨ µšÜ²z}ÉøDÑúxá¯åéRF:ùrþߤŒ'Ýf·j”?–2ã¸6p«j%Ü›ÿ”·ä„wvß˗·®¿Y¾,¸u1Žk·Øcv{ùÉl® ܺÇÀµ[èd§Àµ[ºY8î܆,¸§ä¸6p«î•N€k·Ä)9® ÜZn.\fáýø[¬þ>v‡í¸Ew±Ýa»¿…Œ9® ܺÇÀµ[Ð}§Àµ[mq\¸%Ln,ôk·.çÀµ[ã¸6p«rìÀ­}ü>³ b{Ù¶gª¿—Ýa{fM{å¾¥ÌkHx˜½ìÛ¥ ™¼Ýa»”‘©ÜÃî°]Êà[¶íú>ÇR†v»Ãv)SýØKuJŽw«³ô¬‹ùf©dì/ ˜¥gqö-]Ûôù"Ë×¢©~"ê·L¤1¿`øÁµ±Ç­œÖâ‘O|v¿ÖÞ҉Êá ™‚ÔfßÔóÊ3=·X¡ +gŸSàm$±or9˜‘ÂGbp¦Ä…GåE¦¹ÃWê¢!ò*“O¾ CCbk‘¯H­øï?$À¿„f‘FÓÄP¾ÉÁ冗ØÃa¹Ïc€ŽÞÌËÃLI yM’~—Ç~Já¨ä¥Ü@®µ<¾}Õ4—ø8<T:÷fcZ&ÚãÏ®1\ElñIÚ;Ø,úñªò¡I…Ÿ'oU©ÈŽcáçtJê~f@ÒÞBg_0%å”{´î +/)Hj\¦¿¢^9Ӊ$á/ t_öJhªÞg| 'aƒôÜ?íë“u¡þUyÃÏ\,)ÔÎoŽ4¶¾‡Oã“(Œ™X5Ý÷ÝB†”Ö:Ë#J쑒\0f'û8õŠútÓÇäì]±øí>ñ@1^æ4þ XOñìQҖEžJfOAïKå­êʛ¼~ªX¥”^û‚‡¤þà)™•¥¥¯wý2_ÿ׸|¨|•I챚Ķ2à`¡ýf1±œ/Ë^¹RƒâĐÛNQ,ÿ‹Áe™…9ÁnKÔÁÀ-фÌL}’ìMfŠP¦jNö²çq©è>Ê +õÂa:GTÄû£·‚Pk–€0¤aM#® ä4÷ úÄý³ò©ü5™óæΝH,¼`Ýý¡»Ï8¸o´"úâñ×`bvºÏ½Ïxø°:û©9c&Ò9´õ Aã H˜GI­Œ£lQ1Ì‰Ï Ôh%`j:Z÷ñ¨ª`u)þéûàcýiÃ.FPq1̏™ÈYáÂ`²¦[<šê”Äò0Äë¸æÖIlnœÁ´âi#%Y=öOE—Ý.%SÂØw,:€Ð&g¦ü{÷uJÉbäƒÄsû毛{zi»ˆ_­ÍtùÄ£wὌù2îtÐÒ¶¶ øڅê4åÖÜLO,¥Ó8Ñý¶dò&ì×t¦{ÎlZ*)´]ݐêWU‘î…ûó(þ%SÇAÀòa”˜dL-™ZÁÑC~é¾õ£­OS5#¦^ w•UTäAÄoÄaÊy-Ç7ËMδò×Þú÷Î ó[oý{gM{ì'où0w2PWûq.„SýWÞä­&ºIÛ+Q_Ä@nZ0 ‘2dúz]ºæ®­úŽ‘µ,<Íù̯•Ø8X¿˜´ð¨Ƃ‰AZ#}ãÛèëÐð­î>ʹ·üöC žEª²*‰® $gˆt2NÚk&°™O£6'ˆ=Ëây +îÌóÔ8­YÛ}™öA,1ÆX >=L%l|ë–~ú¨´NäìââÜj?}™@YöÆÇ°#ο6Ù8ÌØ7kdq.V[‚t>#§EŒœÖL ›F4-÷½c‘ËwÔP­¬O.¶Däü .Ã:LàŠx4±%¿2%¸¿ì´%˜„6¾'ÛMIklÑO …Ł’x’‘f£(ró¼€:ҝ5äç|Oì&éùQ“´Q•ÔÓbqâKgïÏâO†´õ |òºþ|ƒE里tCQÿÒv1˜îYI/²a4%êÆu9j,‹Hág(HfH;óJ0 ¦³ +-Þ¯ò84϶³ï]*V¹ëÀø ìÐgMxÚ³ðdb÷º"ñªú\äÑëtÃÛdö» Á“[V¥Ê¾tÙíýVäïþî»Z ¼¤Vœ†ƒK‘¼ã^I”}v"Y†ù}[‘6%¨€Ò>ä¬Â›½È_êU÷%`-UY,Ò©I!¼lò•›[ã T?ؒàݖKËÀ¿Ä^4R:ôúÅÿe/¿Ÿ‹ƒiSÀŠÁâU¯B„Gºýž¨ÂÓGˆð¸*=•ñ*¡iÒ9O5'Áv0é„Õϝôì1VMªÞɁì¤hrŒú· âHxŒÒ<º%­Ž+]n¾ÑùDஉC³oªËs‹ªÉ…g×æ….gGË ¡ œó^”t\‘3&Ÿ€}rÅP»ã\ëêl=À‰Œœ +?Ðy©cì Á"éNJèåƒEt@p"§—«ˆ4š&ªÐ*ï˜Þ°_b‡IºZ5îù«‚ž_ñ'L­Fo6¦# ™×5YnñÉÍA1*Þ_×ÛÀƒ÷°™*ò?| îK&Ýáj…8}ŸÆ' xO¾Nâiµ¢FÃK‰t¥|x\¬ÉÞ³Jە¹O܅X‰ñ hírT,wZ°Ø2|ƒJpÐØ1|é !ÿµtÞ³dQ°h ì_´‹‰€5ↀ‘Ñ™ |&íؗ`ЂwV"j$‹h°(Ì7µNîvo aŸIãÃÑXÀ0B8ñë/³¡>s}¬éªkh%B_ZÅax®ÐdƒPü$1ü! +8:ù ÈÈõ®‘–}Þ¯Ÿ"÷½ðÎ@I¸=få*²I„K‹±!BŽ%ÈÅØ!Ǥz~¹u"A.Ɔ9– ºWî!Ç„Ù-B;$(ã/rª³Nõ/Í8nô‰é"ßbY]$Ž¸:á×ö oT*ð/‚ìuóUË´} Òfÿw{Pg^³ìAÛ· מö úØÿžÅi endstream endobj 24 0 obj <>stream +H‰ì—i_ª\Æ?ÂPAـ榀šZ9–Ú1‡Ô²ŽejßÿY{jÃñF±wÏ´‡5ü¯k¥ª‰¤œn¬rœÉÿUãùfz š¢Ñ¸¢©2#âhrÿlȌ‘-sjû6ˆŠyQá´`@“Øt /õ/ç**ô}3uîµ¹ôÍP@wYµ¾åz¬˜oÞ«hÄ´uò·ˆGóÏÉ~ ;¶41}Îá¿feoÒ(ʌç¬$L•¡„ŠírJ,DQKKLT҃÷º8¼ŸÉð +҄i^KIþN­‹õV°Ô¬#”Ã/‹’ïñÎó÷¡Ü¥¤=§¥þí¤*e[«,qFÅJN#×@ãA/NU—}[^áogœZafrºéù@B$ÄÂý*Úúj,ìWy™ˆÈ©ÊÛ ^ÀGÑ\úi%ã 4ð:,ÁæÈß` ї3¤ËücÁÏ©§)F˜VʆÈÏ5„&ì{H˜ªJ•|4/òì“ßZʟšãÖÂË0_#a[ïòíQ5¼”–—°þN_÷!%½±¶Xœ³jæá*öêsëÁ –µ¾õ‹é/ÿ±ôtY¢%V=ÑáÑ7œÓ°v9a}“½U’<Ñøó’³Î€Ÿ~Mtɟ>Oâ Hýf#«Šwœïv†ÏÙ¿±ÓÞåt±–Šöð½QÃÃ"¡­C©¹¿hÄÞAö+!#4½ù0Ãk¦®ÝDä˜r6&ÇΚJBË4™d_{Š–æ™Fæõß>ËÞîs=ÿ]Iò?´¦çɲg§m„9§?r¾ÂŅ¤§£öƒÛ y ½ª ø'|äKø~·ˆS‡]³ìĖ#ðÔÃPô·$Û ËÈ;I2¿ÎCr…&b9UHäÍ; /'!cÙŸ­H‘âÿå(R;Λ}(Ø31VÇò¹LU»ÓKžºÄ*Ja±P•¡žæê ]+üén}ÎûHàµéϵõ­²1µ¬|Ï`ì1SÿðNÎ¨‚pEθi2¥ÛÛ¾Ôý¸?צA„¼ ™Ù[y‰  ¦WqëÁðšÔ ý}…Þ†MÁºð°…pù­°®+9ëJŽlî"Nò¼µ} Z®ËŸi!AWª«4Gz J»n†ù½1$UNڛšWãï³Y‰'p&µùíö‘˜3‘{‰²2@†ðôFG å¬ÞNj¿/vÃMs»½sÿ-¹j-¿=”2P'~4~I¨hҜq_ñï1øÏz°¥¸Aļx­À{ZЄ¾ ’Éš¹˜}!à]¤8#•µn…e!åÓ?~¡Í¦2=b54é¡Øç[x"”덄Ä aÙPÎ" <Ñh’‰8ñ×°ßãµI~€~3;^üYš2қyTH„_„3D3DFP)1RQq5º€z©H"?Јˆ@^ðbrúæªÂ/àJBlµØgíR¥€çVÁY-|Ò®û ž×cžˆKIÑöá-zAq^/ò…s “ΤÃõ~åm«¦G¾Z›Ð —/ìçÄ6ºŽ+9Ròm3Åú_r´õûI…³i7ZäâgÕ¡ðÐ-ö3…³I…¢Ï'M”M_)åh†ŸÓj³Qç=ôŸÀÌØ+ÙÒ=Áq©áá:¾h±n/#òEî²KÀøGE]ß%+eۜA³ûÊd1acv‚†¬ðPr¡ ì:ôƒ´¼ž'э—ìBù;ùõN®ãût(ßÌÊ4Ñ Õ ·>Ì4™7m ­Þ…ÓeŠk&gj3|•‰vG>óöþNÝCÑÆÃË{Nv'­áڇžgm¸–ù-êš×ÖB&p?ºßü68¹ ZžÉæ=¼,¾’†®Üö¶"+µ³§\Ž{M]\gƒ´\²ÀÇLF¶V¶VŒW>m"kõ¾ƒØº‰,f²³Øº‰,QdG±uYØå_±Å ñ<Æ0o„~ºsâñ•mæRFøìçaçMÆÃ?=7`çØjãIWÊ·ªp†Þþ´ôµå‰Ûô“ 9gÇ ýb¤xl{Ömgݐ6V »‹ÑËÚlñÛ.¬ „ðßB–ë\ˆ¦ÕÔ®#ø›læ×V{ßOl#?¡÷·£ÔÞ±ÒÆ,DãÁ`ÄHØÆÂÈÁ—9„¾Çã íÿY +—ppã½~r^}lïõ“ó¢èc{¯Ÿœ—©b[Þk3:˜œÎ 8/ÖÄ@ï?18(WƒÓy´ÒÅÄàt^°9¶‡”Eþ?‹ýÎ,6™®kv{؄¥Œ0Ù¹M8PÊÌ®tl”2s~qlŒ,¹Ëñ ؗÈRô¯°/‘µý˜[†&åpèŸ&¢÷² šŠÞË&h(z/›p IÀ]¹± Ýf·M8Ð$PûلMî—=l&p̹M°MBšÝKÊ(z/›p ”}qn”2RcÎmÂÞR$¸…ì»®Ü∹®ÜbEv ÜðہRFòò_ÀyöÉçf*Ûr}‡×na·Àu€[ÒûÛúêGÜâ]\×n)Ú5pà–T²;à:À­©/_€Ë{*ƒ»ev؍[Š>Îì°·¤’îfv؍[k׳Ãn܂ƒ=Êì°·í¸p‹kìyì +¸pK¹®ÜR´kà:À-®1§À=ÜßR´kà:À­5‹¹®Üb&»îwÜ^οD–ôþf‡Ý‘5çJ÷³ÃîÈÚäÿ])Ãyùyv8¦”aŸ|ŒÙa·”}òc¿&eí~vðÆ_„ÝRFÑǙvKEgvØ-e؍oÍâë¯H®d34¹?G¿'eԑf‡ÝR¶öc¿*e&Çö˜º4»¿”Šev؍[¨±£Ì»q»5WWÊpÖ5kïrdö¥fÁ)ý†ûR³ØýW՚ü5…4‡]ß%?‹3sûm‚ÔÏI ©ñ‚÷Ùb2a•ÇÄÓÄ@v¤ošuÒíuÍßnGö‚M¢ñ ÇowÉ –•™T6'L•¡$ò=VGã¡¢JÙN¼h¹qX¬µüº˜ÔËÃKra³s2[»©0³/â…ö‡Îø¡ä4UfúÝ$ô•Â‹yñÜ N ZX'0?M1´R6D~®‘Pú„©ª$PÉGwHµÙ‘ ™lÇÉbvòˆD‘ôì:M-è}(‚îÀ«u{åìÚiV€ Ú:ž\ˆƒ¨µR’0ÊPµ¯‚ä÷Þ§HLpÅßpj{áùGEäÒR’A“„/ iÒ\ÉRÄ+Òc +xQsê*ÉYJN7?š4"<Ðæ2“¼‹Ã“òŠÌ,iø;þTfàÆÆ~¯O /ŸÊÀd|eÃ>X1‡_µÐZiț§ÿ£½:÷‚øä!ZBšºx¢ˆ‚ E°q +*¼ÿÍlzDŠ/ù¡ÙìÎNù­K´öªô!©~%çþìQÜS ò?z珒ƒ8ðX7g_ûPåÝ{³·‰¬ãÃQBÞWÔÃ¥Ÿí˅»rي:£€Îۏ»Wº6{žÄò®à±AòÎàßî§ E­“—íý¨TVî=JxʎûeÕïwáh¡b©U¸ ™i%ödG+0Gªˆ(Óï2€UÔ«K<þÒr`–B·ó‹!'oÜê‘n$¥uŠÜ²ÎÜbã˚@"o× Åò %F†´ÿ‘@ц/iO‘ê¢ÎÍN¾ËïsR+îû‹’$ªDø£ö,&õ‡©º¼Ÿó ;®9MÁfs9< ˆ"ÏWdJL¸BŸãv7oý†…58³­$|3GFÁð/߁Znñ¡Õ¼T–ÿ.ÔüùP’‘éy]У1z2¦ßD⠛ȍãë?ük¸žáy*¶@EDZY°‡òLÍnW¸ßÖU¸F/´ÜLËLùð˜\Ò)Vߥá@e–PÃÅ@¨¾¡‰ËÇá‘j‚s‚†;z‚@ƧèÚWU¿HWS­dä!ÃFª"L‚6C&61Íl0R>ïÖz®¡}ø€ÍRññDØéør± ¹ÙbºYðâ;:5¿(fY_䟜×Ð _àì[BÕDÛ7±Ò –6Aldþ`¢÷K÷êÓ>¸=.h ®UxRv]-"8Û@10d°±¾ +¤ ‘%C£Ããx/Š Ö$5âpôB[MBž)Èp|KIÈ3—´Š„ )¨ +1SHe1á±y« +VE# 8Åj:£ªò‹q5˜éxk‚} ’ÌâÁ%ă])KGIlºP$çÏ0@‰Í2Ф*(ÿ’Ë*ÂafÑM†–Ó͂'„Èß©ŸŸ9u(_4SLeÒe§…‡“b±’òþËR1wÀ=e +ìäµïcbõo¿”¼õE¢5_$7ná¯_øéóÄå¡,u±„dVz(ȝuœ’EÚRßֺЗï&€ãôÃæ»H †ŒÄAëÎâ"ی°0C}Ǟ3ðçú‹?º#¤ø"Í0*ZSj$ORÉj¥p¢^•ë¾6œ’­A³ƒR>Ò>+©µë+$T!ARiœÚù8µn*…Nš0/ß=ùThÏ÷_ʗր*š*åNº™ßè´Õ»Ùh«v?K|vÌi|.$ÞáϪ P]€«ÒÃÀM¹WZ­="öjÜÑÿpRƒ¸_ +ƱΡ†¹ÿàˆ.QúL¢ó·?]¹õ’Y¨Ëš¹õ’YŠ^7·^2KÑëæö‡Ìfè5ôEoѤþ¨(z‹&õG} ¹$C!TLõ¿EUKÑD×BªQK×n[ÕR uí¶U-tò]»mU«ó‹K×þ¤j#ȋà¶^G!¼stѝ•§÷@§’)Ç&ä<_`Úa(ÚÇ>¿žÁÙəƒs«ÿ€ã»'p%÷§E™ s*ÿ’HÂã¹PFƒlN*^¦ZC²Ý/k3m+énR…%rÍîÅÒÅÓs`óæz•ªõæ*@X!-§ædF®àƳ¬X³p*§;åþ ÿ´še‘ª$•Aþ%—U„à }I2vþad‚Ô²§mf +,’™5ËÔÅPpÿšÃU1:§Ó´ø¤­à cb'->\¶ kßy)´›!9Áž?äzïs‘}ʊ‘¼”f„G%ƒ2•xø3¾/•¥§ T¨‹äæ¬_*§ß2r¾“ E„êTfÒW)2/é8Y$3Ÿá<ü™üÔzýp_¶a–7,öË4F“µvLBð³®`2 Y燔Ϫˆ–¤½*}H«?Vtø(î)ù½óGɑ<$ÖmŸ=O"9×g"Ûy²‡uñËÀöŠzè8/«~;OŠÎ@¿}¶à<&¨>{ ƒ$¹¡ã<•wî½'y®â¼_f­»H¥ùUÁùaVÜvYcåÓñÚ«l-q` ?ï0A ِ5¬‚‚( +¢( +.ƒ€lßw®Î³ŸªîӌǛNÕݵý‘ +¤\ž< ¿Æ§ô­pSœ9‚DàL)!DÀDw!Œ­!wåqI/õ€¨Öït8óŸA-Ž¢áìi¸¨7Š&Ù¨ÊiÕ]Â'¾¼^>ÐÊ`EÞn™ †¡”L>¢=ÝqY`Š¿M–ÉQ%àtꎾ·>×4AQicJ%ßy‡"ŠI¤À!¹1@cÒ òµÆœÕY—ïß­£´2ÕÔúP½»%¡95\$)õ`L?:ˆÇu@ìŽöÑQ샄¶$¹üè ÞÍ×âåŸ #q‹ +¤®´¡‚9¶¡ämvL%´M¥Q _6•Zqu› •_«èràE *ˆ/Ÿ*i“-ÞÑåØ2¸MÅä%¿M ˆÜ6•–þ‰#rӞ,Š« {4üSö֑gnÁ)>`šÒB³CÆ5̍€6ÅSàò÷cܾs«Ç‰©*8À¼{wȳø€¾ ƒÖ ÂæqHÀ@4°çP½ïßÐA2ìD)Kù€úâRe`L\ÄÞ:Û­‚ì.PW+½XEe™¤)¢²bÿQµÙê ™¬[ME›­Þ‚Û„¸%ˆ^èŏìY,•qf±[#®¥,AQq \œ8UӁ{ûRœ n¢³3òäRF²Õ{doK½ràÀÖ¾ÕTí8Êãßêö FÝ1ô•RË@ÛA‡ƒk*4'T‘!“)oTBÖ¬² +2~ب)D‰Ñ®FSò Ãc€Ë65 ôe¢Ðø‰>EdL¾S‘餴0a{¬SW*–öÄ'óe¿XϽ= -2bŒÜÊ~8yöšêëû?XliŽÅýV2nf[þĽùrP}Ï^d'W¤óƒÏuƒ=š¿âcûÕbãagrÇ÷¡&»†¡_÷¦B§ ÂM^¤o}ï%Œ<<8ý¿N~ɞ„GÍVt½5L‹óáðbøŸe~ú¸'Ë_ñ_jöܬT£ùáãt0u ÜýÝÃ%v4V?a[pf¿öì’Ë?ÅJ£ò^3ÙÏ?i”«ì’Íý.ð~1ãä—ßeÏI +ÏÉwƒ.'ÅsN(/d\v”p-Æ1ø±T+ݎÓÖtÜËç¹UA:©]å«îܒæGŠºˆ–c÷¥$„è*7lfÔÅóQü¶qË_çÓ/‰´~¨äıÿܼ­¼å Ý{©OZzúŒnjÁfì³ë² o‹+¸ \©Íɗ½'Ÿ\µ9!Ô÷ÂFÇøHp¡l¸Á…T_ßR\hrvƒ·áMù¯ÁҁJÿs`é@%!€?–TB³ù1°t ’K*~ ,¨d»üX:ö<üρ¥•É?–T"ÔüX:PiәÏÀ’öh$ÊXÝ©tw:ʐ©Ðj3ñ¯Û tl4›mF<½ ¯ Í¬â ì5eNÓ´ŸmÖOÛ ÍødG Ð×š‰yiUüù;SêÏy:sHˆ ©KA!³©u]l.€“Úð÷PÂ¥ˆÊX{ +Ìȝ) XÀd¸[}ì0­†L‚£¾¶— +…ßW9.a¬.¾Dáø”CAúò´JÒ~Áv9€ŠNˆîÃj5•”¬#Weã-ïR…FypY6ïGف›A×±‘\w!y)7ۇà<× Vží"W¹ÉZXnÊô[ß[y‡eE¡1ß%#‚PJJŠÄ…aÛ:ïjZQ­-æsc‘H®(0ù£Ó"îRw•×ÌzáoÍ%*_‚òӑcÀÃãWÑmB~-l˜L_º@NF@Öb°3Ȓo^o*]Òü$?Ÿ'§A7|ß M¿ð‹¼cBz£ê†‰v»‘µM¼ +®“¤.r-¿ÂM"ö'º:ø8/#G”:ÒD¾"-Tè×ÛÅ]˜à¢•wË5ÏïèýŽŒç3(‹öj>ˆ·X9^*H<ÖO4µ>ô¢ C|çÙÄn<üK0sD:á-ÌW÷Iƒ°e"…t÷)òÎÍk¤‰—Gù‰@dÑõãðW¼ãpÛ6ŠöØyÞZ§®à¤:ò„y,'V  ®¼U¼¿[à'©›٘ڧysüÃ4@‰9!¿8·pãvª[·Ð^K Éå‚î<ü`¹ ®;.ðð¢y=èYN€ó¸€¥û‰,}.¤ÍÙÔ傴Ÿ@&³m©XH¶;Àa¤ÒMÃõs±Ò?ʬ+l'¨Nb·¹©Z N˜ç:]Ç Âƒ¯yóIˆ‚Ë‹üwqù •¾4!n˜ØÁf²ÛDðïM¬>ª—]+B”ÿñ 6»Cß½†òiY“οË5Ôt~QûnRé_ðð[MÈâÕýUmËAÿ]ßï0²ü‰‰]3B¦)Å<ö©‰µ3lšPvg8s&¤'£‰~º¾nâ[I…œ”ý› }W:•Ajӄa™ØßsÊká-UÍ5=5èèù&áDƒéÇƺž´SŽ}u+u—®ãá¿4úfž«Š+Çþ­â՝Äα?Lhß½†«ëxø»†ñWg 9¶yŠðöj+G’'¦DÏ0OEÃkŒÍ®ã ò®ž0ä¿?Ã"ßM*Cù(#þ@䯢aìBnHãÚh["Ú®yùÙôõ¥±•F˜ 0%jfü0G§2Âô~(VéJ S„3Ózñ#6öՇ“ÂãhÓÔö(dܕ²¦ög!œN}F‰—þ[!3H8ÝòÒé~ž¾ ü:úhD$K`ž™),ãY„ҜÁ2¢ËÛŐ Š°ïèè¾x'v«p—§^æ9“¨qs>Ý•µÉ½-º&ÿ` d· ¥lâ “åçä“-Ò\ÿ ù*/–àT¤ÓV©æíÛß$—2LX¶ ä¼Ç5ғO!wRò)Ððõò~ c~jPÛ=Þ¶}&Q•‡wÓþ,dÓkŸH eü¦P•Ç}­œá.ÈÿõÇr|`f¯»º6l(0@tŠ’zr>Â~p!©!îÇmÇ\(tMôjÆÛ9_cb/“Ð.}$sœÆ0¦œ7!‹ª~v+ûa†‚ÿ£½J»šJ‚è/xÿ¡%‚ÞQ4,H‘ÅÄ@ž NH0 £|™ß>·ú%D<&êã³×ꪺ·ª«7M_ß}M«cH¼M^öM‰âšDYý½ÿxf{®çæ·Í˚?hM'²«Êþ֝!÷Þ©ÚY·Þ¯­íì^ÑKU.ZxñLß¹Fµ´ò„RÅNÁnµ´¿*ñÕÒñ†¶ÚÛjغx÷'i¸¨–+ÍÆ°¥N, °I⥱ÿŒ$îãs¤ºªÑ®‹bwãbs(û°²[²m_]Óæp®õ¡œ03ËowWȖ£Ò–}¼ÞêžÐRä^Ê0⅝šÂûmo:€¬¥ˆ0¢áÖùp ݽXb¦Eu0Mº6ϗÕz@kåþÌü`þ£È?äEu±RIÌï亂aŸ½.ö³;ÉÁâý"ŸEœ¿šUW«§»NŠÜ«žÎ>šIÙIߝ[~QèP~ÒD6¥Ÿ¾}¹V°¶üÐÔ6Nñ=Q÷•Õä6\3ÿdf¤òZÁn +{²e ¡çß®,þ]k©…ýí§)ˁÉÕùºöhí)-’×£vá£3_ŸlP|>(í«i”ò«¨þ±8[Œ5[=Gw•–¼¢º­ÿï|6—MÕV¥l,wZoòσ¥îñÅYÞdSSÙÊç´À6ò“ÓN½y™÷2ɊŸÀ¾>2©SÖ¢ci´~”M§µLVX¯–FµÖ,N»fï’=¢¡Ýõúöê{Ċµ ¬cÓÐF4°S6‹uа‘ VÿÝOøld‚ üiœýíFñÛmfb¨)v_¢óúÄ [gïk‘àÍÌ1iØYf¡F=5”·h¹ô»XQÏÞcý&t°J¥q¢Q.ú@ áƒ7¤ƒS^Á!£“©ƒ )«¤u‘íÖ2ÞIŒ +ÆX.³LÆÈ-ô0Aòè ”qš k<³»™†«`3Aq¡”eNa§gǙÑS^ .t”L«À½‰Ì9î¤WLÉT¼rœ)g¸‘¶i݅A0‹Ç¨=Tä-̇IØ̔Ö\E˜xœié°Êo\¡9¤peŽ$e`7Œ:ÎúY•ÈFD«>ïåùv§ÕЩ×<ËW;­ü3ú’U·ÝÞå¨?—e„Ú1`Ö"Ó¶»3$M‡ î]”îVv$ÆÂ÷R°õLÂOVY Kí¹Á¥®ô[œ.:As-a4u³­!Ç>­™:Ìîb€w¬KËPh°êjސ¯Ú77\ñnb3úäI`S_ÃFæߘt&’%B;bra‚–F“ Üџ§%`¤¤# ȊJK.#ä€”„TŽÄ%h pDX\‡mÜ3‡°E +:e4šh¢Hn“ð\R_i—æÛ7Öhã»N|íºn_–þ®¬UXà%à " +7Zσ×ä.µõhp/"R€/ ̏P)ISVRÄcÀ°”§yˆŠ ¹:ÏråÎí¯7N†Šù…¨È[’Ú/‰ +]Yð’2<]d*Rv÷GäÔR5á‚-/‰KAGAȌoŠ› ÎK\q­ÄØ×´øŒ’=Žì(/\EÜÓåSŸHQ?–¢ãË ÿ„ZºÞ=@²"á7!·9®÷Ì ŒaÔ!‘k-$3 +E®f&%î| ¾ÿp¦CCç+Y” ‰Ñtu ύžb ghå (q$Ý×wMWqL?ŽMøEÍ5’Ç,ÂAJÊ7ÞOÈyKJþy–ráÇy(ì"U˜©à!ø}‰tV@ +BªfHV,`Җ®*àSc$¿ýÅúÉ@³c€6¶æ„Mâ’3E:/ù%P7š"Ÿ IºË„#ß¾¹ô§)³áj–Æ‘ ´CI¥/Õ3-\’Q€훻R5IÐh-Ó~”çÅ6N®EÌ S Zj‚ØAҍtp}¡xeá͕ÞBâöªy’¿é5OÛxsô›ÿä¬ÙétÍA~ŽvÒËûÀ"gý¿ºŸh[FËñzÛxžý'À=6©& endstream endobj 7 0 obj [6 0 R] endobj 25 0 obj <> endobj xref 0 26 0000000000 65535 f +0000000016 00000 n +0000000144 00000 n +0000021707 00000 n +0000000000 00000 f +0000024726 00000 n +0000024540 00000 n +0000074969 00000 n +0000021758 00000 n +0000022120 00000 n +0000028374 00000 n +0000028261 00000 n +0000023430 00000 n +0000023979 00000 n +0000024027 00000 n +0000024610 00000 n +0000024641 00000 n +0000025124 00000 n +0000025502 00000 n +0000028448 00000 n +0000028656 00000 n +0000029633 00000 n +0000034894 00000 n +0000051182 00000 n +0000065251 00000 n +0000074992 00000 n +trailer <]>> startxref 75173 %%EOF \ No newline at end of file diff --git a/writeup/figures/rmw_atomicity.dot b/writeup/figures/rmw_atomicity.dot new file mode 100644 index 0000000..8b1547c --- /dev/null +++ b/writeup/figures/rmw_atomicity.dot @@ -0,0 +1,12 @@ +digraph rmw_atomicity { +margin=0; +ranksep=.1; + +N1 [label="A: v.store(1)", shape=none]; +N2 [label="B: v.rmw()", shape=none]; +N3 [label="C: v.store(2)", shape=none]; + +N1 -> N2 [label="rf", color=red]; +N1 -> N3 [label="mo", color="#00aa00", weight=100]; +N2 -> N3 [color=invis]; +} diff --git a/writeup/figures/rmw_atomicity2.dot b/writeup/figures/rmw_atomicity2.dot new file mode 100644 index 0000000..483367c --- /dev/null +++ b/writeup/figures/rmw_atomicity2.dot @@ -0,0 +1,13 @@ +digraph rmw_atomicity2 { +margin=0; +ranksep=.1; + +//N1 [label="A: v.store(1)", shape=none, group="a"]; +N1 [style=invis, shape=none]; +N2 [label="B: v.rmw()", shape=none]; +N3 [label="C: v.store(2)", shape=none]; + +N1 -> N2 [color=invis]; +N1 -> N3 [color=invis, weight=100]; +N2 -> N3 [label="mo", color="#00aa00", style=dashed, penwidth=3]; +} diff --git a/writeup/figures/rmw_mo.dot b/writeup/figures/rmw_mo.dot new file mode 100644 index 0000000..7a41997 --- /dev/null +++ b/writeup/figures/rmw_mo.dot @@ -0,0 +1,9 @@ +digraph rmw_mo { +margin=0 + +N1 [label="A: v.store(1)", shape=none]; +N2 [label="B: v.rmw()", shape=none]; + +N1 -> N2 [label="rf", color=red]; +N1 -> N2 [color=invis, constraint=false]; +} diff --git a/writeup/figures/rmw_mo2.dot b/writeup/figures/rmw_mo2.dot new file mode 100644 index 0000000..0d4ce57 --- /dev/null +++ b/writeup/figures/rmw_mo2.dot @@ -0,0 +1,8 @@ +digraph rmw_mo2 { +margin=0 + +N1 [label="A: v.store(1)", shape=none]; +N2 [label="B: v.rmw()", shape=none]; + +N1 -> N2 [label="mo", color="#00aa00", style=dashed, penwidth=3]; +} diff --git a/writeup/figures/rr_mo.dot b/writeup/figures/rr_mo.dot new file mode 100644 index 0000000..179991e --- /dev/null +++ b/writeup/figures/rr_mo.dot @@ -0,0 +1,13 @@ +digraph rr_mo { +margin=0 + +N1 [label="X: v.store(1)", shape=none]; +N2 [label="Y: v.store(2)", shape=none]; +N3 [label="A: v.load()", shape=none]; +N4 [label="B: v.load()", shape=none]; + +N3 -> N4 [label="hb", color=blue]; +N1 -> N3 [label="rf", color=red, constraint=false]; +N2 -> N4 [label="rf", color=red, constraint=false]; +N1 -> N2 [color=invis]; +} diff --git a/writeup/figures/rr_mo2.dot b/writeup/figures/rr_mo2.dot new file mode 100644 index 0000000..fa0a6f7 --- /dev/null +++ b/writeup/figures/rr_mo2.dot @@ -0,0 +1,8 @@ +digraph rr_mo { +margin=0 + +N1 [label="X: v.store(1)", shape=none]; +N2 [label="Y: v.store(2)", shape=none]; + +N1 -> N2 [label="mo", color="#00aa00", style=dashed, penwidth=3]; +} diff --git a/writeup/figures/rw_mo.dot b/writeup/figures/rw_mo.dot new file mode 100644 index 0000000..a8e99fe --- /dev/null +++ b/writeup/figures/rw_mo.dot @@ -0,0 +1,11 @@ +digraph rw_mo { +margin=0; +ranksep=.3; + +N1 [label="X: v.store(1)", shape=none]; +N2 [label="A: v.load()", shape=none]; +N3 [label="B: v.store(2)", shape=none]; + +N2 -> N3 [label="hb", color=blue]; +N1 -> N2 [label="rf", color=red, constraint=false]; +} diff --git a/writeup/figures/rw_mo2.dot b/writeup/figures/rw_mo2.dot new file mode 100644 index 0000000..e7f611a --- /dev/null +++ b/writeup/figures/rw_mo2.dot @@ -0,0 +1,12 @@ +digraph rw_mo2 { +margin=0; +ranksep=.3; + +N1 [label="X: v.store(1)", shape=none]; +N2 [label="A: v.load()", shape=none, fontcolor=invis]; +N3 [label="B: v.store(2)", shape=none]; + +N2 -> N3 [color=invis]; +N1 -> N2 [color=invis, constraint=false]; +N1 -> N3 [label="mo", color="#00aa00", style=dashed, penwidth=3, constraint=false]; +} diff --git a/writeup/figures/sc_mo.dot b/writeup/figures/sc_mo.dot new file mode 100644 index 0000000..5d5f6b1 --- /dev/null +++ b/writeup/figures/sc_mo.dot @@ -0,0 +1,9 @@ +digraph sc_mo { +margin=0 + +N1 [label="A: v.store(1)", shape=none]; +N2 [label="B: v.store(2)", shape=none]; + +N1 -> N2 [label="sc", color=purple]; +N1 -> N2 [color=invis, constraint=false]; +} diff --git a/writeup/figures/sc_mo2.dot b/writeup/figures/sc_mo2.dot new file mode 100644 index 0000000..a7d37c3 --- /dev/null +++ b/writeup/figures/sc_mo2.dot @@ -0,0 +1,8 @@ +digraph sc_mo2 { +margin=0 + +N1 [label="A: v.store(1)", shape=none]; +N2 [label="B: v.store(2)", shape=none]; + +N1 -> N2 [label="mo", color="#00aa00", style=dashed, penwidth=3]; +} diff --git a/writeup/figures/sc_wr_mo.dot b/writeup/figures/sc_wr_mo.dot new file mode 100644 index 0000000..49a5f03 --- /dev/null +++ b/writeup/figures/sc_wr_mo.dot @@ -0,0 +1,13 @@ +digraph sc_wr_mo { +margin=0; +ranksep=.3; + +N1 [label="X: v.store(2)", shape=none]; +N2 [label="A: v.store(1, seq_cst)", shape=none]; +N3 [label="B: v.load(seq_cst)", shape=none]; + +N2 -> N3 [label="sc", color=purple]; +N1 -> N3 [label="rf", color=red]; +N2 -> N1 [color=invis, constraint=false]; +{rank=same; N1 N3} +} diff --git a/writeup/figures/sc_wr_mo2.dot b/writeup/figures/sc_wr_mo2.dot new file mode 100644 index 0000000..7efd810 --- /dev/null +++ b/writeup/figures/sc_wr_mo2.dot @@ -0,0 +1,13 @@ +digraph sc_wr_mo2 { +margin=0; +ranksep=.3; + +N1 [label="X: v.store(2)", shape=none]; +N2 [label="A: v.store(1, seq_cst)", shape=none]; +N3 [label="B: v.load(seq_cst)", shape=none, fontcolor=invis]; + +N2 -> N3 [color=invis]; +N1 -> N3 [color=invis]; +N2 -> N1 [label="mo", color="#00aa00", style=dashed, penwidth=3, constraint=false]; +{rank=same; N1 N3} +} diff --git a/writeup/figures/specdesign.pdf b/writeup/figures/specdesign.pdf new file mode 100644 index 0000000000000000000000000000000000000000..203ab8dea911690f3239eb2e1ab0fd45732b53df GIT binary patch literal 22332 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 N3 [label="mo", color="#00aa00", style=dashed, penwidth=3]; +N1 -> N2 [label="sc", color=purple]; +N2 -> N4 [label="sb", color=blue, weight=100]; +N3 -> N4 [label="rf", color=red]; +N1 -> N3 [style=invis]; +{rank=same; N3 N4} +} diff --git a/writeup/figures/wf_sc_rf2.dot b/writeup/figures/wf_sc_rf2.dot new file mode 100644 index 0000000..1cdc907 --- /dev/null +++ b/writeup/figures/wf_sc_rf2.dot @@ -0,0 +1,16 @@ +digraph wf_sc_rf2 { +margin=0 +ranksep=.3; + +N1 [label="A: v.store(1, seq-cst)", shape=none]; +//N2 [label="X: fence(seq-cst)", shape=none]; +N3 [label="B: v.store(2)", shape=none]; +//N4 [label="Y: v.load()", shape=none]; + +N1 -> N3 [label="mo", color="#00aa00", style=dashed, penwidth=3]; +//N1 -> N2 [label="sc", color=purple]; +//N2 -> N4 [label="sb", color=blue]; +//N3 -> N4 [label="rf", color=red, constraint=false]; +//N1 -> N3 [style=invis]; +//{rank=same; N1 N2} +} diff --git a/writeup/figures/workflow.pdf b/writeup/figures/workflow.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1c852cf1936dec07c38a467668ee15ca36e61e15 GIT binary patch literal 16034 zcmaib1yEc|(`bSO*Wm6D+!l9tC%8j!7I$}tKya7ff#B}$Zo%E%CGeIj|99{Iy;tv4 z&7L{k)7>*|Gqp8Mt{@^t$3)KxOWvK|-O^pxodwHG#7G1*w1DN|VURJgF?BQ}VgW&v z7{tu298K&Q#Hd7?%{1~!UqCO=c5AKv~ZU9AcTlD2a1V7U5Q{-+w46>Hw z-SF6O<`Xq&MJNfp_KU2AO0((ei?KdyeFq6;DO^h&W_Z0O>`~@MCFH!QK_(-PA)!v= z*jn}?@jRR^ao5B5foI#QJHTz7B`F)_VSB1CZeKqYfe(hnyGDL1n%&kN3}3#FePjuC zhC;-P$Yh6vf?n+K1J|bJ_zC=8;SUbAB2WgY0wzE#qVcgK0DJYF+N&9>TFy|et7>I% zfj7fPbIVhOxDMVzav6N8;Y^sHc>CGnsi6eh70sU{!^zrR%-_phQ<)P}Q58cke_Vo< zcWfEtGRSezB#Kv`ubCSl-=w_}x_Xi*+-QEkiSQ!f!uegauR5NSvDh2~kEbK=y=NVC zG)*yKTpyv;T?v}QN7Ry!asc+6(JH_kAA6+&0}Q@xhjDz|aB5PcCFHPZd}yw}LV`9L z4O^4QA`VOGsKZTBmji+*WW;#iT%9Jb{BGq&M0o(`jW|c1%562?+}#Gdt+_+M?h0c8&N2 zNG?)50D9r514Z8oq_CZ!&>}s+VetedlnLC<568cisvtxGj@IWf`f;Nhe$t9(A{Kp2 zEVhH6uPAR&VPBT&Dub0&)JFxoy?z)n6ayv)hgoRdLlkTV*(Np4e1MERAkk9mxBebV zsS1Gya}>AH$~v{&^jVjou$(rUZAlbTL`gC~|46ccx_?PM^UJqHev5v+xSe^yX7y;5 zQBfD=(YvY%W?9ZwIFV2%C`&mwIFpr$I)}ikmPJL_54<#R3fo;1$ZzD?ilk?Z{9hgj$6+25Q6Mc8xDWEN2-k zNNrElu#sTuDjA`M&AIXK;#4V{0a2)2N6fN1$LQo!&38Aw1K-8_yhEJ_Dy^P~2R~)f z)e7NFx&yhHoMLdZ${WlSBMQm@vlUe-n!EtcvFb$t{KDir80^e|U3fMyc?<~JlxRs< zhq8kYI#%WoV)|M)*dJ(3xcZDdmb{c)y8;lHA>`KUDLQ%B!1zg*gX~10sgf0oTN@7J zAd-p~3h!cZIuCw)`Y^h0t~b;q=WdP5b_qa6D?F*vw%wNLGtIZPhvdFx*P)0lWTO4# z$KvpqJEcQ(NWNm03WGjvv+==I^W2~lzUfKF#Rx^gDNvs{`=1IHdwZl?enoX44?G;PDv(w&NDaAZ`9bzr#{jzwD z^P=v4FbGhHI%2i}`uwKGAspveUD*elySSUT=JZ0ym{wx?n9goU3E#*E-Rk@EWaZynbTtEiMLp4X1RclvZO?Z6B8}#`-JRXOTko@?I+&-?v&_ z&VC;`H?{LQ9nKUh7nY3Wm9Q+dHwK8r8+3(E)#cQlMfiBVvIq?<1^Rxs9?tfxysT6S zq=e3~%ka{{t!mkOk$`@JBi5|6{H?I(!(aCm#jt~-I`A}l?$-IWjx%rs6Pc+37iEd! zY|gL|V%U5I_XF@X;^Bd^a@l_ebMCILR?hqLBQY`LqOxaa zp8oh!jG-GQF_(+pS;zYOI9}0E)Xf{O-}qivpI`IQhD{aQ^hglTW7=a0&0JHM1!v5h z9;t+DnEJ?4=ss&%X?qG8DqX^RgbOrv@K^x8AdLAcom$a zAYx@qL#&*2IaRy2J@i_ywBMyiIf%QB#c3}*OJI-5r`Pb_CHOg%r$Q)XAYiTI7I3Kz z@k<^t?&*bMMbjSX(hc^h{nkS87}*WYgHQH_08@(EwQ}C+>o14xLcMX=7X)vq+pnfy z?Fl)9#)TU$>!!yC_?jZE^4kr$2Um<4qAwV)V-@p(#PXfgRXCL!^A=Nr?m$B>p}v7> zW8BlOQU<%d86VWGop$lTJCZE${1B_A^4{umwU=Hzswe4fbo6?MCM8^b%Y)Kyx(^r_ z1Qa^==0PzEV^E7=O7y84RHw<|!H-S9c7`qdrITpeY9A9z1irWDdQNshN@)~VZuxISPrTXB@@}{;(5e;kjGi_9I)CkfkfktdSrs4{3(tGsc1!t4oBK%I#~zX_YjB zStEor6TUBZi&EYV_nSt=@YrgSSZXd$o|NCtEgcG%p)W=M4FCG|N$87>XNKlq@;9~g#AF51^lsbZ5FuMl=Lb>AbI@Y(^uJSVCt?oqu`im9 zUnPbmjt+`90Q4I6QFt-Y1P7%82=V&7bzHnRtxxg7FHkr_O496Tq92a*KI2!-m6ae( zI<_ybgkyOoHKs!j$~kni%ANyNKdL~KfIA&JUiz*1XcAlgM8+vEMoKcNqIiH%>OTE4h8?OI%6V2*vcxqSQ@8>>5eS|WhIwuXbF8*pS!mj#=I7XHAqcz{!x zydxwZAVrg>qI$w>FEJuet6zGAyDqgMD@Im}eC2k3B*g3-Yfv{3L~q>vpwd9CNpeQF z0y7|x$xDM~8&cR-$Cv+&G`mJ@w`kL~97?OEZXNCBTj@0BWy7No+k98))nISQzJ_iE zTNo?cB1Vvev{t_AfU@G4M=Yt7DiZsp;r`CH(7vADE7_i2q>Bi|yn5{|7uuJ#Q+f@e-n@E19K7rEMgWE~YPz1C$_ooRJFWE3*( z&PA95boNTSS;~;b^*FeLDJOeg*)IqZRK!BJr0bgM{^PN1Iw6EG=;ekFN;>K!^TNz2 z1!7D>EIZ-Rm(chOYaJ@v!{&b7XBk3Hqi~SC$6QdK~ z*`X~KQI!uvwC(P=tA&(y&eDZ^)8{3`Rf{Rv31wEv5Z^7i4W4ou5(1!5ewN25dv zxx5)dP%YUh?d_1ARh^!_3>{N#^$cWj5ye9N)-l?gMd5$pQsC8VSb!yR* z2B{eES&@)jZG1T45A#CN3|seAjJn+yn%daNP}Qc^xL>KYedLlyGswwz?#(cd7{TV^ z(zgV7$SG_5PlZqwkeU9dk{-sSMzWZ9kF)8qX%2p5P~&&2ph+w!iq^wM9Zqh>X=u=x$TUn2 zhg*wRhgZ!gefcvEUh2~Ia&bG%nE2s(rXdc)2yq`LDSXthVnD37o5V{Ef*e)D zN*iwF1-I8rlP9*s-`NKP6;|Kxo*e^ET6mgHmr7TvH4$&BZikWh?@u#>ILdjkT%Hxx zg{B6B=Oqqj0^2+k5f~%aB-&dD;f?v zf^|H#?uzA~(^b{2u9j1QSx!scCu%$vw*CDDb{h-f2S|F|GDe#w8N@_ceN1x1v6{z} zJ;__I16OKDUbEmVya<`C1O*ozESYM&gzkJ7&>p-$d%+P1CR{gpypg8eZCilYf<}=n zV=Uf=&*?FD(uB`5cVEw3_->n!5FgjQ39s*iJslH}N<7zZ(VzD9yw0HrJ+}k0p4Ou* zMSRIvyn^^rkHK4!yly6MOsMjd9a#+-KfaM?kbBbhJ!ca7FR!NuBk8&g)KBDkhsHT}`{X{g4^2~F0RZLpF>e5;K zxkxP}wI7eLMk+l8r2}b|^Rvs^E1tqPj=fP)-Q2y^kJPvR-zOY$kl9gjA-J+0x$(NyZGm&8qf2FB?(S6LnXFsCdiZZlW@q2Xd}8Fa8*>q6Il zNt7CbuABwyylliomHNy1hwL+#V|F!UUj8?th%M)HFxOOi)<#v_fs=l~ zZ@)lrF<~lBMett-8{$^E`mdWYX>wM2?_RySU`LcqzNxqbj;8cuXT*Cyk zCZG$X&c4chR#agigB9-56`U~Js?n-xuJxa-FpgIo7KN+bMjB2)L@;~2?7u7~B`ml! z;PD~JqUh5M?ff_+Nyf_~(sn#F8TwjT*2;W!JQ~+p!$F6XUY; z(=*xm{nw4^=a$0y)+?m*iQB?UDqjm>z3j+Inpft$n(w*x!m46@bVtu{T4?>!D^dCZ z5L^{@vfq~Ce}tTQn~%bOYq(K7Xnc^In0LviVJ|#NS%N~Wu-kL=R=cV6m~41dpj_@p zq!KF-m8O;uD(`Rv%j!K|2=pb|zgBinp6GVt4ZPlRcUMR9dNkm5+V|Vvh||p3+uohI z?oi?-(q)CIH0DI++bRl|J+*8ejO6ZYZ5s3-2FjHK)^LYy?>*!*c|Hv>w4C<_DqQbq z8KeQl-%IyoeKo$s@9oGfQ(P?)RrF^HPy1clv@Z}R>5uhE5v*N;O1-H2w34BgeaU4( z{3PT=GrkqR)99Av_Ubmm+1idph*i7)cqshVS7$ICJ@%yW7K59+0F|j1kz!luN2i%% zL8nL*%tYchw})?FYXdfS6wBwHE~L>wAj8^ZY1+HHQku0i{`zm1I(TW|o|nh#Q9+sU zF?={`%NnF=WGSXvRV~ilPscMm)Xs;Q*1h<%Hc?*~K5l(UG_G3>xT-|G(+4~4#NO|n z|HK(pUQ7Qgxr!}lt`afQwdDG7TdLO}go%5BC1hIidpG>9_G~H3Y=V~E(t#rhOhI9U zJ)<0I0Mmv}|7c9(1h`Eb#TCga_jtf?70kSe>*8n{Az}CZFO`t5{+Fh~P`Qw4r6v3g z51l=fqitgWM+{zWN977nnaZu1XDNNBX)B+#$U0t&a8IbU@soKyR1=_-hz=(2T+rtU z-GN$N16T43z{N_jjA@(5*5Dp+viO!FTKw=uTw!+HGr-iz!Cm2WEw-)rFK}~5Yn-x- z_fDE-#AMtSEPP zy!sp%qZz6y&95eH^VjYxVq6ry>wby?(nMxhodOva#jfs$adBk5kVCzil{&_`9b~jH zGI^7oM3M@0aq~yFu4&6W{t^9l?x|$y&jp-~tDc1#Bl7*eoVRxSsn5i;-XA^_ph_#p z5syfjCpyU=v)))Wahfyp4Ni~ ze|fd63Dvw-z|I=;xd|8Jjw~h!dl z?t_te(v+EIDs3-BFNScIA0lptKC+$OB_x$jsHX-joL#4ZZ4|low^KNFD<$oaY2i{fI{nLT%h&6gj^8crHKXKF7E61*)=o5jOS~EmZ`@aIe1Ljn#ey-s}YWzoZ0zhfkf0@%{5wVoB zIoILhMc8EpI85)DVpE){nrxl~A4Wgk_4xBg8>Z6}R1WlyxmYDTU%@z*C5>(4FedL_ zBP_rK%Lgm~9-9nyGO+{J^WHRlfnprR_nlk|2pvr-t4^VmB<2GZifhqJRMK&2#*&EY zKCzF}j;Ncv8sBjAWD6B_XY0EV4wQScn(lRX2GP;HlnF@CbTruTSttF58CKK7BAq6D z!ncVXk$#y%eNwH;UszVh!99v}zVCk+N|K;YAxa7@A`R1+8!+AwxvAQsUON%9$)s#3yOF>GbB}|ax`2M$FJ~ELa+G z&?TNW#T^;YWl76#faWQWFf@auKk3ncU$wIWxf+HKk>-HA?90GdYjItM&~W$be%b-fpo zIg2buurCi|IuG@)+mx$S`JB!fo%g1XtGroW&f^J9J=AQx6cH3m44nu5Vy(; zvKxXcAGx^l1DXL(td0>M2*~7-xkU86L4PxHk;2x&=%f3Rcbxo$B7nROzB4DBWR9YT zt?|#EmoD+4#<Rxr!$i$!4J{e|yZLs!F+YsY=$1>IIi zpM2yaIJ5$3y<9~W4$|>vBv+JHBz%eq)*kjJX7@mFyobmO)%;zdeg2J=Zj4p)AC)Tu zl>ih%llyMNEs6I+EUs!sw&Mz*P4ABVEaTQK<|w(TC?{hH&cdRP6mg?LSu5I=ksSJoWEW}k{l zGXE5!m6K>JG(&KDTKQQjx~*PcywmJGjXJAUX{4(1<^s0g!a|i46nJ8@nI{Tw6*NZi z9uTXB+p=mC*7Ew13|Ni8Q>TbqyC~C1_NgD2>}!5pnqDT)1)e6t$8s?kp7xQeqKm|| z^Q|8E%&>2rju^$GDj70XJy<>VxPGTl8AcS3(u8J4>Sc6@na`)nfIFV%OMX+dAGDcT zTB$h?-YSCgIZ?n@lIDePsPRoy-CCf-1M6-05?k}<Tf%N2xKBQSH&W%7m6nR+Zh8|z9>y~Whd=MV2k+@e%(=(H=E?^A@y zDAx-2J$B(obA;(_&+!-panTnt?1_Rtle3deQ|Aa~H*dV_Yip^3r(yEuAqhz5Pp8xT z-9w^bPnSgNKZZIKQssFsm6}OVBaMNIPvh>-TBZm{UoS1r>i>xKSuRVmq1&>sORKG4^Oyi@i!$m7FBY} z70+ckbj3vMsuRu9U@2WegTdb(D#PqnqT;jUUc^Rcxw9I*&Ijux$`Oqr2)|q4t(K0M z@N9E%<2z}S_(#iR`4D}oxH z9}BWV!z`OV9{IRQd)SB^B3-;td3&9Nr1ya2de*G(RqEoo_@ZZ(^^8Py=w)OKu%kTiZ`( z7`^9N!k=&qqe~iV8ghdH-DnR{=Edn!uSz%Klf}}!#+`zxfyQe*U9T2<&3&~+-|BJu zo=11YRy$#QyW!I%;BKyAXpSFE`=^8S{12Ok`i+hcYX?bFd+hWQ)k&-jW$KEtD5j1L z5f*a~OX9%c%tkA!{p$~VqqYe%u0s~P-!){^HI^#MPeSfjAj_>O+nXmYEYW`u>z~tf znsMOqqRZy#boT&GxsFn8VYcWQ8}+fSo(`HLuwh;eK^sNsno7?rC;;gRB6d!+A_E9aC@OLV%86 zWNL#2yS>4;V&a35;0bYGj3>5nd@ma$ z4g|T)CYXKhXHMgY_8~$lMhhkUl{-bTDQ8U8WDanN`fT2hU8nT(8_Ns3c-3m}pE zU2Ry`1F4R|2kmoA?mPFIh0f5`{GK&%h*jdLNWjEOyI?T~dzMj_-Z1!q2PIyC;uk+d!KlDw*aQrW@?z&;TNHc;Ax9uo(ld%-VO79cH_* z7G3)IR4g&$)U1jSPkLq2q3fl7L?H$%Pb>Qy?t#neZOotX>B3LV+W-<7*>vV)aK)Hd zaLqP?O-ATRMDZ9=WpXYo{O~VElj62d=OxLJDSl><%Bf~2)!VUtuH~Na1c1_uri$~? zSOQ#U$Jn!>kPP>6CPCN6a3KIg{U1G9aWL&1`>)R27KvS## z9o~xUbA0(=|4p`^JZqMvSzIz5Mwkpk*I7?{xC$vwlo0A5g=pXb%yaZJ`c7O;6`R_y zF`ZehT_tVC4oiW-Im}bKqO%MKsRA(;W_Vts9i5$#-IiU_rieV=JL@`)A6Uz{q7>(j zC5M){HaTW&u+sno zjXmbsOpG+s{EvpeOlzjy$P8a?!fkXv%N~XaWV%;-os1g0mt{aMFHBm?*RJ?@QT8-@E4K&d^G4&KT#= zb86dp?s;frdF+3d%X7qZc6>>o z`Bs~6m)_Ib)8c9l}mdUrtJfmxuote96O z1d?;aZY^irq;9jO?PYvb`?T4D zz6I=VOEf2SgcyCBl>Ddl*Z|(pnUuNsrx{Tfk?FqNT2a=3Q6tuFFqVw$82L!T@HJcp zvtzqky4w|J!Lth*x8g>opQO8<@KMEhbN92y`4rw_0%+3IvXaONWNOq2*DF#)3HCec zCPhlnnH7N-QtFy8-3j8<#l=&~lH;FsH<9UuV>LKgP=BW|xW zq>8~Yb020;xk;{@;(MAA>oT(VGBq2G1VqV$Z21rqxzJvT5t!ORI zDU!aFLL>V$Ic3I(Y&Zs>*~Pd@ehAet`n=8b5ITaYL5kFd?q?1e#^!;V_R-^`_{X3g zk+=y@0KvL<)u(4TYR7miR5W+w?|nnd^np>r)sKj4m-_2GC!DiC;TLLq)Lh?nPnWP< ze_hgRwlw&1vQnyl%usCsYbSy;kgQ26rQ+pfgQ$aNlhTo$Q^4%&0metK5eVJ_;%VKF9|X}Oz0=+w z8ERqwO2-;BLxf(IO(c0IQc*|&!}4;1icY3=uSh>D)tvu(Ds2iX?lc`@e#o#2!XJVw zOmWO`NI*?7RTd%9IO4IWuB>Vq$Z7o0xRWl*ZsNyIN2tD!0(V?>Tt9&U_f5-!PNmLQ zzfxmAhO!*R7NTN1FxA{w%_7c?Jbf$QHq^miH61DNBF6Lk{5hs@Q`%G7eF@L>3arjN zTt~5^Pia3R-|~+sj8k=%S9cUv6O8*{K49#@t`ts zK7LX(9mUO|pHC8$ z^y*b=@qmEO=D0PE?A#sqD;>4UoiYQo*qJQd+mvx+J5otxf|Nm0*<}!qQhicIc@PCs z`Ypz}fn&+&G6|b91;#5a+4t>s)ccu;mJf~kuurL3Jl;1U(i*Z*PapJ#P#)~E-5>5z z86CmGhN_~g+5%)XfMjSDjo*z=rtrKu)K@;I3nW&P_o^hb8{~d>gmP)vcKkgG0M!13VF!fy?7z}B@C|d9F7tH0kv1hqG=8}G@Lp7 zvF|(xYZ`SCx@i}mBs5po>_Y*NBJm(AR3C3GA2IcnK!{gruh3^q-E{k^jPdD`FVW=z z^BBc$Z!4ZWMz)WSZ>1jU2}9B^u2-Ifsy>Wavlm0gJ4U}J=i>qZ#`gKEoN7R5isF4N z3O9$a56S5>GpGG{2;miBX6Dgr$QR|otT58&S1DlO?~A6_fK=^byD;F#mvI@#$1FeS z$wWDN;)rt8PTAMRt%9sL`-}cGNgnar^*h)XKf?IdWSw6qx?yV&=1nNx>D^s$ z`S>5_g=p8L-EecKTKov1x-MD}yq$?-P^|9C8vI!e9*E0uJL~YD18NE{uDIr4?%fh8 zyIMw`=Fs9kuOixMj*0&uTyG+;9>~kiDb&E=CPp?$JNFnlK1E$a-pBtgM8&YLMSUv*7=k)03eeysu7 z{Zn`5CJ-Ouy3`>G$bvaZ8A%;dD8b+)rZN0P<2szh^bt}z5ykZB9zJ@IgB?jE+OmQj z4Z?3^k^J;SgT^GWWo?v|iRlny{v-!t$+=otR1Yj_FD&&?;G^E#*&Rzta;h2jo9ooD zpY5x|bL)J(snX;nx^sbdyapbajeiCH&{VIq611M3BDWv+U8Y95t*>*jGCR?uymMY% zc$v!t;Q#&+z}t$uv-1NND$&W&T6gVNyMFc$BO?#-b{?&^u=Rq?@aUKKh~tBU89qM_ zDY{;Rps8Hc#yj-I`AIz3hMYKu9k%t4^!xh+8=Z`rwLNM#rpCrH>k!cw=O+0V!h2c+ zR;YGQFfsvDI#~Fhi&&`lOG~qW~U9_mJ{jevFHYrJ2zB)-L1>{ z1(KC+bzPpd0>QE9FGM%qXd_ZK>yyK?{e=$kCXEDFOBZ>qdY+kP4I69AqkUYFDBH{S zUe3L=KpmgjuhgG#>UF2YgC+P6h;{OD*)t;w29oNJNYWJf#(?h)e<4>Zp5zf8d?{7( z`WON%*U6cK*X|t`3~T6XE1zX|cy6B-QeV@dP7+LTNv;y#(Fs8tRxQc?6=$ihaAKV& zrTPTmrSB!+uH>Dc2Mn<#+z};qr+c8BM(^9x9X9GEWb0V7^VYpTeke`dvn(f6(>asn z+MKdhe9|u4gqn5gIcl0!A`G@CcwQ=b*&!N@N?#)JbWkw^S9(!fLfDMnSH4-u8MDQl z3O3~y-)VfWrkc^zSGX5)M8XrJ$KRiE$Ugt<`^ylS++20f!u3&;qkk1z zPp+DenGlz>wJukt1&~#Lz`5d?5nW$$S+k+sS9xuS51cNz+*bxHdE?)`DyKNS45#Y6 z0(f<%Ke=<<020C;w&q)+j}i!d6JMpIya+xBx(X}G{-D0%rtj4LMHz9L0lz)}Q20SZsOoivunTvKJlY5P3rE{) z0B!$_B{I*7i~BvRGLnP5*5z}wvPofL<{@wG*35=-znuA#93CeMSEmf6{xLdqD_DV= zfT?@q@lFIo^~QvHXt2;$PBrl^=V#|g0ym~>5`3SFt#~Oopz_@knQca-m$R>o96La`h77&2=2o(6YeAl6;uYql^!!1OSRXe7*kqR2+Ex|%HgGEGs!(YfYw8&0Yg3=r=@D$ypCKA;O69FOZ=@P2xF>wD z1`<5c?{{^C66^0TULiQ&S*rbCu1>$*iT>m2G!rX3%m3V+X8+IKX%#nH69zG$jiZQ( zgORivH!^FtSNyN#-sKX%XXkcY-Bxqx5WkSRV%OL1rWMbn;#K{PNWq6bI_Cd$Y z#01MAY+x&4Vs2^%LNb8{Dm$83eb^{viQX=IE5U-UZvTDzo8vz#_^V8e zm67BBQzWJnFAMY+Kn^~84(I(9;HQI86h^E#(<98Uv_$C3s2SH3i;nd2bjmHfln*sh zeLQk+e2J>|G`i|!^nCcVE0D+KRDR=l0&F98%6Hf!u~u0EY&mYO?J6ND;<+Q;9Z4j$ za^DP_ptT1zAMKx6)LA@{@`_wU00&)8%f1lK5~m~88{Fr@H7b%TYLq0(8H_3O^2}p~ zH(IsUKgftQBHM58glYN@CucslkKWXQ-%-?af;Ikx@ za-x!rqoo1I-Svc%3u4!&X#qFw!bpc>=m@e!^hVoFf%_8gt2V+0S&^cQP@W&W2MnBF zr*r7M;WikV3H$jz!Y3Ms?gfKS^BK<7;(~#oGoJrNP5y<)^s=I36WFNs%#z9Q!a0ue zikGSRtbB_8ipD*&3A}H;$8BNX1a9aT{5IkjdxpEmy^vR1H-Cjxf2MOb>ERD(M|lN% zV&Bv|m$|54NK3iZvtulPAR-w!m%mnVxZ>-H4j6M2p5hX3U+bDc+TYy64R0Pz{=Yaa z=YNd*Kkmt(>}2Tp=Bq09P9}dqg$x`_-aO?0>80lO4vxZR2KH~>Cu8tepOqPwLCxIQ z(ab@Mg$+Q&&J1!c02>hp3(Ftxw>~on#>~$C$M@U&?=gSCI6&hV8Q*ZQEN?WR{u}%c z+@J72=|DW*=-AlU{^a|Hd!q%lzsAG9;r_t?#p6vj``_~Z;`KMZ&Y#inpCBcAi(w^L z1{I*Hjrm(SB+*+){3}M782_V3F(#rnt^OO&^bb5pk)YW9V+ezSJ48ouZ zf+RQ)y%mTm{UZ}F{i9-380hr23{V~bnVyL0&&ts^)Bn}~*E0UDDgn*lPdY{h6>~=` z6CN>9F)>C)01G1{n=q(xf*LERflSTJ$jHdT#P>%6bJY5CZR#4Dpc#P{LEb)hBU>W3XO>6{>-ctFW(8X;2tcxeMBB{w4=0 z_zyIQl${-f2DzZIlaa~);Quzn-)um}U0T6v5 z`V$7)P1!*Pe|v~*{(^z}OrRM1H;kE)0~DzLf-wOYIY4&&7mSgai4hdP|AH~GyaoS% z!8rbV90v!;Q2(Z7WdZ!}xiGP^ar_rQR(7WU;>XI#^xxw++5bxhfQbX-r2m!+VE*UY z9PJH2+qeCj+bf&9n}AfxpacYhqVX?pl(hK*Bx3q=b7zngA<`n^5n^U%5fb7Qc>6rik&^d&hTvT2R_WuB4&ByNm literal 0 HcmV?d00001 diff --git a/writeup/figures/wr_mo.dot b/writeup/figures/wr_mo.dot new file mode 100644 index 0000000..d8267be --- /dev/null +++ b/writeup/figures/wr_mo.dot @@ -0,0 +1,13 @@ +digraph wr_mo { +margin=0; +ranksep=.3; + +N1 [label="X: v.store(2)", shape=none]; +N2 [label="A: v.store(1)", shape=none]; +N3 [label="B: v.load()", shape=none]; + +N2 -> N3 [label="hb", color=blue]; +N1 -> N3 [label="rf", color=red]; +N2 -> N1 [color=invis, constraint=false]; +{rank=same; N1 N3} +} diff --git a/writeup/figures/wr_mo2.dot b/writeup/figures/wr_mo2.dot new file mode 100644 index 0000000..182dea6 --- /dev/null +++ b/writeup/figures/wr_mo2.dot @@ -0,0 +1,13 @@ +digraph wr_mo2 { +margin=0; +ranksep=.3; + +N1 [label="X: v.store(2)", shape=none]; +N2 [label="A: v.store(1)", shape=none]; +N3 [label="B: v.load()", shape=none, fontcolor=invis]; + +N2 -> N3 [color=invis]; +N1 -> N3 [color=invis]; +N2 -> N1 [label="mo", color="#00aa00", style=dashed, penwidth=3, constraint=false]; +{rank=same; N1 N3} +} diff --git a/writeup/figures/ww_mo.dot b/writeup/figures/ww_mo.dot new file mode 100644 index 0000000..2e00cd9 --- /dev/null +++ b/writeup/figures/ww_mo.dot @@ -0,0 +1,9 @@ +digraph ww_mo { +margin=0 + +N1 [label="A: v.store(1)", shape=none]; +N2 [label="B: v.store(2)", shape=none]; + +N1 -> N2 [label="hb", color=blue]; +N1 -> N2 [color=invis, constraint=false]; +} diff --git a/writeup/figures/ww_mo2.dot b/writeup/figures/ww_mo2.dot new file mode 100644 index 0000000..149c113 --- /dev/null +++ b/writeup/figures/ww_mo2.dot @@ -0,0 +1,8 @@ +digraph ww_mo2 { +margin=0 + +N1 [label="A: v.store(1)", shape=none]; +N2 [label="B: v.store(2)", shape=none]; + +N1 -> N2 [label="mo", color="#00aa00", style=dashed, penwidth=3]; +} diff --git a/writeup/figures/ww_sc_fence_first_collapse.dot b/writeup/figures/ww_sc_fence_first_collapse.dot new file mode 100644 index 0000000..c85988c --- /dev/null +++ b/writeup/figures/ww_sc_fence_first_collapse.dot @@ -0,0 +1,17 @@ +digraph ww_sc_fence_first_collapse { +margin=0 +ranksep=.3; + +N1 [label="A: v.store(1, seq-cst)", shape=none]; +//N2 [label="X: fence(seq-cst)", shape=none]; +N3 [label="Y: fence(seq-cst)", shape=none]; +N4 [label="B: v.store(2)", shape=none]; +N5 [style=invis, shape=point]; + +//N1 -> N4 [label="mo", color="#00aa00", style=dashed, penwidth=3]; +N1 -> N3 [label="sc", color=purple]; +N3 -> N4 [label="sb", color=blue, weight=100]; +N1 -> N5 [style=invis]; +N5 -> N4 [style=invis]; +{rank=same; N4 N5} +} diff --git a/writeup/figures/ww_sc_fence_first_collapse2.dot b/writeup/figures/ww_sc_fence_first_collapse2.dot new file mode 100644 index 0000000..17d14a0 --- /dev/null +++ b/writeup/figures/ww_sc_fence_first_collapse2.dot @@ -0,0 +1,14 @@ +digraph ww_sc_fence_first_collapse2 { +margin=0 +//ranksep=.3; + +N1 [label="A: v.store(1, seq-cst)", shape=none]; +N2 [style=invis, shape=point]; +N3 [style=invis, shape=point]; +N4 [label="B: v.store(2)", shape=none]; + +N1 -> N4 [label="mo", color="#00aa00", style=dashed, penwidth=3, constraint=false]; +N1 -> N2 [color=invis, weight=100]; +N3 -> N4 [color=invis, weight=100]; +{rank=same; N2 N3} +} diff --git a/writeup/figures/ww_sc_fence_mo.dot b/writeup/figures/ww_sc_fence_mo.dot new file mode 100644 index 0000000..3edead9 --- /dev/null +++ b/writeup/figures/ww_sc_fence_mo.dot @@ -0,0 +1,18 @@ +digraph ww_sc_fence_mo { +margin=0 +ranksep=.3; + +N1 [label="A: v.store(1)", shape=none]; +N2 [label="X: fence(seq-cst)", shape=none]; +N3 [label="Y: fence(seq-cst)", shape=none]; +N4 [label="B: v.store(2)", shape=none]; +N5 [style=invis, shape=point]; + +//N1 -> N4 [label="mo", color="#00aa00", style=dashed, penwidth=3]; +N2 -> N3 [label="sc", color=purple]; +N1 -> N2 [label="sb", color=blue, weight=100]; +N3 -> N4 [label="sb", color=blue, weight=100]; +N2 -> N5 [style=invis]; +N5 -> N4 [style=invis]; +{rank=same; N4 N5} +} diff --git a/writeup/figures/ww_sc_fence_mo2.dot b/writeup/figures/ww_sc_fence_mo2.dot new file mode 100644 index 0000000..f1964fd --- /dev/null +++ b/writeup/figures/ww_sc_fence_mo2.dot @@ -0,0 +1,14 @@ +digraph ww_sc_fence_mo2 { +margin=0 +//ranksep=.3; + +N1 [label="A: v.store(1)", shape=none]; +N2 [style=invis, shape=point]; +N3 [style=invis, shape=point]; +N4 [label="B: v.store(2)", shape=none]; + +N1 -> N4 [label="mo", color="#00aa00", style=dashed, penwidth=3, constraint=false]; +N1 -> N2 [color=invis, weight=100]; +N3 -> N4 [color=invis, weight=100]; +{rank=same; N2 N3} +} diff --git a/writeup/figures/ww_sc_fence_second_collapse.dot b/writeup/figures/ww_sc_fence_second_collapse.dot new file mode 100644 index 0000000..6dde5c5 --- /dev/null +++ b/writeup/figures/ww_sc_fence_second_collapse.dot @@ -0,0 +1,17 @@ +digraph ww_sc_fence_second_collapse { +margin=0 +ranksep=.3; + +N1 [label="A: v.store(1)", shape=none]; +N2 [label="X: fence(seq-cst)", shape=none]; +//N3 [label="Y: fence(seq-cst)", shape=none]; +N4 [label="B: v.store(2, seq-cst)", shape=none]; +N5 [style=invis, shape=point]; + +//N1 -> N4 [label="mo", color="#00aa00", style=dashed, penwidth=3]; +N2 -> N4 [label="sc", color=purple]; +N1 -> N2 [label="sb", color=blue, weight=100]; +N2 -> N5 [style=invis]; +N5 -> N4 [style=invis]; +{rank=same; N4 N5} +} diff --git a/writeup/figures/ww_sc_fence_second_collapse2.dot b/writeup/figures/ww_sc_fence_second_collapse2.dot new file mode 100644 index 0000000..e7c0b35 --- /dev/null +++ b/writeup/figures/ww_sc_fence_second_collapse2.dot @@ -0,0 +1,14 @@ +digraph ww_sc_fence_second_collapse2 { +margin=0 +//ranksep=.3; + +N1 [label="A: v.store(1)", shape=none]; +N2 [style=invis, shape=point]; +N3 [style=invis, shape=point]; +N4 [label="B: v.store(2, seq-cst)", shape=none]; + +N1 -> N4 [label="mo", color="#00aa00", style=dashed, penwidth=3, constraint=false]; +N1 -> N2 [color=invis, weight=100]; +N3 -> N4 [color=invis, weight=100]; +{rank=same; N2 N3} +} diff --git a/writeup/formalization.tex b/writeup/formalization.tex new file mode 100644 index 0000000..2c118aa --- /dev/null +++ b/writeup/formalization.tex @@ -0,0 +1,41 @@ +\mysection{Formalization of Correctness Model}\label{sec:formalization} + +Unlike the SC memory model, applying linearizability can be complicated under +C/C++ by the fact that the C/C++ memory model allows atomic loads to read from +atomic stores that appear later in the trace and that it is in general +impossible to produce a sequential history that preserves program order for the +C/C++ memory model. Intuitively however, we can weaken some constraints, e.g. +the \textit{happens-before} edges in some cases, to generate a reordering of +ordering points such that they yield a sequential history that is consistent +with the specification. We formalize our approach as follow. + +We represent an trace as a \textit{execution graph}, where each node represents +each API method call with a set of ordering points, and edges between nodes are +derived from the \textit{happens-before} edges and the \textit{modification +order} edges between ordering points. Given two operations $X$ and $Y$ that are +both ordering points, the \textit{modification order} edges are as follows: + +\squishcount +\item {\bf Reads-From:} $X \xrightarrow{rf} Y \Rightarrow X \xrightarrow{opo} Y$. + +\item {\bf Modification Order (write-write):} $X \xrightarrow{mo} Y \Rightarrow X \xrightarrow{opo} Y$. + +\item {\bf Modification Order (read-write):} $A \xrightarrow{mo} Y \ \wedge \ A \xrightarrow{rf} X \Rightarrow X \xrightarrow{opo} Y$. + +\item {\bf Modification Order (write-read):} $X \xrightarrow{mo} B \ \wedge \ B \xrightarrow{rf} Y \Rightarrow X \xrightarrow{opo} Y$. + +\item {\bf Modification Order (read-read):} $A \xrightarrow{mo} B \ \wedge \ A \xrightarrow{rf} X \ \wedge \ B \xrightarrow{rf} Y \Rightarrow X \xrightarrow{opo} Y$. +\countend + + + +\mypara{\bf Generating the Reordering:} +The \TOOL checker first builds an execution graph where the nodes are +method calls and the edges represent the +$\reltext{opo}$ ordering of the ordering points of the methods that +correspond to the source and destination nodes. Assuming the absence +of cycles in the execution graph, +the $\reltext{opo}$ ordering is used to generate the sequential history. +The \TOOL checker +topologically sorts the graph to generate the equivalent sequential +execution. diff --git a/writeup/implementation.tex b/writeup/implementation.tex new file mode 100644 index 0000000..bac8f73 --- /dev/null +++ b/writeup/implementation.tex @@ -0,0 +1,151 @@ +\mysection{Implementation}\label{sec:implementation} + +The goal of the \TOOL specification language is to +enable developers to write specifications against which concurrent data structures can be tested. +We can ensure a concurrent data structure is correct with +respect to an equivalent sequential data structure if for each +execution of the concurrent data structure, the equivalent sequential +history for the equivalent sequential data structure yields the same +results. + +The execution space for many concurrent data +structures is unbounded, meaning that in practice we cannot +verify correctness by checking individual executions. However, the +specifications can be used for unit testing. In practice, +many bugs can be exposed by model checking unit tests for +concurrent data structures. We have implemented the \TOOL checker as a +unit testing tool built upon the \cdschecker framework. \TOOL +can exhaustively explore all behaviors for unit tests and provide +developers with diagnostic reports for executions that violate their +specification. + + +\mysubsection{Model Checker Framework} + +The \TOOL checker takes as input a complete execution from the +\cdschecker model checker. The \cdschecker framework operates at the abstraction level of +individual atomic operations and thus has neither information about +method calls nor which atomic operations serve as ordering points. +Thus, we extend the framework by adding {\it annotation} operations to +\cdschecker's traces, which record the necessary information to check the specifications +but have no effect on other operations. The \TOOL compiler +inserts code to generate the annotation actions to communicate to the \TOOL checker +plugin the critical events for checking the \TOOL specification. +These annotation actions then appear in \cdschecker's list of atomic +operations and make it convenient for \TOOL to construct +a sequential history from the execution because for any given method +call, its invocation event, its ordering points, and its response event are +sequentially ordered in the list. + +\mysubsection{Specification Compiler} + +The specification compiler translates an annotated +C/C++ program into an instrumented C/C++ program that will generate +execution traces containing the dynamic information needed to construct the sequential history +and check the specification assertions. We next +describe the type of annotation actions that the \TOOL compiler +inserts into the instrumented program. + +\mypara{\bf Ordering Points:} Ordering points have a conditional guard expression +and a label. Potential ordering point annotation actions are +inserted immediately after the atomic operation that serves as +the potential ordering point. Ordering point check annotation actions are +inserted where they appear. + +\mypara{\bf Method Boundary:} To identify a method's boundaries, \TOOL +inserts {\it method\_begin} and {\it method\_end} annotations at the +beginning and end of methods. + +\mypara{\bf Sequential States and Methods:} Since checking occurs +after \cdschecker has completed an execution, the annotation +actions stores the values of any variables in the concurrent data +structure that the annotations reference. + +\mypara{\bf Side Effects and Assertions:} Side effects and assertions perform +their checks after an execution. The side effects and assertions are compiled +into methods and the equivalent sequential data structure's states are accessible to these methods. +With this encapsulation, +the \TOOL checker simply calls these functions to implement the side effects and assertions. + +\mypara{\bf Synchronization Checks:} The \TOOL checker performs +synchronization checks in two parts: compiling the rules and runtime data +collection. First, the \TOOL compiler numbers all methods and happens-before +checks uniquely. For example, the rule ``\code{Update->Read}'' can be represented as (1, 0, 2, 0), +which means instances of method 1 that satisfy condition 0 should {\it + synchronize with} instances method 2 that satisfy condition 0. In this case, + condition 0 means \code{true}. Then, +the \TOOL compiler generates code that communicates the +synchronization rules by passing an array of integer pairs. Runtime +collection is then implemented by performing the condition check at +each method invocation or response and then passing the method number +and happens before condition if the check is satisfied. + +\mysubsection{Dynamic Checking} + +At this point, we have an execution trace with the necessary +annotations to construct a sequential history and to check +the execution's correctness. However, before constructing the +sequential history, the \TOOL plugin first collects +the necessary information for each method call, which is the {\it + method\_begin} annotation, the ordering point annotations, the +happens-before checks, and the {\it method\_end} annotations. Since +all of the operations in the trace have thread +identifiers it is straightforward to extract the operations between the {\it + method\_begin} and {\it method\_end} annotations. + +\mypara{\bf Reorder Method Calls:} As discussed above, determining the +ordering of the ordering points is non-trivial under the C/C++ memory +model. This can be complicated by the fact that the C/C++ memory model +allows atomic loads to read from atomic stores that appear later in +the trace and that it is in general impossible to produce a sequential +history that preserves program order for the C/C++ memory model. + +However, we can still leverage the reads-from relation and the +modification-order relation to order the ordering points that appear +in typical data structures. \TOOL uses the following rules to +generate an ordering-point ordering $\reltext{opo}$ relation on +ordering points. Given two operations $X$ and $Y$ that are both +ordering points: + +\squishcount +\item {\bf Reads-From:} $X \xrightarrow{rf} Y \Rightarrow X \xrightarrow{opo} Y$. + +\item {\bf Modification Order (write-write):} $X \xrightarrow{mo} Y \Rightarrow X \xrightarrow{opo} Y$. + +\item {\bf Modification Order (read-write):} $A \xrightarrow{mo} Y \ \wedge \ A \xrightarrow{rf} X \Rightarrow X \xrightarrow{opo} Y$. + +\item {\bf Modification Order (write-read):} $X \xrightarrow{mo} B \ \wedge \ B \xrightarrow{rf} Y \Rightarrow X \xrightarrow{opo} Y$. + +\item {\bf Modification Order (read-read):} $A \xrightarrow{mo} B \ \wedge \ A \xrightarrow{rf} X \ \wedge \ B \xrightarrow{rf} Y \Rightarrow X \xrightarrow{opo} Y$. +\countend + +\mypara{\bf Generating the Reordering:} +The \TOOL checker first builds an execution graph where the nodes are +method calls and the edges represent the +$\reltext{opo}$ ordering of the ordering points of the methods that +correspond to the source and destination nodes. Assuming the absence +of cycles in the execution graph, +the $\reltext{opo}$ ordering is used to generate the sequential history. +The \TOOL checker +topologically sorts the graph to generate the equivalent sequential +execution. + +When \TOOL fails to order two ordering points, the operations often commute. Thus, +if multiple histories satisfy the constraints of \reltext{opo}, by default we generally randomly select one. However, when those operations +do not commute, we provide developers with different options: (1) they can +add additional ordering points to order the two nodes or +(2) they can run \TOOL in either of the following modes: (a) \textit{loosely +exhaustive} mode --- \TOOL explores +all possible histories and only requires that there exists some history that passes the checks or +(b) \textit{strictly exhaustive} mode --- \TOOL explores all possible histories and requires all histories pass the checks. + + +\mypara{\bf Synchronization Checks:} Synchronization properties are +specified using the IDs and conditions of method calls, and we have that information +available after \TOOL constructs the sequential history and checks the preconditions +and postconditions. For two specific method calls $c_1$ and $c_2$, we can ensure +$c_1$ synchronizes with $c_2$ by ensuring the annotation \code{c1\_begin} +happens-before the annotation \code{c2\_end} because any operations +sequenced-before \code{c1\_begin} should happen-before any operations +sequenced-after \code{c2\_end} according to the C/C++11 memory model. + diff --git a/writeup/introduction.tex b/writeup/introduction.tex new file mode 100644 index 0000000..e0c9c70 --- /dev/null +++ b/writeup/introduction.tex @@ -0,0 +1,226 @@ +\mysection{Introduction}\label{sec:introduction} + +Concurrent data structure design can improve scalability by supporting +multiple simultaneous operations, reducing memory coherence traffic, and reducing the time taken by an +individual data structure operation. Researchers have developed many concurrent +data structure designs with these goals~\cite{rcu, +lockfreequeue}. Concurrent data structures often use sophisticated techniques +including low-level atomic instructions (e.g., compare and +swap), careful reasoning about the order of loads and +stores, and fine-grained locking. For example, while the standard Java hash +table implementation can limit scalability to a handful of cores, +more sophisticated concurrent hash tables can scale to many hundreds of +cores~\cite{javaConcurrentHashMap}. + +The C/C++ standard committee extended the C and C++ languages with +support for low-level atomic operations in the C/C++11 +standard~\cite{cpp11spec, c11spec, boehmpldi} to enable developers to +write portable implementations of concurrent data structures. To support the relaxations typically performed by compilers and processors, +the +C/C++ memory model provides weaker semantics than sequential +consistency~\cite{scmemorymodel} and as a result, correctly using +these operations is challenging. Developers must not only +reason about potential interleavings, but also about how the processor +and compiler might reorder memory operations. Even experts make +subtle errors when reasoning about such memory models. + +Researchers have developed tools for exploring the behavior of code +under the C/C++ memory model including \cdschecker~\cite{cdschecker}, {\sc +Cppmem}~\cite{c11popl}, and Relacy~\cite{relacy}. These tools explore +behaviors that are allowed under the C/C++ memory model. While these +tools can certainly be useful for exploring executions, they can be +challenging to use for testing as they don't provide support (other +than assertions) for specifying the behavior of data structures. +Using assertions can be challenging as different interleavings or +reorderings legitimately produce different behaviors, and it can be +very difficult to code assertions to check the output of a test case for an +arbitrary (unknown) execution. + +This paper presents \TOOL, a specification language and specification +checking tool that is designed to be used in conjunction with model +checking tools. We have implemented it as a plugin for +the \cdschecker model checker. + +\mysubsection{Background on Specifying the Correctness of Concurrent Data Structures} + +Researchers have developed several techniques for specifying +correctness properties of concurrent data structures written for strong memory +models. While these techniques cannot handle the behaviors typically +exhibited by relaxed data structure implementations, they provide insight into +intuitive approaches to specifying concurrent data structure behavior. + +One approach for specifying the correctness of concurrent data +structures is in terms of equivalent sequential executions of either +the concurrent data structure or a simplified sequential version. The +problem then becomes how do we map a concurrent execution to an equivalent +sequential execution? A common criterion is {\it + linearizability} --- linearizability simply states that a concurrent +operation can be viewed as taking effect at some time between its +invocation and its return (or response)~\cite{linearizableref}. + +An {\it equivalent sequential data structure} is a sequential version +of a concurrent data structure that can be used to express correctness +properties by relating executions of the original concurrent data +structure with executions of the equivalent sequential data structure. +The equivalent sequential data structure is often simpler, and in +many cases one can simply use existing well-tested implementations from the +STL library. + +An execution {\it history} is a total order of method invocations and +responses. A {\it sequential history} is one where all invocations are +followed by the corresponding responses immediately. A concurrent +execution is correct if its behavior is consistent with its equivalent +sequential history replayed on the equivalent sequential data +structure. A concurrent object is linearizable if for all executions: +\squishcount +\item Each method call appears to take effect instantaneously at some + point between its invocation and response. + +\item The invocations and responses can be reordered to yield a + sequential history under the rule that an invocation cannot be + reordered before the preceding responses. + +\item The concurrent execution yields the same behavior as + the sequential history. +\countend + +A weaker variation of linearization is {\it sequential +consistency}\footnote{It is important to note that the term sequential +consistency in the literature is applied to both the consistency model +that data structures expose clients to as well as the guarantees that +the underlying memory system provides for load and store operations.}. +Sequential consistency only requires that there exists a sequential +history that is consistent with the {\it program order} (the intra-thread +order). This ordering does not need to be consistent with the order +that the operations were actually issued in. + +Line-Up~\cite{lineup}, Paraglider~\cite{VechevMCLinear}, and +VYRD~\cite{vyrd} leverage linearizability to test concurrent data +structures. {\bf Unfortunately, efficient implementations of many +common data structures, e.g., RCU~\cite{rcu}, MS +Queue~\cite{lockfreequeue}, etc., for the C/C++ memory model are +neither linearizable nor sequentially consistent! Thus previous tools +cannot check such data structures under the C/C++ memory model.} + +\mysubsection{New Challenges from the C/C++ Memory Model} +\label{sec:introNewChallenges} + +The C/C++ memory model brings the following two key challenges that prevent the application of previous approaches to specifying the concurrent data structures to this setting: + +\squishcount +\item {\bf Relaxed Executions Break Existing Data Structure Consistency Models:} +C/C++ data structures often expose clients to weaker (non-SC) +behaviors to gain performance. A common guarantee is to provide +happens-before synchronization between operations that implement +updates and the operations that read those updates. These data +structures often do not guarantee that different threads observe updates in the +same order --- in other words the data structures may expose clients +to weaker consistency models than sequential consistency. For +example, even when one uses the relatively strong \code{acquire} +and \code{release} memory orderings in C++, it is possible for two +different threads to observe two stores happening in +different orders, i.e., executions can fail the IRIW test. +Thus many data structures legitimately admit executions for which there +are no sequential histories that preserve program order. + +Like many other relaxed memory models, the C/C++ memory model does +not include a total order over all memory operations, thus even +further complicating the application of traditional approaches to correctness, +e.g., linearization cannot be applied. In +particular the approaches that relate the behaviors of concurrent data +structures to analogous sequential data structures break down due to +the absence of a total ordering of the memory operations. While many +of the dynamic tools~\cite{cdschecker,relacy} for exploring the +behavior of code under relaxed models do as a practical matter +print out an execution in some order, this order is to some degree arbitrary as relaxed memory models +generally make it possible for a data structure operation to see the +effects of operations that appear later in any such an order (e.g., a load +can read from a store that appears later in the order). Instead of a total order, the C/C++ +memory model is formulated as a graph of memory operations +with several partial orders defined in this graph. + +\item {\bf Constraining Reorderings (Specifying Synchronization Properties):} +Synchronization\footnote{Synchronization here is not mutual exclusion, + but rather a lower-level property that captures which stores must be + visible to a thread. In other words, it constrains which + reorderings can be performed by a processor or compiler.} in C/C++ + provides an ordering between memory operations to different + locations. Concurrent data structures must establish + synchronization or they potentially expose their users to highly + non-intuitive behavior that is likely to break client code. For + example, consider the case of a concurrent queue that does not + establish synchronization between enqueue and dequeue operations. Consider the + following sequence of operations: (1) thread A initializes the fields of a new + object X; (2) thread A enqueues the reference to X in such a queue + (3) thread B dequeues the reference to X; (4) thread B reads the + fields of X through the dequeued reference. In (4), thread B could fail to see the + initializing writes from (1). + This surprising behavior could occur if the compiler or CPU could + reorder the initializing writes to be executed after the enqueue + operation. If the fields are non-atomic, such loads are considered + data races and violate the data race free requirement of the C/C++ + language standard and thus the program has no semantics. + +The C/C++ memory model formalizes synchronization in terms of a {\it + happens-before} relation. The C/C++ happens-before relationship +is a partial order over memory accesses. If memory access {\it x} +happens before memory access {\it y}, it means that the effects of +{\it x} must be ordered before the effects of {\it y}. +\countend + +\begin{figure} + \centering +\vspace{-.3cm} + \includegraphics[scale=0.35]{figures/specworkflow} +\vspace{-.4cm} + \caption{\label{fig:specworkflow} \TOOL system overview} +\vspace{-.4cm} +\end{figure} + +\mysubsection{Specification Language and Tool Support} + +Figure~\ref{fig:specworkflow} presents an overview of the \TOOL system. After +implementing a concurrent data structure, developers annotate their code +with a \TOOL specification. To test their implementation, +developers compile the data structure with the \TOOL specification +compiler to extract the specification and generate a program that is instrumented with specification checks. + Then, developers compile the instrumented program with a +standard C/C++ compiler. Finally, developers run the binary under +the \TOOL checker. \TOOL +then exhaustively explores the behaviors of the specific unit test and +generates diagnostic reports for any executions that violate the specification. + +\mysubsection{Contributions} + +This paper makes the following contributions: + +\squishlist +\item {\bf Specification Language:} It introduces a specification + language that enables developers to write specifications of + concurrent data structures developed for a relaxed memory model in a + simple fashion that capture the key correctness properties. Our + specification language is the first to our knowledge that supports concurrent data + structures that use C/C++ atomic operations. + +\item {\bf A Technique to Relate Concurrent Executions to Sequential Executions:} It presents an approach to order the memory operations for the + C/C++ model, which lacks a definition of a trace and for which one + generally cannot even construct a total order of atomic operations + that is consistent with the program order. The generated + sequential execution by necessity does not always maintain program order. + +\item {\bf Synchronization Properties:} It presents (a) constructs + for specifying the happens before relations that a data structure + should establish, and (b) tool support for checking these properties and + exposing synchronization related bugs. + +\item {\bf Tool for Checking C/C++ Data Structures Against Specifications:} +\TOOL is the first tool to our knowledge that can check concurrent data +structures that exhibit relaxed behaviors against specifications that are +specified in terms of intuitive sequential executions. + +\item {\bf Evaluation:} It shows that the \TOOL specification language can express key correctness properties for a +set of real-world concurrent data structures, that our tool can detect + bugs, and that our tool can unit test real world data structures + with reasonable performance. +\squishend + diff --git a/writeup/issta15_submission.pdf b/writeup/issta15_submission.pdf new file mode 100644 index 0000000000000000000000000000000000000000..84e6eedb682310fa964d01f1ea2a53b408f59df4 GIT binary patch literal 259914 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
  • 0 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 Sdw}eKvWd^kET$li|Nj71-V4D1 literal 0 HcmV?d00001 diff --git a/writeup/makefile b/writeup/makefile new file mode 100644 index 0000000..6c222e4 --- /dev/null +++ b/writeup/makefile @@ -0,0 +1,94 @@ +LATEX := pdflatex -halt-on-error + +FIGURES = + +#FIGHEAD = #figures/figHeader.dotpiece +#FIGFOOT = #figures/figFooter.dotpiece + + +.SUFFIXES : .tex .bbl .aux .eps .ps .dot .pdf + +.tex.bbl: + bibtex $* + +.tex.aux: + latex $* + +%.eps: %.ps + ps2epsi $< $@ + +%.ps: %.dot + dot -Tps $< -o $@ + +%.pdf: %.dot + dot -Tpdf $< -o $@ + +%.png: %.dot + dot -Tpng $< -o $@ + +%.aux: %.tex + $(LATEX) $< + +#%.dot: %.dotpiece $(FIGHEAD) $(FIGFOOT) +# cat $(FIGHEAD) $< $(FIGFOOT) > $@ + + + +# latex the paper (default) +new: biblinks newpaper + +# latex + bibtex the paper +bib: bibpaper newpaper + +# save a backup of tex files in BACKUPS +bak: backuppaper + + +biblinks: figures + $(LATEX) paper.tex + bibtex paper.aux + $(LATEX) paper.tex + + +newpaper: figures biblinks + $(LATEX) paper.tex + + +bibpaper: paper.aux paper.bbl + latex paper.tex + + +backuppaper: + @if [ ! -d BACKUPS ]; then mkdir BACKUPS; fi; \ + crtdate=`date '+%m-%d-%y--%H:%M:%S'`; \ + bakdir=BACKUPS/$$crtdate; \ + mkdir $$bakdir; \ + cp *.tex $$bakdir + +spell: + @for i in *.tex; \ + do if [ $$i != "paper.tex" ]; then aspell -c $$i -p ./spell.lst; fi;\ + done + + +total: + latex paper.tex + bibtex paper.aux + latex paper.tex + latex paper.tex + pdflatex paper.tex + + +figures: $(FIGURES) + + +errinjfig: + gnuplot err-inj-fig/nve2latex.cmds + epstopdf injectErrorFig.eps + mv injectErrorFig.* figures + + +clean: + rm -f *.dvi *.log *.aux *.blg *.bbl *~ err-inj-fig/*~ + rm -f paper.ps paper.pdf + rm -f injectErrorFig* diff --git a/writeup/memorymodel.tex b/writeup/memorymodel.tex new file mode 100644 index 0000000..73e2e8e --- /dev/null +++ b/writeup/memorymodel.tex @@ -0,0 +1,102 @@ +\section{C/C++ Memory Model}\label{sec:memorymodel} + +We next briefly summarize the key aspects of the C/C++ memory model. The +memory model describes a set of atomic operations and the +corresponding allowed behaviors of programs that utilize them. A more +detailed formal treatment of the memory model~\cite{c11popl} and a +more detailed informal description~\cite{cpp11spec,c11spec} are +available in the literature. Any operation on an atomic object will +have one of six \textit{memory orders}, each of which falls into one +or more of the following categories. + +\begin{description} + + \item[relaxed:] + \code{\small{memory\_order\_relaxed}} -- + weakest ordering + + \item[release:] + \code{\small{memory\_order\_release}}, + \code{\small{memory\_order\_acq\_rel}}, and + \code{\small{memory\_order\_seq\_cst}} -- + a store-release may form release/consume or release/acquire synchronization + + \item[consume:\footnotemark{}] + \code{\small{memory\_order\_consume}} -- + a load-consume may form release/consume synchronization + + \footnotetext{Consume is not broadly supported by compilers due to + challenges associate with preserving data dependencies and is + unlikely to provide significant performance gains on x86 + hardware. We take the same approach as many compilers and treat + consumes as acquires.} + + \item[acquire:] + \code{\small{memory\_order\_acquire}}, + \code{\small{memory\_order\_acq\_rel}}, and + \code{\small{memory\_order\_seq\_cst}} -- + a load-acquire may form release/acquire synchronization + + \item[seq-cst:] + \code{\small{memory\_order\_seq\_cst}} -- + strongest ordering + +\end{description} + +\subsection{Relations}\label{sec:model-relations} + +The C/C++ memory model expresses program behavior in the form +of binary relations or orderings. The following subsections will briefly +summarize the relevant relations. Much of this discussion resembles the preferred model from the +formalization in \cite{c11popl}. + +\mypara{\bf Sequenced-Before:} +The order of program operations within a single thread of execution establishes an intra-thread +\textit{sequenced-before} (\reltext{sb}) relation. +Note that while some operations in C/C++ provide no +intra-thread ordering---the equality operator (\code{==}), for example---we +ignore this detail and assume that \reltext{sb} totally orders all operations in +a thread. + +\mypara{\bf Reads-From:} +The \textit{reads-from} (\reltext{rf}) relation consists of store-load pairs $(X, Y)$ +such that $Y$ reads its value from the effect of $X$---or $X \relation{rf} Y$. In the +C/C++ memory model, this relation is non-trivial, as a given load operation may +read from one of many potential stores in the program execution. + +\mypara{\bf Synchronizes-With:} +The \textit{synchronizes-with} (\reltext{sw}) relation captures +synchronization that occurs when certain atomic operations interact across two +threads. For instance, release/acquire synchronization occurs between a pair of +atomic operations on the same object: a store-release $X$ and a load-acquire +$Y$. If $Y$ reads from $X$, then $X$ synchronizes with $Y$---or $X +\relation{sw} Y$. + +\mypara{\bf Happens-Before:} +In \TOOL, we avoid consume operations, and so the \textit{happens-before} +(\reltext{hb}) relation is simply the transitive closure of \reltext{sb} and +\reltext{sw}. + +The \reltext{hb} relation restricts the stores that loads can read +from. For example, if we have two stores $X$ and $Y$ and +a load $Z$ to the same memory location and $X \relation{hb} Y +\relation{hb} Z$, then $Z$ cannot read from $X$. + +\mypara{\bf Sequential Consistency:} +All seq-cst operations in a program execution form a +total ordering (\reltext{sc}) so that, for instance, a seq-cst load may not read +from a seq-cst store prior to the most recent store (to the same location) in +the \reltext{sc} ordering, nor from any store that happens before that store. +The \reltext{sc} order must be consistent with \reltext{hb}. + +\mypara{\bf Modification Order:} +Each atomic object in a program execution has an associated \textit{modification order} +(\reltext{mo})---a total order of all stores to that object---which +informally represents a memory-coherent ordering in which those stores may be observed by +the rest of the program. +In general the modification orders for all objects cannot be combined +to form a consistent total ordering. + + + + diff --git a/writeup/paper.bib b/writeup/paper.bib new file mode 100644 index 0000000..318493c --- /dev/null +++ b/writeup/paper.bib @@ -0,0 +1,774 @@ +@inproceedings{clockvector, + author = "Friedemann Mattern", + title = "Virtual Time and Global States of Distributed Systems", + booktitle = "Workshop on Parallel and Distributed Algorithms", + year = "1989" +} + +@article{scmemorymodel, + author = {Lamport, Leslie}, + title = { How to Make a Multiprocessor Computer That Correctly Executes Multiprocess Programs}, + journal = {IEEE Transactions on Computers}, + issue_date = {September 1979}, + volume = {28}, + number = {9}, + month = sep, + year = {1979}, + pages = {690--691} +} + +@article{cantin, + author = {Cantin, Jason F. and Lipasti, Mikko H. and Smith, James E.}, + title = {The Complexity of Verifying Memory Coherence and Consistency}, + journal = {IEEE Transactions on Parallel and Distributed Systems}, + issue_date = {July 2005}, + volume = {16}, + number = {7}, + month = jul, + year = {2005}, + issn = {1045-9219}, + pages = {663--671} +} + +@inproceedings{roycav, + author = {Roy, Amitabha and Zeisset, Stephan and Fleckenstein, Charles J. and Huang, John C.}, + title = {Fast and Generalized Polynomial Time Memory Consistency Verification}, + booktitle = {Proceedings of the 18th International Conference on Computer Aided Verification}, + year = {2006} +} + + +@INPROCEEDINGS{qbornotqb, + author = {Ganesh Gopalakrishnan and Yue Yang and Hemanthkumar Sivaraj}, + title = {{QB} or not {QB}: An efficient execution verification tool for memory orderings}, + booktitle = cav04, + year = {2004}, + pages = {401--413} +} + +@Article{testsm, + author = {Phillip B. Gibbons and Ephraim Korach}, + title = {Testing Shared Memories}, + journal = {SIAM Journal on Computing}, + year = {1997}, + volume = {26}, + number = {4}, + pages = {1208-1244}, + month = {August} +} + + + +@inproceedings{koushiksc, + author = {Burnim, Jabob and Sen, Koushik and Stergiou, Christos}, + title = {Sound and complete monitoring of sequential consistency for relaxed memory models}, + booktitle = tacas11, + year = {2011} +} + +@inproceedings{burckhardtverif, + author = {Burckhardt, Sebastian and Musuvathi, Madanlal}, + title = {Effective Program Verification for Relaxed Memory Models}, + booktitle = cav08, + year = {2008} +} + +@inproceedings{checkfence, + author = {Burckhardt, Sebastian and Alur, Rajeev and Martin, Milo M. K.}, + title = {CheckFence: Checking consistency of concurrent data types on relaxed memory models}, + booktitle = pldi07, + year = {2007} +} + +@inproceedings{cdschecker, + author = {Norris, Brian and Demsky, Brian}, + title = {{CDSChecker}: Checking Concurrent Data Structures Written with {C/C++} Atomics}, + booktitle = oopsla13, + year = {2013} +} + +@inproceedings{poplabstraction, + author = {Batty, Mark and Dodds, Mike and Gotsman, Alexey}, + title = {Library abstraction for {C/C++} concurrency}, + booktitle = popl13, + year = {2013} +} + + +@inproceedings{mspcboehm, + author = {Boehm, Hans}, + title = {Can seqlocks get along with programming language memory models?}, + booktitle = mspc12, + year = {2012}, +} + + +@inproceedings{pldisc, + author={Daniel Marino and Abhayendra Singh and Todd Millstein and Madanlal Musuvathi and Satish Narayanasamy}, + title={A Case for an SC-Preserving Compiler}, + booktitle=pldi11, + year={2011} +} + +@inproceedings{ppoppworkstealing, + author = {L\^{e}, Nhat Minh and Pop, Antoniu and Cohen, Albert and Zappa Nardelli, Francesco}, + title = {Correct and efficient work-stealing for weak memory models}, + booktitle = ppopp13, + year = {2013} +} + + +@inproceedings{adversarialmemory, + author = {Flanagan, Cormac and Freund, Stephen N.}, + title = {Adversarial memory for detecting destructive races}, + booktitle = pldi10, + year = {2010} +} + + +@inproceedings{verisoft, + author = {Godefroid, Patrice}, + title = {Model checking for programming languages using {VeriSoft}}, + booktitle = popl97, + year = {1997} +} + + +@ARTICLE{dillmodel, + author = {Seungjoon Park and David L. Dill}, + title = {An Executable Specification and Verifier for Relaxed Memory Order}, + journal = ieeetc, + year = {1999}, + volume = {48} +} + +@inproceedings{vechevpartialcoherence11, + author = {Kuperstein, Michael and Vechev, Martin and Yahav, Eran}, + title = {Partial-coherence abstractions for relaxed memory models}, + booktitle = pldi11, + year = {2011} +} + +@inproceedings{vechevfmcad, + author = {Kuperstein, Michael and Vechev, Martin and Yahav, Eran}, + title = {Automatic inference of memory fences}, + booktitle = fcad10, + year = {2010} +} + + +@article{sparcmodel, + author = {Jonsson, Bengt}, + title = {State-space exploration for concurrent algorithms under weak memory orderings}, + journal = {SIGARCH Computer Architecture News}, + issue_date = {December 2008}, + volume = {36}, + number = {5}, + month = jun, + year = {2009}, + pages = {65--71}, + numpages = {7}, +} + + +@inproceedings{inspect1, + author = {Yang, Yu and Chen, Xiaofang and Gopalakrishnan, Ganesh and Wang, Chao}, + title = {Automatic Discovery of Transition Symmetry in Multithreaded Programs Using Dynamic Analysis}, + booktitle = spin09, + year = {2009}, + location = {Grenoble, France}, + pages = {279--295} +} + + +@article{sleepset, + author = {Godefroid, Patrice}, + title = {Partial-Order Methods for the Verification of Concurrent Systems: An Approach to the State-Explosion Problem}, + year = {1996}, + journal = lncs, + vol = {1032} +} + +@Article{inspect2, + author = {Chao Wang and Yu Yang and Aarti Gupta and Ganesh Gopalakrishnan}, + title = {Dynamic Model Checking with Property Driven Pruning to Detect Race Conditions}, + journal = {ATVA LNCS}, + year={2008}, + number = {126--140} +} + + + +@InProceedings{inspect3, + author = {Yu Yang and Xiaofang Chen and Ganesh Gopalakrishnan and Robert M. Kirby}, + title = {Efficient Stateful Dynamic Partial Order Reduction}, + booktitle = spin08, + year = {2008} +} + + +@inproceedings{inspect4, + author = {Yang, Yu and Chen, Xiaofang and Gopalakrishnan, Ganesh and Kirby, Robert M.}, + title = {Distributed Dynamic Partial Order Reduction Based Verification of Threaded Software}, + booktitle = spin07, + year = {2007}, + pages = {58--75} +} + +@Article{savage1997, + author = {Savage, Stefan and Burrows, Michael and Nelson, Greg and Sobalvarro, Patrick and Anderson, Thomas}, + title = {Eraser: A Dynamic Data Race Detector for Multithreaded Programs}, + journal = tocs, + volume = {15}, + issue = {4}, + month = {Nov.}, + year = {1997}, + pages = {391--411}, +} + +@inproceedings{Zhou2007, + author = {Zhou, Pin and Teodorescu, Radu and Zhou, Yuanyuan}, + title = {{HARD}: Hardware-Assisted Lockset-based Race Detection}, + booktitle = hpca07, + year = {2007}, + pages = {121--132} +} + +@article{Gait1986, + author = {Gait, Jason}, + title = {A probe effect in concurrent programs}, + journal = {Software Practice and Experience}, + volume = {16}, + issue = {3}, + month = {March}, + year = {1986}, + pages = {225--233} +} + + +@inproceedings{Gupta2009, + author = {Gupta, Shantanu and Sultan, Florin and Cadambi, Srihari and Ivancic, Franjo and Rotteler, Martin}, + title = {Using Hardware Transactional Memory for Data Race Detection}, + booktitle = ipdps09, + year = {2009}, + pages = {1--11}, +} + +@inproceedings{Kudrjavets2006, + author = {Kudrjavets, Gunnar and Nagappan, Nachiappan and Ball, Thomas}, + title = {Assessing the Relationship between Software Assertions and Faults: An Empirical Investigation}, + booktitle = {Proceedings of the 17th International Symposium on Software Reliability Engineering}, + year = {2006}, + pages = {204--212} +} + +@inproceedings{lockfreequeue, + author = {Michael, Maged M. and Scott, Michael L.}, + title = {Simple, Fast, and Practical Non-Blocking and Blocking Concurrent Queue Algorithms}, + booktitle = podc96, + year = {1996} +} + +@inproceedings{testera, + author = {Marinov, Darko and Khurshid, Sarfraz}, + title = {TestEra: A Novel Framework for Automated Testing of {Java} Programs}, + booktitle = {Proceedings of the 16th IEEE International Conference on Automated Software Engineering}, + year = {2001} +} + +@article{alloy, + author = {Jackson, Daniel}, + title = {Alloy: A Lightweight Object Modelling Notation}, + journal = {ACM Transactions on Software Engineering and Methodology (TOSEM)}, + volume = {11}, + issue = {2}, + month = {April}, + year = {2002}, + pages = {256--290} +} + + +@InProceedings{ltl, + author = {Amir Pnueli}, + title = {The Temporal Logic of Programs}, + booktitle = {Proceedings of the 18th Annual Symposium on Foundations of Computer Science (FOCS)}, + pages = {46--57}, + Tyear = {1977} +} + +@inproceedings{boehmpldi, + author = {Boehm, Hans J. and Adve, Sarita V.}, + title = {Foundations of the {C++} concurrency memory model}, + booktitle = pldi08, + year = {2008} +} + +@Misc{cpp11spec, + title = {{ISO/IEC 14882:2011}, {Information} Technology -- Programming Languages -- {C++}}, +} + +@Misc{c11spec, + title = {{ISO/IEC 9899:2011}, {Information} Technology -- Programming Languages -- {C}}, +} + +@Misc{ieee1850, + title = {1850-2005 {IEEE} Standard for Property Specification Language ({PSL})}, +} + +@Misc{c1xspec, + title = {N1548: Programming languages -- {C}}, + howpublished = {\url{http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1548.pdf}}, + month = {December}, + year = {2010}, +} + +@InProceedings{fadinew1, + author = {Lu, Shan and Park, Soyeon and Seo, Eunsoo and Zhou, Yuanyuan}, + title = {Learning from Mistakes -- A Comprehensive Study on Real World Concurrency Bug Characteristics}, + booktitle = pldi08, + year = {2008} +} + + +@Article{fadinew2, + author = {Netzer, Robert H. B. and Miller, Barton P.}, + title = {What are Race Conditions?: Some Issues and Formalizations}, + journal = {ACM Letters on Programming Languages and Systems}, + year = {1992}, + volume = {1}, + number = {1}, + pages = {74--88}, + month = {March} +} + +@InProceedings{fadinew3, + author = {Jinpeng Wei and Carlton Pu}, + title = {Multiprocessors May Reduce System Dependability under File-based Race Condition Attacks}, + booktitle = {Proceedings of the 37th Annual IEEE/IFIP International Conference on Dependable Systems and Networks}, + year = {2007} +} + +@Article{rcu, + author = {Mathie Desnoyers and Paul E McKenney and Alan S Stern and Michel R Dagenais and Jonathan Walpole}, + title = {User-Level Implementations of Read-Copy Update}, + journal = tpds, + year = {2011} +} + +@InProceedings{crugiso, + author = {Guoliang Jin and Aditya Thakur and Ben Liblit and + Shan Lu}, + title = {Instrumentation and Sampling Strategies for + {Cooperative} {Concurrency} {Bug} {Isolation}}, + booktitle = oopsla10, + year = 2010 +} + +@inproceedings{incrementalhashing, + author = {Nguyen, Viet Yen and Ruys, Theo C.}, + title = {Incremental Hashing for {SPIN}}, + booktitle = spin08, + year = {2008} +} + +@inproceedings{racetrack, + author = {Yu, Yuan and Rodeheffer, Tom and Chen, Wei}, + title = {RaceTrack: Efficient Detection of Data Race Conditions via Adaptive Tracking}, + booktitle = sosp05, + year = {2005} +} + + +@inproceedings{nitpicking, + author = {Blanchette, Jasmin Christian and Weber, Tjark and Batty, Mark and Owens, Scott and Sarkar, Susmit}, + title = {Nitpicking {C++} concurrency}, + booktitle = ppdp11, + year = {2011} +} + + +@inproceedings{c11popl, + author = {Batty, Mark and Owens, Scott and Sarkar, Susmit and Sewell, Peter and Weber, Tjark}, + title = {Mathematizing {C++} Concurrency}, + booktitle = popl11, + year = {2011} +} + +@inproceedings{fairstateless, + author = {Musuvathi, Madanlal and Qadeer, Shaz}, + title = {Fair stateless model checking}, + booktitle = pldi08, + year = {2008} +} + +@Misc{javaConcurrentHashMap, + author = {Doug Lea}, + title = {util.concurrent.{ConcurrentHashMap} in java.util.concurrent the {Java Concurrency Package}}, + howpublished = {\url{http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html}} +} + +@Misc{clickhashtable, + author = {Cliff Click}, + title = {A Lock-Free Hash Table}, + howpublished = {\url{http://www.azulsystems.com/events/javaone_2007/2007_LockFreeHash.pdf}}, + month = {May}, + year = {2007} +} + +@inproceedings{racerx, + author = {Engler, Dawson and Ashcraft, Ken}, + title = {{RacerX}: Effective, Static Detection of Race Conditions and Deadlocks}, + booktitle = sosp03, + year = {2003} +} + +@inproceedings{conflictexceptions, + author = {Lucia, Brandon and Ceze, Luis and Strauss, Karin and Qadeer, Shaz and Boehm, Hans}, + title = {Conflict Exceptions: Simplifying Concurrent Language Semantics with Precise Hardware Exceptions for Data-Races}, + booktitle = isca10, + year = {2010} +} + + +@inproceedings{fasttrack, + author = {Flanagan, Cormac and Freund, Stephen N.}, + title = {{FastTrack}: Efficient and Precise Dynamic Race Detection}, + booktitle = pldi09, + year = {2009} +} + + +@inproceedings{goldilocks, + author = {Elmas, Tayfun and Qadeer, Shaz and Tasiran, Serdar}, + title = {Goldilocks: A Race and Transaction-Aware {Java} Runtime}, + booktitle = pldi07, + year = {2007} +} + +@inproceedings{boyapati, + author = {Chandrasekhar Boyapati and Robert Lee and Martin Rinard}, + title = {{Ownership Types for Safe Programming: Preventing Data Races and Deadlocks}}, + booktitle = oopsla02, + year = {2002} + } + + +@Misc{relacy, + author = {Dmitriy Vyukov}, + title = {Relacy Race Detector}, + howpublished = {\url{http://relacy.sourceforge.net/}}, + month = {2011}, + year = {Oct.} +} + +@Book{spinmodel, + author = {Gerard J. Holzmann}, + title = {The {SPIN} Model Checker: Primer and Reference Manual}, + publisher = {Addison-Wesley Professional}, + year = {2003}, + edition = {1st} +} + +@Book{multiprocessorprogramming, + author = {Maurice Herlihy and Nir Shavit}, + title = {The Art of Multiprocessor Programming}, + publisher = {Morgan Kaufmamn}, + year = {2012}, + edition = {Revised 1st} +} + +@InProceedings{dpor, + author = {Cormac Flanagan and Patrice Godefroid}, + title = {Dynamic Partial-Order Reduction for Model Checking Software}, + booktitle = popl05, + month = {Jan.}, + year = {2005} +} + +@Article{shavitcacm, + author = {Nir Shavit}, + title = {Data Structures in the Multicore Age}, + journal = cacm, + year = {2011}, + volume = {54}, + number = {3}, + month = {March} +} +% pages = {76--84}, + +@inproceedings{chess, + author = {Madanlal Musuvathi and Shaz Qadeer and Piramanayagam Arumuga Nainar and Thomas Ball and Gerard Basler and Iulian Neamtiu}, + title = {Finding and Reproducing {Heisenbugs} in Concurrent Programs}, + year = {2008}, + booktitle=osdi08 +} + + +@inproceedings{lineup, + author = {Burckhardt, Sebastian and Dern, Chris and Musuvathi, Madanlal and Tan, Roy}, + title = {Line-up: A Complete and Automatic Linearizability Checker}, + booktitle = pldi10, + year = {2010} +} + +@inproceedings{berger-grace-09, + author = {Berger, Emery D. and Yang, Ting and Liu, Tongping and Novark, Gene}, + title = {Grace: Safe multithreaded programming for {C}/{C}++}, + booktitle = oopsla09, + year = {2009}, +} + +@INPROCEEDINGS{charisma, +author = {Chao Huang and Laxmikant V. Kale}, +title = {Charisma: Orchestrating Migratable Parallel Objects}, +booktitle = hpdc07, +year = {2007} +} + + +@inproceedings{ding-bop-07, + author = {Ding, Chen and Shen, Xipeng and Kelsey, Kirk and Tice, Chris and Huang, Ruke and Zhang, Chengliang}, + title = {Software behavior oriented parallelization}, + booktitle = pldi07, + year = {2007}, +} + +@Misc{tilepro64, + key = {tilera}, + title = {TILEPro64 Processor}, + howpublished = {\url{http://tilera.com/products/processors/TILEPRO64}}, + month = {December}, + year = {2010} +} + +@Misc{magnycour, + key = {amd}, + title = {{AMD} {Opteron} 6000 Series Platform}, + howpublished = {\url{http://www.amd.com/us/products/server/processors/6000-series-platform/pages/6000-series-platform.aspx}}, + month = {December}, + year = {2010} +} + +@inproceedings{delaunay, + author = {Guibas, Leonidas J. and Knuth, Donald E. and Sharir, Micha}, + title = {Randomized Incremental Construction of {Delaunay} and {Voronoi} Diagrams}, + booktitle = {Proceedings of the Seventeenth International Colloquium on Automata, Languages and Programming}, + year = {1990}, + location = {Warwick University, England}, + pages = {414--431}, + numpages = {18}, + publisher = {Springer-Verlag New York, Inc.}, + address = {New York, NY, USA}, +} + +@inproceedings{1000core, + author = {Borkar, Shekhar}, + title = {Thousand Core Chips: A Technology Perspective}, + booktitle = dac07, + year = {2007} + } + +@PhDThesis{r-cilk-98, + author = {Keith H. Randall}, + title = {Cilk: Efficient Multithreaded Computing}, + school = {Massachusetts Institute of Technology}, + year = 1998, +} + +@InProceedings{dll-jcilk-05, + author = {John S. Danaher and I-Ting Angelina Lee and Charles E. Leiserson}, + title = {The {JCilk} Language for Multithreaded Computing}, + booktitle = scool05, + year = 2005, +} + +@inproceedings{java-grande, + author = {Smith, L. A. and Bull, J. M. and Obdrz\'{a}lek, J.}, + title = {A Parallel {J}ava {G}rande Benchmark Suite}, + booktitle = sc01, + year = {2001} +} + +@inproceedings{spin-commit-atomicity, + author = {Flanagan, Cormac}, + title = {Verifying Commit-Atomicity using Model-Checking}, + booktitle = spin04, + year = {2004} +} + +@Article{linearizableref, + author = {Maurice Herlihy and Jeannette Wing}, + title = {Linearizability: a correctness condition for concurrent objects}, + journal = {ACM Transactions on Programming Languages and Systems}, + year = {1990}, + volume = {12}, + number = {3}, + pages = {463-492}, + month = {July} +} + +@Article{refinement-mapping, + author = {Abadi, Martine and Lamport, Leslie}, + title = {The existence of Refinement Mapping}, + journal = {Theoretical Computer Science}, + year = {1991}, + volume = {82}, + number = {2}, + pages = {253-284}, + month = {May} +} + +@inproceedings{abstraction-linearizability, + author = {Amit, D. and Rinetzky, N. and Reps, T. and Sagiv, M. and Yahav, E. }, + title = {Comparison under Abstraction for Verifying Linearizability}, + booktitle = cav07, + year = {2007} +} + +@inproceedings{formal-verification-set, + author = {Colvin, R. and Groves, L. and Luchangco, V. and Moir, M.}, + title = {Formal Verification of a Lazy Concurrent List-Based Set Algorithm}, + booktitle = cav06, + year = {2006} +} + +@inproceedings{concurrit, + author = {Elmas, T. and Burnim, J. and Necula, G. and Sen, K.}, + title = {{CONCURRIT}: A Domain Specific Language for Reproducing Concurrency Bugs}, + booktitle = pldi13, + year = {2013} +} + +@inproceedings{gambit, + author = {Coons, K. E. and Burckhardt, S. and Musuvathi, M.}, + title = {{GAMBIT}: Effective Unit Testing for Concurrency Libraries}, + booktitle = ppopp10, + year = {2010} +} + +@inproceedings{memtest, + author = {Burnim, J. and Sen, K. and Stergiou, C.}, + title = {Testing Concurrent Programs on Relaxed Memory Models}, + booktitle = issta11, + year = {2011} +} + +@inproceedings{ndetermin, + author = {Burnim, J. and Elmas, T. and Necula, G. and Sen, K.}, + title = {{NDetermin}: Inferring Nondeterministic Sequential Specifications for Parallelism Correctness}, + booktitle = ppopp12, + year = {2012} +} + +@inproceedings{vyrd, + author = {Elmas, T. and Tasiran, S. and Qadeer, S.}, + title = {{VYRD}: VerifYing Concurrent Programs by Runtime Refinement-Violation Detection}, + booktitle = pldi05, + year = {2005} +} + +@inproceedings{thread-quantification, + author = {Berdine, J. and Lev-Ami, T. and Manivich, R. and Ramalingam, G. and Sagiv, M.}, + title = {Thread Quantification for Concurrent Shape Analysis}, + booktitle = cav08, + year = {2008} +} + +@inproceedings{VechevMCLinear, + author = {Vechev, Martin and Yahav, Eran and Yorsh, Greta}, + title = {Experience with Model Checking Linearizability}, + booktitle = "International SPIN Workshop on Model Checking Software", + year = {2009} +} + +@inproceedings{shape-value-abstraction, + author = {Vafeiadis, Viktor}, + title = {Shape-Value Abstraction for Verifying Linearizability}, + booktitle = vmcai09, + year = {2009} +} + +@Article{test-verify-concurrent-objects, + author = {Wing, Jeannette M. and Gong, Chun}, + title = {Testing and Verifying Concurrent Objects}, + journal = {Journal of Parallel and Distributed Computing - Special issue on parallel I/O systems}, + year = {1993}, + volume = {17}, + number = {1-2}, + pages = {164-182}, + month = {Jan./Feb.} +} + +@inproceedings{stamp, + title = {{STAMP}: Stanford Transactional Applications for Multi-Processing}, + author = {Cao Minh, Chi and Chung, JaeWoong and Kozyrakis, Christos and Olukotun, Kunle}, + booktitle = iiswc08, + year = {2008} +} + +@article{l-clocks, + author = {Lamport, Leslie}, + title = {Time, clocks, and the ordering of events in a distributed system}, + journal = cacm, + issue_date = {July 1978}, + volume = {21}, + number = {7}, + month = jul, + year = {1978}, + pages = {558--565}, + numpages = {8}, + acmid = {359563}, + publisher = {ACM}, + address = {New York, NY, USA}, + keywords = {clock synchronization, computer networks, distributed systems, multiprocess systems}, +} + +@inproceedings{reverse-execution, + author = {Pan, Douglas Z. and Linton, Mark A.}, + title = {Supporting reverse execution for parallel programs}, + booktitle = padd88, + year = {1988} +} + +@misc{linux, + title = {Linux Kernel v3.6}, + howpublished = {\url{http://kernel.org/}}, + month = {September}, + year = {2012}, +} + +@inproceedings{mcs-lock, + author = {Mellor-Crummey, John M. and Scott, Michael L.}, + title = {Synchronization without contention}, + booktitle = asplos91, + year = {1991}, + location = {Santa Clara, California, United States}, + pages = {269--278}, + numpages = {10}, + acmid = {106999}, +} + +@misc{barrier-url, + howpublished = {\url{http://stackoverflow.com/questions/8115267/writing-a-spinning-thread-barrier-using-c11-atomics}}, + note = {Oct. 2012}, +} + +@misc{mcs-lock-url, + howpublished = {\url{http://cbloomrants.blogspot.com/2011/07/07-18-11-mcs-list-based-lock\_18.html}}, + note = {Oct. 2012}, +} + +@misc{spsc-queue-url, + howpublished = {\url{https://groups.google.com/forum/#!msg/comp.programming.threads/nSSFT9vKEe0/7eD3ioDg6nEJ}}, + note = {Oct. 2012}, +} + +@misc{mpmc-queue-url, + howpublished = {\url{http://cbloomrants.blogspot.com/2011/07/07-30-11-look-at-some-bounded-queues.html}}, + note = {Oct. 2012}, +} + +@misc{dekker-url, + howpublished = {\url{http://www.justsoftwaresolutions.co.uk/threading/}}, + note = {Dec. 2012}, +} diff --git a/writeup/paper.tex b/writeup/paper.tex new file mode 100644 index 0000000..d65f512 --- /dev/null +++ b/writeup/paper.tex @@ -0,0 +1,182 @@ +%----------------------------------------------------------------------------- +% +% Template for sigplanconf LaTeX Class +% +% Name: sigplanconf-template.tex +% +% Purpose: A template for sigplanconf.cls, which is a LaTeX 2e class +% file for SIGPLAN conference proceedings. +% +% Guide: Refer to "Author's Guide to the ACM SIGPLAN Class," +% sigplanconf-guide.pdf +% +% Author: Paul C. Anagnostopoulos +% Windfall Software +% 978 371-2316 +% paul@windfall.com +% +% Created: 15 February 2005 +% +%----------------------------------------------------------------------------- + + +\documentclass[nocopyrightspace]{sig-alternate} + +% The following \documentclass options may be useful: +% +% 10pt To set in 10-point type instead of 9-point. +% 11pt To set in 11-point type instead of 9-point. +% authoryear To obtain author/year citation style instead of numeric. +\usepackage{times} +\usepackage[scaled]{helvet} % see www.ctan.org/get/macros/latex/required/psnfss/psnfss2e.pdf +\usepackage{url} % format URLs +\usepackage{listings} % format code +\usepackage{enumitem} % adjust spacing in enums +\sloppy +\usepackage[colorlinks=true,allcolors=blue,breaklinks,draft]{hyperref} +\newcommand{\doi}[1]{doi:~\href{http://dx.doi.org/#1}{\Hurl{#1}}} % print a hyperlinked DOI + +\usepackage{rotating} +\usepackage{algorithm}% http://ctan.org/pkg/algorithms +\usepackage{algpseudocode}% http://ctan.org/pkg/algorithmicx +%\usepackage{syntax} +%\usepackage{times} + +\usepackage{amsmath} +\usepackage{graphicx} +\usepackage{xspace} +\usepackage{amssymb} + +\usepackage{listings} +\usepackage{color} +\usepackage{textcomp} +\definecolor{listinggray}{gray}{0.9} +\definecolor{lbcolor}{rgb}{0.9,0.9,0.9} +\lstset{ + % backgroundcolor=\color{lbcolor}, + % rulecolor=, + % aboveskip={1.5\baselineskip}, + % extendedchars=true, + tabsize=3, + language=C++, + basicstyle=\ttfamily\scriptsize, + upquote=true, + columns=fixed, + showstringspaces=false, + breaklines=true, + prebreak = \raisebox{0ex}[0ex][0ex]{\ensuremath{\hookleftarrow}}, + % frame=single, + showtabs=false, + showspaces=false, + showstringspaces=false, + identifierstyle=\ttfamily, + keywordstyle=\color[rgb]{0,0,1}, + commentstyle=\color[rgb]{0.133,0.545,0.133}, + stringstyle=\color[rgb]{0.627,0.126,0.941}, + numbers=left, + numberstyle=\tiny, + numbersep=8pt, + escapeinside={/*@}{@*/} +} + +\usepackage{algpseudocode} + +%% Not used yet +% \usepackage{times} +% \usepackage{latexsym} +% \usepackage{amsfonts} +% \usepackage{amsthm} +% \usepackage{txfonts} +% \usepackage{url} +% \usepackage{subfigure} + +% \usepackage{bbm} +% \usepackage{stfloats} + +\newcommand{\squishlist}{ + \begin{list}{$\bullet$} + { + \setlength{\itemsep}{1pt} + \setlength{\parsep}{1pt} + \setlength{\topsep}{1pt} + \setlength{\partopsep}{1pt} + \setlength{\leftmargin}{1em} + \setlength{\labelwidth}{0.5em} + \setlength{\labelsep}{0.5em} + } +} + +\newcommand{\squishend}{ + \end{list} +} + +\newcommand{\squishcount}{ +% \begin{enumerate} +%} + \begin{list}{\bf \arabic{enumi}.} + { \usecounter{enumi} + \setlength{\itemsep}{1pt} \setlength{\parsep}{0pt} + \setlength{\topsep}{0pt} \setlength{\partopsep}{0pt} + \setlength{\leftmargin}{1em} \setlength{\labelwidth}{0.5em} + \setlength{\labelsep}{0.5em} } } + +\newcommand{\countend}{ +% \end{enumerate} +%} +\end{list}} + + +\newcommand{\code}[1]{\text{\tt #1}} +\newcommand{\mypara}[1]{\noindent {#1}} +\newcommand{\etal}{\textit{et al}.\xspace} +\newcommand{\cdschecker}[0]{\textsc{CDSChecker}\xspace} +\newcommand{\TOOL}[0]{\textsc{CDSSpec}\xspace} + +\newcommand{\TODO}[0]{\textbf{TODO}\xspace} +\newcommand{\todo}[1]{{\bf [[#1]]}} +%\newcommand{\todo}[1]{} +\newcommand{\comment}[1]{} +\newcommand{\tuple}[1]{\ensuremath \langle #1 \rangle} +\newcommand{\rf}{\reltext{rf}} +\newcommand{\relation}[1]{\xrightarrow{\textit{#1}}} +\newcommand{\reltext}[1]{\textit{#1}} + +%\newcommand{\mysection}[1]{\vspace{-.15cm}\section{#1}\vspace{-.15cm}} +\newcommand{\mysection}[1]{\section{#1}} +%\newcommand{\mysubsection}[1]{\vspace{-.15cm}\subsection{#1}\vspace{-.1cm}} +\newcommand{\mysubsection}[1]{\subsection{#1}} +%\newcommand{\mysubsubsection}[1]{\vspace{-.15cm}\subsubsection{#1}\vspace{-.1cm}} +\newcommand{\mysubsubsection}[1]{\subsubsection{#1}} +\begin{document} + + +\sloppy + +\title{CDSSpec: Testing Concurrent Data Structures Under the C/C++11 Memory Model} + +\author{Peizhao Ou and Brian Demsky} + + + +\maketitle + +\begin{abstract} +\input{abstract} +\end{abstract} + +\input{introduction} +%\input{memorymodel} +%\input{example} +\input{formalization} +%\input{specification} +%\input{implementation} +%\input{evaluation} +%\input{related} +%\input{conclusion} + + +% We recommend abbrvnat bibliography style. +\bibliographystyle{abbrv} +\bibliography{confstrs-long,paper} + +\end{document} diff --git a/writeup/related.tex b/writeup/related.tex new file mode 100644 index 0000000..b8f025d --- /dev/null +++ b/writeup/related.tex @@ -0,0 +1,133 @@ +\mysection{\label{sec:related}Related Work} + +% Related work should be related to bug finding on concurrent data structures: +% 1. Specification: +% CONCURRIT: A Domain Specific Language for Reproducing Concurrency Bugs (DSL +% for reproducing bugs, allowing specifying a set of thread schedules to explore +% in order to exhibit the bug) (PLDI'13) + +% (specify the correctness of concurrent programs using +% nondeterministic sequential specifications, which allows the functional +% correctness to be understood and verified on a sequential version of the +% program) (PLDI'11) + +% (this is the extended work of NDSeq, which is +% inferring the specification) (ppopp'12) + +% (specification, not exhaustive approach, dynamic checking) +% (PLDI'05) + + +% 2. Linearizability: +% (a more complete technique +% for verifying atomicity using SPIN model checker)(SPIN Workshop'04) + +% (theoretical paper about proving a lower +% level spscification correctly implements a higher level one) (Theoretical +% Computer Science'91) + +% (static analysis +% for verifying linearizability of concurrent unbounded linked data +% structures) (CAV'07) + +% (a formal +% verification of LazyList, concurrent list-based set algorithm, shows it's +% linearizable) (CAV'06) + +% (no specification, +% run a sequential version in parallel and checks if the concurrent execution +% violates linearizability, rely on CHESS, which assumes SC) (PLDI'10) + +% (using abstract +% interpretation, shape analysis for concurrent data structures, can prove +% linearizability in a limited way) (CAV'08) + +% (SC-based checking +% linearizability) (SPIN Workshop'09) + +% (heap-allocated data +% structures, shape analysis, assuming SC) (VMCAI'09) + +% 3. General concurrency testing +% (a prioritized +% search technique that combines the speed benefit of heuristic-guided fuzzing +% with the soundness, progress, and reproducibility of stateless model checking) +% (ppopp'10) + +% (one of the early paper) (Journal of Parallel and +% Distributed Computing) + +% 4. For relaxed M.M. +% () (PLDI'07) (TODO: Should read this in more detail) + +% (a tool that test +% concurrent programs under relaxed M.M., but no specification, and not +% an exhaustive approach) (issta'11) + +Researchers have proposed and designed specifications and approaches +to find bugs in concurrent data structures based on linearization. +Early work by Wing and +Gong~\cite{test-verify-concurrent-objects} proposed using +linearizability to test and verify concurrent objects. +Line-up~\cite{lineup} builds on the Chess~\cite{chess} model checker +to automatically check deterministic linearizability. It +automatically generates the sequential specification by systematically +enumerating all sequential behaviors. +Paraglider~\cite{VechevMCLinear} supports checking with and without +linearization points based on SPIN~\cite{spinmodel}. All of these +approaches assume that there exist a sequential history that is consistent with program order. Furthermore, they also assume +the SC memory model and a trace that provides an +ordering for method invocation and response events. Our work extends the notion of equivalence to sequential executions to the relaxed memory models used +by real systems. + +Amit \etal~\cite{abstraction-linearizability} present a static +analysis based on TVLA for verifying linearizability of concurrent +linked data structures. Valeiadis~\cite{shape-value-abstraction} +demonstrates a shape-value abstraction which can automatically prove +linearizability. Thread quantification can also verify +data structure linearizability~\cite{thread-quantification}. +Colvin \etal formally verified a list-based set~\cite{formal-verification-set}. While these approaches +provide stronger guarantees than \TOOL, they were typically used to +check simpler data structures and require experts to use. +Moreover, they target the SC memory model. + +Researchers have proposed specification languages for concurrent +data structures. Refinement mapping~\cite{refinement-mapping} +provides the theoretical basis for designing and using specifications. +Commit atomicity~\cite{spin-commit-atomicity} can verify atomicity +properties. Concurrit~\cite{concurrit} is a domain-specific language +that allows programmers to write scripts to specify thread schedules +to reproduce bugs, and is useful when programmers already have some +knowledge about a bug. NDetermin~\cite{ndetermin} infers +nondeterministic sequential specifications to model the behaviors of +parallel code. + +VYRD~\cite{vyrd} is conceptually similar to \TOOL --- developers +specify commit points for concurrent code. The parallel code is then +executed and the commit points are used to identify a sequential +execution that should have the same behaviors. VYRD was designed for +the SC memory model --- it +is unable to construct a sequential refinement for a relaxed memory +model or check synchronization properties. + +{\sc Gambit}~\cite{gambit} uses a prioritized search technique that +combines stateless model checking and heuristic-guided fuzzing to unit +test code under the SC memory model. {\sc Relaxed}~\cite{memtest} +explores SC executions to identify executions with races and then +re-executes the program under the PSO or TSO memory model to test +whether the relaxations expose bugs. CheckFence~\cite{checkfence} is +a tool for verifying data structures against relaxed memory models and +takes a SAT-based approach instead of the stateless model checking +approach used by \cdschecker. + +Researchers have developed verification techniques for code that +admits only SC executions under the TSO and PSO memory +models~\cite{koushiksc,burckhardtverif}. The basic idea is to develop +an execution monitor that can detect whether non-SC executions exist +by examining only SC executions. + + diff --git a/writeup/sig-alternate.cls b/writeup/sig-alternate.cls new file mode 100644 index 0000000..694a897 --- /dev/null +++ b/writeup/sig-alternate.cls @@ -0,0 +1,1649 @@ +% SIG-ALTERNATE.CLS - VERSION 2.5 +% "COMPATIBLE" WITH THE "ACM_PROC_ARTICLE-SP.CLS" V3.2SP +% Gerald Murray - May 23rd 2012 +% +% ---- Start of 'updates' ---- +% Changed $10 fee to $15 -- May 2012 -- Gerry +% Changed $5 fee to $10 -- April 2009 -- Gerry +% April 22nd. 2009 - Fixed 'Natbib' incompatibility problem - Gerry +% April 22nd. 2009 - Fixed 'Babel' incompatibility problem - Gerry +% April 22nd. 2009 - Inserted various bug-fixes and improvements - Gerry +% +% To produce Type 1 fonts in the document plus allow for 'normal LaTeX accenting' in the critical areas; +% title, author block, section-heads, confname, etc. etc. +% i.e. the whole purpose of this version update is to NOT resort to 'inelegant accent patches'. +% After much research, three extra .sty packages were added to the the tail (ae, aecompl, aeguill) to solve, +% in particular, the accenting problem(s). We _could_ ask authors (via instructions/sample file) to 'include' these in +% the source .tex file - in the preamble - but if everything is already provided ('behind the scenes' - embedded IN the .cls) +% then this is less work for authors and also makes everything appear 'vanilla'. +% NOTE: all 'patchwork accenting" has been commented out (here) and is no longer 'used' in the sample .tex file (either). +% Gerry June 2007 +% +% Patch for accenting in conference name/location. Gerry May 3rd. 2007 +% Rule widths changed to .5, author count (>6) fixed, roll-back for Type 3 problem. Gerry March 20th. 2007 +% Changes made to 'modernize' the fontnames but esp. for MikTeX users V2.4/2.5 - Nov. 30th. 2006 +% Updated the \email definition to allow for its use inside of 'shared affiliations' - Nov. 30th. 2006 +% Fixed the 'section number depth value' - Nov. 30th. 2006 +% +% Footnotes inside table cells using \minipage (Oct. 2002) +% Georgia fixed bug in sub-sub-section numbering in paragraphs (July 29th. 2002) +% JS/GM fix to vertical spacing before Proofs (July 30th. 2002) +% +% Made the Permission Statement / Conference Info / Copyright Info +% 'user definable' in the source .tex file OR automatic if +% not specified. +% +% Allowance made to switch default fonts between those systems using +% normal/modern font names and those using 'Type 1' or 'Truetype' fonts. +% See LINE NUMBER 255 for details. +% Also provided for enumerated/annotated Corollaries 'surrounded' by +% enumerated Theorems (line 848). +% Gerry November 11th. 1999 +% +% ---- End of 'updates' ---- +% +\def\fileversion{v2.5} % for ACM's tracking purposes +\def\filedate{May 23, 2012} % Gerry Murray's tracking data +\def\docdate {Wednesday 23rd. May 2012} % Gerry Murray (with deltas to doc} +\usepackage{epsfig} +\usepackage{amssymb} +\usepackage{amsmath} +\usepackage{amsfonts} +% Need this for accents in Arial/Helvetica +%\usepackage[T1]{fontenc} % Gerry March 12, 2007 - causes Type 3 problems (body text) +%\usepackage{textcomp} +% +% SIG-ALTERNATE DOCUMENT STYLE +% G.K.M. Tobin August-October 1999 +% adapted from ARTICLE document style by Ken Traub, Olin Shivers +% also using elements of esub2acm.cls +% HEAVILY MODIFIED, SUBSEQUENTLY, BY GERRY MURRAY 2000 +% ARTICLE DOCUMENT STYLE -- Released 16 March 1988 +% for LaTeX version 2.09 +% Copyright (C) 1988 by Leslie Lamport +% +% +%%% sig-alternate.cls is an 'ALTERNATE' document style for producing +%%% two-column camera-ready pages for ACM conferences. +%%% THIS FILE DOES NOT STRICTLY ADHERE TO THE SIGS (BOARD-ENDORSED) +%%% PROCEEDINGS STYLE. It has been designed to produce a 'tighter' +%%% paper in response to concerns over page budgets. +%%% The main features of this style are: +%%% +%%% 1) Two columns. +%%% 2) Side and top margins of 4.5pc, bottom margin of 6pc, column gutter of +%%% 2pc, hence columns are 20pc wide and 55.5pc tall. (6pc =3D 1in, approx) +%%% 3) First page has title information, and an extra 6pc of space at the +%%% bottom of the first column for the ACM copyright notice. +%%% 4) Text is 9pt on 10pt baselines; titles (except main) are 9pt bold. +%%% +%%% +%%% There are a few restrictions you must observe: +%%% +%%% 1) You cannot change the font size; ACM wants you to use 9pt. +%%% 3) You must start your paper with the \maketitle command. Prior to the +%%% \maketitle you must have \title and \author commands. If you have a +%%% \date command it will be ignored; no date appears on the paper, since +%%% the proceedings will have a date on the front cover. +%%% 4) Marginal paragraphs, tables of contents, lists of figures and tables, +%%% and page headings are all forbidden. +%%% 5) The `figure' environment will produce a figure one column wide; if you +%%% want one that is two columns wide, use `figure*'. +%%% +% +%%% Copyright Space: +%%% This style automatically reserves 1" blank space at the bottom of page 1/ +%%% column 1. This space can optionally be filled with some text using the +%%% \toappear{...} command. If used, this command must be BEFORE the \maketitle +%%% command. If this command is defined AND [preprint] is on, then the +%%% space is filled with the {...} text (at the bottom); otherwise, it is +%%% blank. If you use \toappearbox{...} instead of \toappear{...} then a +%%% box will be drawn around the text (if [preprint] is on). +%%% +%%% A typical usage looks like this: +%%% \toappear{To appear in the Ninth AES Conference on Medievil Lithuanian +%%% Embalming Technique, June 1991, Alfaretta, Georgia.} +%%% This will be included in the preprint, and left out of the conference +%%% version. +%%% +%%% WARNING: +%%% Some dvi-ps converters heuristically allow chars to drift from their +%%% true positions a few pixels. This may be noticeable with the 9pt sans-serif +%%% bold font used for section headers. +%%% You may turn this hackery off via the -e option: +%%% dvips -e 0 foo.dvi >foo.ps +%%% +\typeout{Document Class 'sig-alternate' <23rd. May '12>. Modified by G.K.M. Tobin/Gerry Murray} +\typeout{Based in part upon document Style `acmconf' <22 May 89>. Hacked 4/91 by} +\typeout{shivers@cs.cmu.edu, 4/93 by theobald@cs.mcgill.ca} +\typeout{Excerpts were taken from (Journal Style) 'esub2acm.cls'.} +\typeout{****** Bugs/comments/suggestions/technicalities to Gerry Murray -- murray@hq.acm.org ******} +\typeout{Questions on the style, SIGS policies, etc. to Adrienne Griscti griscti@acm.org} +\oddsidemargin 4.5pc +\evensidemargin 4.5pc +\advance\oddsidemargin by -1in % Correct for LaTeX gratuitousness +\advance\evensidemargin by -1in % Correct for LaTeX gratuitousness +\marginparwidth 0pt % Margin pars are not allowed. +\marginparsep 11pt % Horizontal space between outer margin and + % marginal note + + % Top of page: +\topmargin 4.5pc % Nominal distance from top of page to top of + % box containing running head. +\advance\topmargin by -1in % Correct for LaTeX gratuitousness +\headheight 0pt % Height of box containing running head. +\headsep 0pt % Space between running head and text. + % Bottom of page: +\footskip 30pt % Distance from baseline of box containing foot + % to baseline of last line of text. +\@ifundefined{footheight}{\newdimen\footheight}{}% this is for LaTeX2e +\footheight 12pt % Height of box containing running foot. + +%% Must redefine the top margin so there's room for headers and +%% page numbers if you are using the preprint option. Footers +%% are OK as is. Olin. +\advance\topmargin by -37pt % Leave 37pt above text for headers +\headheight 12pt % Height of box containing running head. +\headsep 25pt % Space between running head and text. + +\textheight 666pt % 9 1/4 column height +\textwidth 42pc % Width of text line. + % For two-column mode: +\columnsep 2pc % Space between columns +\columnseprule 0pt % Width of rule between columns. +\hfuzz 1pt % Allow some variation in column width, otherwise it's + % too hard to typeset in narrow columns. + +\footnotesep 5.6pt % Height of strut placed at the beginning of every + % footnote =3D height of normal \footnotesize strut, + % so no extra space between footnotes. + +\skip\footins 8.1pt plus 4pt minus 2pt % Space between last line of text and + % top of first footnote. +\floatsep 11pt plus 2pt minus 2pt % Space between adjacent floats moved + % to top or bottom of text page. +\textfloatsep 18pt plus 2pt minus 4pt % Space between main text and floats + % at top or bottom of page. +\intextsep 11pt plus 2pt minus 2pt % Space between in-text figures and + % text. +\@ifundefined{@maxsep}{\newdimen\@maxsep}{}% this is for LaTeX2e +\@maxsep 18pt % The maximum of \floatsep, + % \textfloatsep and \intextsep (minus + % the stretch and shrink). +\dblfloatsep 11pt plus 2pt minus 2pt % Same as \floatsep for double-column + % figures in two-column mode. +\dbltextfloatsep 18pt plus 2pt minus 4pt% \textfloatsep for double-column + % floats. +\@ifundefined{@dblmaxsep}{\newdimen\@dblmaxsep}{}% this is for LaTeX2e +\@dblmaxsep 18pt % The maximum of \dblfloatsep and + % \dbltexfloatsep. +\@fptop 0pt plus 1fil % Stretch at top of float page/column. (Must be + % 0pt plus ...) +\@fpsep 8pt plus 2fil % Space between floats on float page/column. +\@fpbot 0pt plus 1fil % Stretch at bottom of float page/column. (Must be + % 0pt plus ... ) +\@dblfptop 0pt plus 1fil % Stretch at top of float page. (Must be 0pt plus ...) +\@dblfpsep 8pt plus 2fil % Space between floats on float page. +\@dblfpbot 0pt plus 1fil % Stretch at bottom of float page. (Must be + % 0pt plus ... ) +\marginparpush 5pt % Minimum vertical separation between two marginal + % notes. + +\parskip 0pt plus 1pt % Extra vertical space between paragraphs. +\parindent 9pt % GM July 2000 / was 0pt - width of paragraph indentation. +\partopsep 2pt plus 1pt minus 1pt% Extra vertical space, in addition to + % \parskip and \topsep, added when user + % leaves blank line before environment. + +\@lowpenalty 51 % Produced by \nopagebreak[1] or \nolinebreak[1] +\@medpenalty 151 % Produced by \nopagebreak[2] or \nolinebreak[2] +\@highpenalty 301 % Produced by \nopagebreak[3] or \nolinebreak[3] + +\@beginparpenalty -\@lowpenalty % Before a list or paragraph environment. +\@endparpenalty -\@lowpenalty % After a list or paragraph environment. +\@itempenalty -\@lowpenalty % Between list items. + +%\@namedef{ds@10pt}{\@latexerr{The `10pt' option is not allowed in the `acmconf' +\@namedef{ds@10pt}{\ClassError{The `10pt' option is not allowed in the `acmconf' % January 2008 + document style.}\@eha} +%\@namedef{ds@11pt}{\@latexerr{The `11pt' option is not allowed in the `acmconf' +\@namedef{ds@11pt}{\ClassError{The `11pt' option is not allowed in the `acmconf' % January 2008 + document style.}\@eha} +%\@namedef{ds@12pt}{\@latexerr{The `12pt' option is not allowed in the `acmconf' +\@namedef{ds@12pt}{\ClassError{The `12pt' option is not allowed in the `acmconf' % January 2008 + document style.}\@eha} + +\@options + +\lineskip 2pt % \lineskip is 1pt for all font sizes. +\normallineskip 2pt +\def\baselinestretch{1} + +\abovedisplayskip 9pt plus2pt minus4.5pt% +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip \z@ plus3pt% +\belowdisplayshortskip 5.4pt plus3pt minus3pt% +\let\@listi\@listI % Setting of \@listi added 9 Jun 87 + +\def\small{\@setsize\small{9pt}\viiipt\@viiipt +\abovedisplayskip 7.6pt plus 3pt minus 4pt% +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip \z@ plus2pt% +\belowdisplayshortskip 3.6pt plus2pt minus 2pt +\def\@listi{\leftmargin\leftmargini %% Added 22 Dec 87 +\topsep 4pt plus 2pt minus 2pt\parsep 2pt plus 1pt minus 1pt +\itemsep \parsep}} + +\def\footnotesize{\@setsize\footnotesize{9pt}\ixpt\@ixpt +\abovedisplayskip 6.4pt plus 2pt minus 4pt% +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip \z@ plus 1pt% +\belowdisplayshortskip 2.7pt plus 1pt minus 2pt +\def\@listi{\leftmargin\leftmargini %% Added 22 Dec 87 +\topsep 3pt plus 1pt minus 1pt\parsep 2pt plus 1pt minus 1pt +\itemsep \parsep}} + +\newcount\aucount +\newcount\originalaucount +\newdimen\auwidth +\auwidth=\textwidth +\newdimen\auskip +\newcount\auskipcount +\newdimen\auskip +\global\auskip=1pc +\newdimen\allauboxes +\allauboxes=\auwidth +\newtoks\addauthors +\newcount\addauflag +\global\addauflag=0 %Haven't shown additional authors yet + +\newtoks\subtitletext +\gdef\subtitle#1{\subtitletext={#1}} + +\gdef\additionalauthors#1{\addauthors={#1}} + +\gdef\numberofauthors#1{\global\aucount=#1 +\ifnum\aucount>3\global\originalaucount=\aucount \global\aucount=3\fi %g} % 3 OK - Gerry March 2007 +\global\auskipcount=\aucount\global\advance\auskipcount by 1 +\global\multiply\auskipcount by 2 +\global\multiply\auskip by \auskipcount +\global\advance\auwidth by -\auskip +\global\divide\auwidth by \aucount} + +% \and was modified to count the number of authors. GKMT 12 Aug 1999 +\def\alignauthor{% % \begin{tabular} +\end{tabular}% + \begin{tabular}[t]{p{\auwidth}}\centering}% + +% *** NOTE *** NOTE *** NOTE *** NOTE *** +% If you have 'font problems' then you may need +% to change these, e.g. 'arialb' instead of "arialbd". +% Gerry Murray 11/11/1999 +% *** OR ** comment out block A and activate block B or vice versa. +% ********************************************** +% +% -- Start of block A -- (Type 1 or Truetype fonts) +%\newfont{\secfnt}{timesbd at 12pt} % was timenrb originally - now is timesbd +%\newfont{\secit}{timesbi at 12pt} %13 Jan 00 gkmt +%\newfont{\subsecfnt}{timesi at 11pt} % was timenrri originally - now is timesi +%\newfont{\subsecit}{timesbi at 11pt} % 13 Jan 00 gkmt -- was times changed to timesbi gm 2/4/2000 +% % because "normal" is italic, "italic" is Roman +%\newfont{\ttlfnt}{arialbd at 18pt} % was arialb originally - now is arialbd +%\newfont{\ttlit}{arialbi at 18pt} % 13 Jan 00 gkmt +%\newfont{\subttlfnt}{arial at 14pt} % was arialr originally - now is arial +%\newfont{\subttlit}{ariali at 14pt} % 13 Jan 00 gkmt +%\newfont{\subttlbf}{arialbd at 14pt} % 13 Jan 00 gkmt +%\newfont{\aufnt}{arial at 12pt} % was arialr originally - now is arial +%\newfont{\auit}{ariali at 12pt} % 13 Jan 00 gkmt +%\newfont{\affaddr}{arial at 10pt} % was arialr originally - now is arial +%\newfont{\affaddrit}{ariali at 10pt} %13 Jan 00 gkmt +%\newfont{\eaddfnt}{arial at 12pt} % was arialr originally - now is arial +%\newfont{\ixpt}{times at 9pt} % was timenrr originally - now is times +%\newfont{\confname}{timesi at 8pt} % was timenrri - now is timesi +%\newfont{\crnotice}{times at 8pt} % was timenrr originally - now is times +%\newfont{\ninept}{times at 9pt} % was timenrr originally - now is times + +% ********************************************* +% -- End of block A -- +% +% +% -- Start of block B -- UPDATED FONT NAMES +% ********************************************* +% Gerry Murray 11/30/2006 +% ********************************************* +\newfont{\secfnt}{ptmb8t at 12pt} +\newfont{\secit}{ptmbi8t at 12pt} %13 Jan 00 gkmt +\newfont{\subsecfnt}{ptmri8t at 11pt} +\newfont{\subsecit}{ptmbi8t at 11pt} % +\newfont{\ttlfnt}{phvb8t at 18pt} +\newfont{\ttlit}{phvbo8t at 18pt} % GM 2/4/2000 +\newfont{\subttlfnt}{phvr8t at 14pt} +\newfont{\subttlit}{phvro8t at 14pt} % GM 2/4/2000 +\newfont{\subttlbf}{phvb8t at 14pt} % 13 Jan 00 gkmt +\newfont{\aufnt}{phvr8t at 12pt} +\newfont{\auit}{phvro8t at 12pt} % GM 2/4/2000 +\newfont{\affaddr}{phvr8t at 10pt} +\newfont{\affaddrit}{phvro8t at 10pt} % GM 2/4/2000 +\newfont{\eaddfnt}{phvr8t at 12pt} +\newfont{\ixpt}{ptmr8t at 9pt} +\newfont{\confname}{ptmri8t at 8pt} +\newfont{\crnotice}{ptmr8t at 8pt} +\newfont{\ninept}{ptmr8t at 9pt} +% +++++++++++++++++++++++++++++++++++++++++++++ +% -- End of block B -- + +%\def\email#1{{{\eaddfnt{\vskip 4pt#1}}}} +% If we have an email, inside a "shared affiliation" then we need the following instead +\def\email#1{{{\eaddfnt{\par #1}}}} % revised - GM - 11/30/2006 + +\def\addauthorsection{\ifnum\originalaucount>6 % was 3 - Gerry March 2007 + \section{Additional Authors}\the\addauthors + \fi} + +\newcount\savesection +\newcount\sectioncntr +\global\sectioncntr=1 + +\setcounter{secnumdepth}{3} + +\def\appendix{\par +\section*{APPENDIX} +\setcounter{section}{0} + \setcounter{subsection}{0} + \def\thesection{\Alph{section}} } + +\leftmargini 22.5pt +\leftmarginii 19.8pt % > \labelsep + width of '(m)' +\leftmarginiii 16.8pt % > \labelsep + width of 'vii.' +\leftmarginiv 15.3pt % > \labelsep + width of 'M.' +\leftmarginv 9pt +\leftmarginvi 9pt + +\leftmargin\leftmargini +\labelsep 4.5pt +\labelwidth\leftmargini\advance\labelwidth-\labelsep + +\def\@listI{\leftmargin\leftmargini \parsep 3.6pt plus 2pt minus 1pt% +\topsep 7.2pt plus 2pt minus 4pt% +\itemsep 3.6pt plus 2pt minus 1pt} + +\let\@listi\@listI +\@listi + +\def\@listii{\leftmargin\leftmarginii + \labelwidth\leftmarginii\advance\labelwidth-\labelsep + \topsep 3.6pt plus 2pt minus 1pt + \parsep 1.8pt plus 0.9pt minus 0.9pt + \itemsep \parsep} + +\def\@listiii{\leftmargin\leftmarginiii + \labelwidth\leftmarginiii\advance\labelwidth-\labelsep + \topsep 1.8pt plus 0.9pt minus 0.9pt + \parsep \z@ \partopsep 1pt plus 0pt minus 1pt + \itemsep \topsep} + +\def\@listiv{\leftmargin\leftmarginiv + \labelwidth\leftmarginiv\advance\labelwidth-\labelsep} + +\def\@listv{\leftmargin\leftmarginv + \labelwidth\leftmarginv\advance\labelwidth-\labelsep} + +\def\@listvi{\leftmargin\leftmarginvi + \labelwidth\leftmarginvi\advance\labelwidth-\labelsep} + +\def\labelenumi{\theenumi.} +\def\theenumi{\arabic{enumi}} + +\def\labelenumii{(\theenumii)} +\def\theenumii{\alph{enumii}} +\def\p@enumii{\theenumi} + +\def\labelenumiii{\theenumiii.} +\def\theenumiii{\roman{enumiii}} +\def\p@enumiii{\theenumi(\theenumii)} + +\def\labelenumiv{\theenumiv.} +\def\theenumiv{\Alph{enumiv}} +\def\p@enumiv{\p@enumiii\theenumiii} + +\def\labelitemi{$\bullet$} +\def\labelitemii{\bf --} +\def\labelitemiii{$\ast$} +\def\labelitemiv{$\cdot$} + +\def\verse{\let\\=\@centercr + \list{}{\itemsep\z@ \itemindent -1.5em\listparindent \itemindent + \rightmargin\leftmargin\advance\leftmargin 1.5em}\item[]} +\let\endverse\endlist + +\def\quotation{\list{}{\listparindent 1.5em + \itemindent\listparindent + \rightmargin\leftmargin \parsep 0pt plus 1pt}\item[]} +\let\endquotation=\endlist + +\def\quote{\list{}{\rightmargin\leftmargin}\item[]} +\let\endquote=\endlist + +\def\descriptionlabel#1{\hspace\labelsep \bf #1} +\def\description{\list{}{\labelwidth\z@ \itemindent-\leftmargin + \let\makelabel\descriptionlabel}} + +\let\enddescription\endlist + +\def\theequation{\arabic{equation}} + +\arraycolsep 4.5pt % Half the space between columns in an array environment. +\tabcolsep 5.4pt % Half the space between columns in a tabular environment. +\arrayrulewidth .5pt % Width of rules in array and tabular environment. % (was .4) updated Gerry March 20 2007 +\doublerulesep 1.8pt % Space between adjacent rules in array or tabular env. + +\tabbingsep \labelsep % Space used by the \' command. (See LaTeX manual.) + +\skip\@mpfootins =\skip\footins + +\fboxsep =2.7pt % Space left between box and text by \fbox and \framebox. +\fboxrule =.5pt % Width of rules in box made by \fbox and \framebox. % (was .4) updated Gerry March 20 2007 + +\def\thepart{\Roman{part}} % Roman numeral part numbers. +\def\thesection {\arabic{section}} +\def\thesubsection {\thesection.\arabic{subsection}} +%\def\thesubsubsection {\thesubsection.\arabic{subsubsection}} % GM 7/30/2002 +%\def\theparagraph {\thesubsubsection.\arabic{paragraph}} % GM 7/30/2002 +\def\thesubparagraph {\theparagraph.\arabic{subparagraph}} + +\def\@pnumwidth{1.55em} +\def\@tocrmarg {2.55em} +\def\@dotsep{4.5} +\setcounter{tocdepth}{3} + +%\def\tableofcontents{\@latexerr{\tableofcontents: Tables of contents are not +% allowed in the `acmconf' document style.}\@eha} + +\def\tableofcontents{\ClassError{% + \string\tableofcontents\space is not allowed in the `acmconf' document % January 2008 + style}\@eha} + +\def\l@part#1#2{\addpenalty{\@secpenalty} + \addvspace{2.25em plus 1pt} % space above part line + \begingroup + \@tempdima 3em % width of box holding part number, used by + \parindent \z@ \rightskip \@pnumwidth %% \numberline + \parfillskip -\@pnumwidth + {\large \bf % set line in \large boldface + \leavevmode % TeX command to enter horizontal mode. + #1\hfil \hbox to\@pnumwidth{\hss #2}}\par + \nobreak % Never break after part entry + \endgroup} + +\def\l@section#1#2{\addpenalty{\@secpenalty} % good place for page break + \addvspace{1.0em plus 1pt} % space above toc entry + \@tempdima 1.5em % width of box holding section number + \begingroup + \parindent \z@ \rightskip \@pnumwidth + \parfillskip -\@pnumwidth + \bf % Boldface. + \leavevmode % TeX command to enter horizontal mode. + \advance\leftskip\@tempdima %% added 5 Feb 88 to conform to + \hskip -\leftskip %% 25 Jan 88 change to \numberline + #1\nobreak\hfil \nobreak\hbox to\@pnumwidth{\hss #2}\par + \endgroup} + + +\def\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}} +\def\l@subsubsection{\@dottedtocline{3}{3.8em}{3.2em}} +\def\l@paragraph{\@dottedtocline{4}{7.0em}{4.1em}} +\def\l@subparagraph{\@dottedtocline{5}{10em}{5em}} + +%\def\listoffigures{\@latexerr{\listoffigures: Lists of figures are not +% allowed in the `acmconf' document style.}\@eha} + +\def\listoffigures{\ClassError{% + \string\listoffigures\space is not allowed in the `acmconf' document % January 2008 + style}\@eha} + +\def\l@figure{\@dottedtocline{1}{1.5em}{2.3em}} + +%\def\listoftables{\@latexerr{\listoftables: Lists of tables are not +% allowed in the `acmconf' document style.}\@eha} +%\let\l@table\l@figure + +\def\listoftables{\ClassError{% + \string\listoftables\space is not allowed in the `acmconf' document % January 2008 + style}\@eha} + \let\l@table\l@figure + +\def\footnoterule{\kern-3\p@ + \hrule width .5\columnwidth % (was .4) updated Gerry March 20 2007 + \kern 2.6\p@} % The \hrule has default height of .4pt % (was .4) updated Gerry March 20 2007 +% ------ +\long\def\@makefntext#1{\noindent +%\hbox to .5em{\hss$^{\@thefnmark}$}#1} % original +\hbox to .5em{\hss\textsuperscript{\@thefnmark}}#1} % C. Clifton / GM Oct. 2nd. 2002 +% ------- + +\long\def\@maketntext#1{\noindent +#1} + +\long\def\@maketitlenotetext#1#2{\noindent + \hbox to 1.8em{\hss$^{#1}$}#2} + +\setcounter{topnumber}{2} +\def\topfraction{.7} +\setcounter{bottomnumber}{1} +\def\bottomfraction{.3} +\setcounter{totalnumber}{3} +\def\textfraction{.2} +\def\floatpagefraction{.5} +\setcounter{dbltopnumber}{2} +\def\dbltopfraction{.7} +\def\dblfloatpagefraction{.5} + +% +\long\def\@makecaption#1#2{ + \vskip \baselineskip + \setbox\@tempboxa\hbox{\textbf{#1: #2}} + \ifdim \wd\@tempboxa >\hsize % IF longer than one line: + \textbf{#1: #2}\par % THEN set as ordinary paragraph. + \else % ELSE center. + \hbox to\hsize{\hfil\box\@tempboxa\hfil}\par + \fi} + +% + +\long\def\@makecaption#1#2{ + \vskip 10pt + \setbox\@tempboxa\hbox{\textbf{#1: #2}} + \ifdim \wd\@tempboxa >\hsize % IF longer than one line: + \textbf{#1: #2}\par % THEN set as ordinary paragraph. + \else % ELSE center. + \hbox to\hsize{\hfil\box\@tempboxa\hfil} + \fi} + +\@ifundefined{figure}{\newcounter {figure}} % this is for LaTeX2e + +\def\fps@figure{tbp} +\def\ftype@figure{1} +\def\ext@figure{lof} +\def\fnum@figure{Figure \thefigure} +\def\figure{\@float{figure}} +%\let\endfigure\end@float +\def\endfigure{\end@float} % Gerry January 2008 +\@namedef{figure*}{\@dblfloat{figure}} +\@namedef{endfigure*}{\end@dblfloat} + +\@ifundefined{table}{\newcounter {table}} % this is for LaTeX2e + +\def\fps@table{tbp} +\def\ftype@table{2} +\def\ext@table{lot} +\def\fnum@table{Table \thetable} +\def\table{\@float{table}} +%\let\endtable\end@float +\def\endtable{\end@float} % Gerry January 2008 +\@namedef{table*}{\@dblfloat{table}} +\@namedef{endtable*}{\end@dblfloat} + +\newtoks\titleboxnotes +\newcount\titleboxnoteflag + +\def\maketitle{\par + \begingroup + \def\thefootnote{\fnsymbol{footnote}} + \def\@makefnmark{\hbox + to 0pt{$^{\@thefnmark}$\hss}} + \twocolumn[\@maketitle] +\@thanks + \endgroup + \setcounter{footnote}{0} + \let\maketitle\relax + \let\@maketitle\relax + \gdef\@thanks{}\gdef\@author{}\gdef\@title{}\gdef\@subtitle{}\let\thanks\relax + \@copyrightspace} + +%% CHANGES ON NEXT LINES +\newif\if@ll % to record which version of LaTeX is in use + +\expandafter\ifx\csname LaTeXe\endcsname\relax % LaTeX2.09 is used +\else% LaTeX2e is used, so set ll to true +\global\@lltrue +\fi + +\if@ll + \NeedsTeXFormat{LaTeX2e} + \ProvidesClass{sig-alternate} [2012/05/23 - V2.5 - based on acmproc.cls V1.3 ] + \RequirePackage{latexsym}% QUERY: are these two really needed? + \let\dooptions\ProcessOptions +\else + \let\dooptions\@options +\fi +%% END CHANGES + +\def\@height{height} +\def\@width{width} +\def\@minus{minus} +\def\@plus{plus} +\def\hb@xt@{\hbox to} +\newif\if@faircopy +\@faircopyfalse +\def\ds@faircopy{\@faircopytrue} + +\def\ds@preprint{\@faircopyfalse} + +\@twosidetrue +\@mparswitchtrue +\def\ds@draft{\overfullrule 5\p@} +%% CHANGE ON NEXT LINE +\dooptions + +\lineskip \p@ +\normallineskip \p@ +\def\baselinestretch{1} +\def\@ptsize{0} %needed for amssymbols.sty + +%% CHANGES ON NEXT LINES +\if@ll% allow use of old-style font change commands in LaTeX2e +\@maxdepth\maxdepth +% +\DeclareOldFontCommand{\rm}{\ninept\rmfamily}{\mathrm} +\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} +\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} +\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} +\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} +\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl} +\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc} +\DeclareRobustCommand*{\cal}{\@fontswitch{\relax}{\mathcal}} +\DeclareRobustCommand*{\mit}{\@fontswitch{\relax}{\mathnormal}} +\fi +% +\if@ll + \renewcommand{\rmdefault}{cmr} % was 'ttm' +% Note! I have also found 'mvr' to work ESPECIALLY well. +% Gerry - October 1999 +% You may need to change your LV1times.fd file so that sc is +% mapped to cmcsc - -for smallcaps -- that is if you decide +% to change {cmr} to {times} above. (Not recommended) + \renewcommand{\@ptsize}{} + \renewcommand{\normalsize}{% + \@setfontsize\normalsize\@ixpt{10.5\p@}%\ninept% + \abovedisplayskip 6\p@ \@plus2\p@ \@minus\p@ + \belowdisplayskip \abovedisplayskip + \abovedisplayshortskip 6\p@ \@minus 3\p@ + \belowdisplayshortskip 6\p@ \@minus 3\p@ + \let\@listi\@listI + } +\else + \def\@normalsize{%changed next to 9 from 10 + \@setsize\normalsize{9\p@}\ixpt\@ixpt + \abovedisplayskip 6\p@ \@plus2\p@ \@minus\p@ + \belowdisplayskip \abovedisplayskip + \abovedisplayshortskip 6\p@ \@minus 3\p@ + \belowdisplayshortskip 6\p@ \@minus 3\p@ + \let\@listi\@listI + }% +\fi +\if@ll + \newcommand\scriptsize{\@setfontsize\scriptsize\@viipt{8\p@}} + \newcommand\tiny{\@setfontsize\tiny\@vpt{6\p@}} + \newcommand\large{\@setfontsize\large\@xiipt{14\p@}} + \newcommand\Large{\@setfontsize\Large\@xivpt{18\p@}} + \newcommand\LARGE{\@setfontsize\LARGE\@xviipt{20\p@}} + \newcommand\huge{\@setfontsize\huge\@xxpt{25\p@}} + \newcommand\Huge{\@setfontsize\Huge\@xxvpt{30\p@}} +\else + \def\scriptsize{\@setsize\scriptsize{8\p@}\viipt\@viipt} + \def\tiny{\@setsize\tiny{6\p@}\vpt\@vpt} + \def\large{\@setsize\large{14\p@}\xiipt\@xiipt} + \def\Large{\@setsize\Large{18\p@}\xivpt\@xivpt} + \def\LARGE{\@setsize\LARGE{20\p@}\xviipt\@xviipt} + \def\huge{\@setsize\huge{25\p@}\xxpt\@xxpt} + \def\Huge{\@setsize\Huge{30\p@}\xxvpt\@xxvpt} +\fi +\normalsize + +% make aubox hsize/number of authors up to 3, less gutter +% then showbox gutter showbox gutter showbox -- GKMT Aug 99 +\newbox\@acmtitlebox +\def\@maketitle{\newpage + \null + \setbox\@acmtitlebox\vbox{% +\baselineskip 20pt +\vskip 2em % Vertical space above title. + \begin{center} + {\ttlfnt \@title\par} % Title set in 18pt Helvetica (Arial) bold size. + \vskip 1.5em % Vertical space after title. +%This should be the subtitle. +{\subttlfnt \the\subtitletext\par}\vskip 1.25em%\fi + {\baselineskip 16pt\aufnt % each author set in \12 pt Arial, in a + \lineskip .5em % tabular environment + \begin{tabular}[t]{c}\@author + \end{tabular}\par} + \vskip 1.5em % Vertical space after author. + \end{center}} + \dimen0=\ht\@acmtitlebox + \advance\dimen0 by -12.75pc\relax % Increased space for title box -- KBT + \unvbox\@acmtitlebox + \ifdim\dimen0<0.0pt\relax\vskip-\dimen0\fi} + + +\newcount\titlenotecount +\global\titlenotecount=0 +\newtoks\tntoks +\newtoks\tntokstwo +\newtoks\tntoksthree +\newtoks\tntoksfour +\newtoks\tntoksfive + +\def\abstract{ +\ifnum\titlenotecount>0 % was =1 + \insert\footins{% + \reset@font\footnotesize + \interlinepenalty\interfootnotelinepenalty + \splittopskip\footnotesep + \splitmaxdepth \dp\strutbox \floatingpenalty \@MM + \hsize\columnwidth \@parboxrestore + \protected@edef\@currentlabel{% + }% + \color@begingroup +\ifnum\titlenotecount=1 + \@maketntext{% + \raisebox{4pt}{$\ast$}\rule\z@\footnotesep\ignorespaces\the\tntoks\@finalstrut\strutbox}% +\fi +\ifnum\titlenotecount=2 + \@maketntext{% + \raisebox{4pt}{$\ast$}\rule\z@\footnotesep\ignorespaces\the\tntoks\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\dagger$}\rule\z@\footnotesep\ignorespaces\the\tntokstwo\@finalstrut\strutbox}% +\fi +\ifnum\titlenotecount=3 + \@maketntext{% + \raisebox{4pt}{$\ast$}\rule\z@\footnotesep\ignorespaces\the\tntoks\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\dagger$}\rule\z@\footnotesep\ignorespaces\the\tntokstwo\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\ddagger$}\rule\z@\footnotesep\ignorespaces\the\tntoksthree\@finalstrut\strutbox}% +\fi +\ifnum\titlenotecount=4 + \@maketntext{% + \raisebox{4pt}{$\ast$}\rule\z@\footnotesep\ignorespaces\the\tntoks\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\dagger$}\rule\z@\footnotesep\ignorespaces\the\tntokstwo\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\ddagger$}\rule\z@\footnotesep\ignorespaces\the\tntoksthree\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\S$}\rule\z@\footnotesep\ignorespaces\the\tntoksfour\@finalstrut\strutbox}% +\fi +\ifnum\titlenotecount=5 + \@maketntext{% + \raisebox{4pt}{$\ast$}\rule\z@\footnotesep\ignorespaces\the\tntoks\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\dagger$}\rule\z@\footnotesep\ignorespaces\the\tntokstwo\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\ddagger$}\rule\z@\footnotesep\ignorespaces\the\tntoksthree\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\S$}\rule\z@\footnotesep\ignorespaces\the\tntoksfour\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\P$}\rule\z@\footnotesep\ignorespaces\the\tntoksfive\@finalstrut\strutbox}% +\fi + \color@endgroup} %g} +\fi +\setcounter{footnote}{0} +\section*{ABSTRACT}\normalsize%\ninept +} + +\def\endabstract{\if@twocolumn\else\endquotation\fi} + +\def\keywords{\if@twocolumn +\section*{Keywords} +\else \small +\quotation +\fi} + +\def\terms{\if@twocolumn +\section*{General Terms} +\else \small +\quotation +\fi} + +% -- Classification needs to be a bit smart due to optionals - Gerry/Georgia November 2nd. 1999 +\newcount\catcount +\global\catcount=1 + +\def\category#1#2#3{% +\ifnum\catcount=1 +\section*{Categories and Subject Descriptors} +\advance\catcount by 1\else{\unskip; }\fi + \@ifnextchar [{\@category{#1}{#2}{#3}}{\@category{#1}{#2}{#3}[]}% +} + +\def\@category#1#2#3[#4]{% + \begingroup + \let\and\relax + #1 [\textbf{#2}]% + \if!#4!% + \if!#3!\else : #3\fi + \else + :\space + \if!#3!\else #3\kern\z@---\hskip\z@\fi + \textit{#4}% + \fi + \endgroup +} +% + +%%% This section (written by KBT) handles the 1" box in the lower left +%%% corner of the left column of the first page by creating a picture, +%%% and inserting the predefined string at the bottom (with a negative +%%% displacement to offset the space allocated for a non-existent +%%% caption). +%%% +\newtoks\copyrightnotice +\def\ftype@copyrightbox{8} +\def\@copyrightspace{ +\@float{copyrightbox}[b] +\begin{center} +\setlength{\unitlength}{1pc} +\begin{picture}(20,6) %Space for copyright notice +\put(0,-0.95){\crnotice{\@toappear}} +\end{picture} +\end{center} +\end@float} + +\def\@toappear{} % Default setting blank - commands below change this. +\long\def\toappear#1{\def\@toappear{\parbox[b]{20pc}{\baselineskip 9pt#1}}} +\def\toappearbox#1{\def\@toappear{\raisebox{5pt}{\framebox[20pc]{\parbox[b]{19pc}{#1}}}}} + +\newtoks\conf +\newtoks\confinfo +\def\conferenceinfo#1#2{\global\conf={#1}\global\confinfo{#2}} + + +%\def\marginpar{\@latexerr{The \marginpar command is not allowed in the +% `acmconf' document style.}\@eha} + +\def\marginpar{\ClassError{% + \string\marginpar\space is not allowed in the `acmconf' document % January 2008 + style}\@eha} + +\mark{{}{}} % Initializes TeX's marks + +\def\today{\ifcase\month\or + January\or February\or March\or April\or May\or June\or + July\or August\or September\or October\or November\or December\fi + \space\number\day, \number\year} + +\def\@begintheorem#1#2{% + \parskip 0pt % GM July 2000 (for tighter spacing) + \trivlist + \item[% + \hskip 10\p@ + \hskip \labelsep + {{\sc #1}\hskip 5\p@\relax#2.}% + ] + \it +} +\def\@opargbegintheorem#1#2#3{% + \parskip 0pt % GM July 2000 (for tighter spacing) + \trivlist + \item[% + \hskip 10\p@ + \hskip \labelsep + {\sc #1\ #2\ % This mod by Gerry to enumerate corollaries + \setbox\@tempboxa\hbox{(#3)} % and bracket the 'corollary title' + \ifdim \wd\@tempboxa>\z@ % and retain the correct numbering of e.g. theorems + \hskip 5\p@\relax % if they occur 'around' said corollaries. + \box\@tempboxa % Gerry - Nov. 1999. + \fi.}% + ] + \it +} +\newif\if@qeded +\global\@qededfalse + +% -- original +%\def\proof{% +% \vspace{-\parskip} % GM July 2000 (for tighter spacing) +% \global\@qededfalse +% \@ifnextchar[{\@xproof}{\@proof}% +%} +% -- end of original + +% (JSS) Fix for vertical spacing bug - Gerry Murray July 30th. 2002 +\def\proof{% +\vspace{-\lastskip}\vspace{-\parsep}\penalty-51% +\global\@qededfalse +\@ifnextchar[{\@xproof}{\@proof}% +} + +\def\endproof{% + \if@qeded\else\qed\fi + \endtrivlist +} +\def\@proof{% + \trivlist + \item[% + \hskip 10\p@ + \hskip \labelsep + {\sc Proof.}% + ] + \ignorespaces +} +\def\@xproof[#1]{% + \trivlist + \item[\hskip 10\p@\hskip \labelsep{\sc Proof #1.}]% + \ignorespaces +} +\def\qed{% + \unskip + \kern 10\p@ + \begingroup + \unitlength\p@ + \linethickness{.4\p@}% + \framebox(6,6){}% + \endgroup + \global\@qededtrue +} + +\def\newdef#1#2{% + \expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}% + \expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}% + \global\@namedef{#1}{\@defthm{#1}{#2}}% + \global\@namedef{end#1}{\@endtheorem}% + }% +} +\def\@defthm#1#2{% + \refstepcounter{#1}% + \@ifnextchar[{\@ydefthm{#1}{#2}}{\@xdefthm{#1}{#2}}% +} +\def\@xdefthm#1#2{% + \@begindef{#2}{\csname the#1\endcsname}% + \ignorespaces +} +\def\@ydefthm#1#2[#3]{% + \trivlist + \item[% + \hskip 10\p@ + \hskip \labelsep + {\it #2% +% \savebox\@tempboxa{#3}% + \saveb@x\@tempboxa{#3}% % January 2008 + \ifdim \wd\@tempboxa>\z@ + \ \box\@tempboxa + \fi.% + }]% + \ignorespaces +} +\def\@begindef#1#2{% + \trivlist + \item[% + \hskip 10\p@ + \hskip \labelsep + {\it #1\ \rm #2.}% + ]% +} +\def\theequation{\arabic{equation}} + +\newcounter{part} +\newcounter{section} +\newcounter{subsection}[section] +\newcounter{subsubsection}[subsection] +\newcounter{paragraph}[subsubsection] +\def\thepart{\Roman{part}} +\def\thesection{\arabic{section}} +\def\thesubsection{\thesection.\arabic{subsection}} +\def\thesubsubsection{\thesubsection.\arabic{subsubsection}} %removed \subsecfnt 29 July 2002 gkmt +\def\theparagraph{\thesubsubsection.\arabic{paragraph}} %removed \subsecfnt 29 July 2002 gkmt +\newif\if@uchead +\@ucheadfalse + +%% CHANGES: NEW NOTE +%% NOTE: OK to use old-style font commands below, since they were +%% suitably redefined for LaTeX2e +%% END CHANGES +\setcounter{secnumdepth}{3} +\def\part{% + \@startsection{part}{9}{\z@}{-10\p@ \@plus -4\p@ \@minus -2\p@} + {4\p@}{\normalsize\@ucheadtrue}% +} +\def\section{% + \@startsection{section}{1}{\z@}{-10\p@ \@plus -4\p@ \@minus -2\p@}% GM + {4\p@}{\baselineskip 14pt\secfnt\@ucheadtrue}% +} + +\def\subsection{% + \@startsection{subsection}{2}{\z@}{-8\p@ \@plus -2\p@ \@minus -\p@} + {4\p@}{\secfnt}% +} +\def\subsubsection{% + \@startsection{subsubsection}{3}{\z@}{-8\p@ \@plus -2\p@ \@minus -\p@}% + {4\p@}{\subsecfnt}% +} +%\def\paragraph{% +% \vskip 12pt\@startsection{paragraph}{3}{\z@}{6\p@ \@plus \p@}% original +% {-5\p@}{\subsecfnt}% +%} +% If one wants sections, subsections and subsubsections numbered, +% but not paragraphs, one usually sets secnumepth to 3. +% For that, the "depth" of paragraphs must be given correctly +% in the definition (``4'' instead of ``3'' as second argument +% of @startsection): +\def\paragraph{% + \vskip 12pt\@startsection{paragraph}{4}{\z@}{6\p@ \@plus \p@}% % GM and Wolfgang May - 11/30/06 + {-5\p@}{\subsecfnt}% +} +\let\@period=. +\def\@startsection#1#2#3#4#5#6{% + \if@noskipsec %gkmt, 11 aug 99 + \global\let\@period\@empty + \leavevmode + \global\let\@period.% + \fi + \par % + \@tempskipa #4\relax + \@afterindenttrue + \ifdim \@tempskipa <\z@ + \@tempskipa -\@tempskipa + \@afterindentfalse + \fi + \if@nobreak + \everypar{}% + \else + \addpenalty\@secpenalty + \addvspace\@tempskipa + \fi +\parskip=0pt % GM July 2000 (non numbered) section heads + \@ifstar + {\@ssect{#3}{#4}{#5}{#6}} + {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}% +} +\def\@sect#1#2#3#4#5#6[#7]#8{% + \ifnum #2>\c@secnumdepth + \let\@svsec\@empty + \else + \refstepcounter{#1}% + \edef\@svsec{% + \begingroup + %\ifnum#2>2 \noexpand\rm \fi % changed to next 29 July 2002 gkmt + \ifnum#2>2 \noexpand#6 \fi + \csname the#1\endcsname + \endgroup + \ifnum #2=1\relax .\fi + \hskip 1em + }% + \fi + \@tempskipa #5\relax + \ifdim \@tempskipa>\z@ + \begingroup + #6\relax + \@hangfrom{\hskip #3\relax\@svsec}% + \begingroup + \interlinepenalty \@M + \if@uchead + \uppercase{#8}% + \else + #8% + \fi + \par + \endgroup + \endgroup + \csname #1mark\endcsname{#7}% + \vskip -12pt %gkmt, 11 aug 99 and GM July 2000 (was -14) - numbered section head spacing +\addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname}% + \fi + #7% + }% + \else + \def\@svsechd{% + #6% + \hskip #3\relax + \@svsec + \if@uchead + \uppercase{#8}% + \else + #8% + \fi + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname}% + \fi + #7% + }% + }% + \fi + \@xsect{#5}\hskip 1pt + \par +} +\def\@xsect#1{% + \@tempskipa #1\relax + \ifdim \@tempskipa>\z@ + \par + \nobreak + \vskip \@tempskipa + \@afterheading + \else + \global\@nobreakfalse + \global\@noskipsectrue + \everypar{% + \if@noskipsec + \global\@noskipsecfalse + \clubpenalty\@M + \hskip -\parindent + \begingroup + \@svsechd + \@period + \endgroup + \unskip + \@tempskipa #1\relax + \hskip -\@tempskipa + \else + \clubpenalty \@clubpenalty + \everypar{}% + \fi + }% + \fi + \ignorespaces +} +\def\@trivlist{% + \@topsepadd\topsep + \if@noskipsec + \global\let\@period\@empty + \leavevmode + \global\let\@period.% + \fi + \ifvmode + \advance\@topsepadd\partopsep + \else + \unskip + \par + \fi + \if@inlabel + \@noparitemtrue + \@noparlisttrue + \else + \@noparlistfalse + \@topsep\@topsepadd + \fi + \advance\@topsep \parskip + \leftskip\z@skip + \rightskip\@rightskip + \parfillskip\@flushglue + \@setpar{\if@newlist\else{\@@par}\fi} + \global\@newlisttrue + \@outerparskip\parskip +} + +%%% Actually, 'abbrev' works just fine as the default +%%% Bibliography style. + +\typeout{Using 'Abbrev' bibliography style} +\newcommand\bibyear[2]{% + \unskip\quad\ignorespaces#1\unskip + \if#2..\quad \else \quad#2 \fi +} +\newcommand{\bibemph}[1]{{\em#1}} +\newcommand{\bibemphic}[1]{{\em#1\/}} +\newcommand{\bibsc}[1]{{\sc#1}} +\def\@normalcite{% + \def\@cite##1##2{[##1\if@tempswa , ##2\fi]}% +} +\def\@citeNB{% + \def\@cite##1##2{##1\if@tempswa , ##2\fi}% +} +\def\@citeRB{% + \def\@cite##1##2{##1\if@tempswa , ##2\fi]}% +} +\def\start@cite#1#2{% + \edef\citeauthoryear##1##2##3{% + ###1% + \ifnum#2=\z@ \else\ ###2\fi + }% + \ifnum#1=\thr@@ + \let\@@cite\@citeyear + \else + \let\@@cite\@citenormal + \fi + \@ifstar{\@citeNB\@@cite}{\@normalcite\@@cite}% +} +%\def\cite{\start@cite23} +\DeclareRobustCommand\cite{\start@cite23} % January 2008 +\def\citeNP{\cite*} % No Parentheses e.g. 5 +%\def\citeA{\start@cite10} +\DeclareRobustCommand\citeA{\start@cite10} % January 2008 +\def\citeANP{\citeA*} +%\def\shortcite{\start@cite23} +\DeclareRobustCommand\shortcite{\start@cite23} % January 2008 +\def\shortciteNP{\shortcite*} +%\def\shortciteA{\start@cite20} +\DeclareRobustCommand\shortciteA{\start@cite20} % January 2008 +\def\shortciteANP{\shortciteA*} +%\def\citeyear{\start@cite30} +\DeclareRobustCommand\citeyear{\start@cite30} % January 2008 +\def\citeyearNP{\citeyear*} +%\def\citeN{% +\DeclareRobustCommand\citeN{% % January 2008 + \@citeRB + \def\citeauthoryear##1##2##3{##1\ [##3% + \def\reserved@a{##1}% + \def\citeauthoryear####1####2####3{% + \def\reserved@b{####1}% + \ifx\reserved@a\reserved@b + ####3% + \else + \errmessage{Package acmart Error: author mismatch + in \string\citeN^^J^^J% + See the acmart package documentation for explanation}% + \fi + }% + }% + \@ifstar\@citeyear\@citeyear +} +%\def\shortciteN{% +\DeclareRobustCommand\shortciteN{% % January 2008 + \@citeRB + \def\citeauthoryear##1##2##3{##2\ [##3% + \def\reserved@a{##2}% + \def\citeauthoryear####1####2####3{% + \def\reserved@b{####2}% + \ifx\reserved@a\reserved@b + ####3% + \else + \errmessage{Package acmart Error: author mismatch + in \string\shortciteN^^J^^J% + See the acmart package documentation for explanation}% + \fi + }% + }% + \@ifstar\@citeyear\@citeyear % GM July 2000 +} + +\def\@citenormal{% + \@ifnextchar [{\@tempswatrue\@citex;}% +% original {\@tempswafalse\@citex,[]}% was ; Gerry 2/24/00 +{\@tempswafalse\@citex[]}% % GERRY FIX FOR BABEL 3/20/2009 +} + +\def\@citeyear{% + \@ifnextchar [{\@tempswatrue\@citex,}% +% original {\@tempswafalse\@citex,[]}% +{\@tempswafalse\@citex[]}% % GERRY FIX FOR BABEL 3/20/2009 +} + +\def\@citex#1[#2]#3{% + \let\@citea\@empty + \@cite{% + \@for\@citeb:=#3\do{% + \@citea +% original \def\@citea{#1 }% + \def\@citea{#1, }% % GERRY FIX FOR BABEL 3/20/2009 -- SO THAT YOU GET [1, 2] IN THE BODY TEXT + \edef\@citeb{\expandafter\@iden\@citeb}% + \if@filesw + \immediate\write\@auxout{\string\citation{\@citeb}}% + \fi + \@ifundefined{b@\@citeb}{% + {\bf ?}% + \@warning{% + Citation `\@citeb' on page \thepage\space undefined% + }% + }% + {\csname b@\@citeb\endcsname}% + }% + }{#2}% +} +%\let\@biblabel\@gobble % Dec. 2008 - Gerry +% ---- +\def\@biblabelnum#1{[#1]} % Gerry's solution #1 - for Natbib -- April 2009 +\let\@biblabel=\@biblabelnum % Gerry's solution #1 - for Natbib -- April 2009 +\def\newblock{\relax} % Gerry Dec. 2008 +% --- +\newdimen\bibindent +\setcounter{enumi}{1} +\bibindent=0em +\def\thebibliography#1{% +\ifnum\addauflag=0\addauthorsection\global\addauflag=1\fi + \section[References]{% <=== OPTIONAL ARGUMENT ADDED HERE + {References} % was uppercased but this affects pdf bookmarks (SP/GM October 2004) + {\vskip -9pt plus 1pt} % GM Nov. 2006 / GM July 2000 (for somewhat tighter spacing) + \@mkboth{{\refname}}{{\refname}}% + }% + \list{[\arabic{enumi}]}{% + \settowidth\labelwidth{[#1]}% + \leftmargin\labelwidth + \advance\leftmargin\labelsep + \advance\leftmargin\bibindent + \parsep=0pt\itemsep=1pt % GM July 2000 + \itemindent -\bibindent + \listparindent \itemindent + \usecounter{enumi} + }% + \let\newblock\@empty + \raggedright % GM July 2000 + \sloppy + \sfcode`\.=1000\relax +} + + +\gdef\balancecolumns +{\vfill\eject +\global\@colht=\textheight +\global\ht\@cclv=\textheight +} + +\newcount\colcntr +\global\colcntr=0 +%\newbox\savebox +\newbox\saveb@x % January 2008 + +\gdef \@makecol {% +\global\advance\colcntr by 1 +\ifnum\colcntr>2 \global\colcntr=1\fi + \ifvoid\footins + \setbox\@outputbox \box\@cclv + \else + \setbox\@outputbox \vbox{% +\boxmaxdepth \@maxdepth + \@tempdima\dp\@cclv + \unvbox \@cclv + \vskip-\@tempdima + \vskip \skip\footins + \color@begingroup + \normalcolor + \footnoterule + \unvbox \footins + \color@endgroup + }% + \fi + \xdef\@freelist{\@freelist\@midlist}% + \global \let \@midlist \@empty + \@combinefloats + \ifvbox\@kludgeins + \@makespecialcolbox + \else + \setbox\@outputbox \vbox to\@colht {% +\@texttop + \dimen@ \dp\@outputbox + \unvbox \@outputbox + \vskip -\dimen@ + \@textbottom + }% + \fi + \global \maxdepth \@maxdepth +} +\def\titlenote{\@ifnextchar[\@xtitlenote{\stepcounter\@mpfn +\global\advance\titlenotecount by 1 +\ifnum\titlenotecount=1 + \raisebox{9pt}{$\ast$} +\fi +\ifnum\titlenotecount=2 + \raisebox{9pt}{$\dagger$} +\fi +\ifnum\titlenotecount=3 + \raisebox{9pt}{$\ddagger$} +\fi +\ifnum\titlenotecount=4 +\raisebox{9pt}{$\S$} +\fi +\ifnum\titlenotecount=5 +\raisebox{9pt}{$\P$} +\fi + \@titlenotetext +}} + +\long\def\@titlenotetext#1{\insert\footins{% +\ifnum\titlenotecount=1\global\tntoks={#1}\fi +\ifnum\titlenotecount=2\global\tntokstwo={#1}\fi +\ifnum\titlenotecount=3\global\tntoksthree={#1}\fi +\ifnum\titlenotecount=4\global\tntoksfour={#1}\fi +\ifnum\titlenotecount=5\global\tntoksfive={#1}\fi + \reset@font\footnotesize + \interlinepenalty\interfootnotelinepenalty + \splittopskip\footnotesep + \splitmaxdepth \dp\strutbox \floatingpenalty \@MM + \hsize\columnwidth \@parboxrestore + \protected@edef\@currentlabel{% + }% + \color@begingroup + \color@endgroup}} + +%%%%%%%%%%%%%%%%%%%%%%%%% +\ps@plain +\baselineskip=11pt +\let\thepage\relax % For NO page numbers - GM Nov. 30th. 1999 and July 2000 +\def\setpagenumber#1{\global\setcounter{page}{#1}} +%\pagenumbering{arabic} % Arabic page numbers GM July 2000 +\twocolumn % Double column. +\flushbottom % Even bottom -- alas, does not balance columns at end of document +\pagestyle{plain} + +% Need Copyright Year and Copyright Data to be user definable (in .tex file). +% Gerry Nov. 30th. 1999 +\newtoks\copyrtyr +\newtoks\acmcopyr +\newtoks\boilerplate +\global\acmcopyr={X-XXXXX-XX-X/XX/XX} % Default - 5/11/2001 *** Gerry +\global\copyrtyr={20XX} % Default - 3/3/2003 *** Gerry +\def\CopyrightYear#1{\global\copyrtyr{#1}} +\def\crdata#1{\global\acmcopyr{#1}} +\def\permission#1{\global\boilerplate{#1}} +% +\global\boilerplate={Permission to make digital or hard copies of all or part of this work for personal or classroom use is granted without fee provided that copies are not made or distributed for profit or commercial advantage and that copies bear this notice and the full citation on the first page. To copy otherwise, to republish, to post on servers or to redistribute to lists, requires prior specific permission and/or a fee.} +\newtoks\copyrightetc +\global\copyrightetc{Copyright \the\copyrtyr\ ACM \the\acmcopyr\ ...\$15.00} % Gerry changed to 15 May 2012 +\toappear{\the\boilerplate\par +{\confname{\the\conf}} \the\confinfo\par \the\copyrightetc.} +%\DeclareFixedFont{\altcrnotice}{OT1}{tmr}{m}{n}{8} % << patch needed for accenting e.g. Montreal - Gerry, May 2007 +%\DeclareFixedFont{\altconfname}{OT1}{tmr}{m}{it}{8} % << patch needed for accenting in italicized confname - Gerry, May 2007 +% +%{\altconfname{{\the\conf}}} {\altcrnotice\the\confinfo\par} \the\copyrightetc.} % << Gerry, May 2007 +% +% The following section (i.e. 3 .sty inclusions) was added in May 2007 so as to fix the problems that many +% authors were having with accents. Sometimes accents would occur, but the letter-character would be of a different +% font. Conversely the letter-character font would be correct but, e.g. a 'bar' would appear superimposed on the +% character instead of, say, an unlaut/diaresis. Sometimes the letter-character would NOT appear at all. +% Using [T1]{fontenc} outright was not an option as this caused 99% of the authors to 'produce' a Type-3 (bitmapped) +% PDF file - useless for production. +% +% For proper (font) accenting we NEED these packages to be part of the .cls file i.e. 'ae', 'aecompl' and 'aeguil' +% ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +%% This is file `ae.sty' +\def\fileversion{1.3} +\def\filedate{2001/02/12} +\NeedsTeXFormat{LaTeX2e} +%\ProvidesPackage{ae}[\filedate\space\fileversion\space % GM +% Almost European Computer Modern] % GM - keeping the log file clean(er) +\newif\if@ae@slides \@ae@slidesfalse +\DeclareOption{slides}{\@ae@slidestrue} +\ProcessOptions +\fontfamily{aer} +\RequirePackage[T1]{fontenc} +\if@ae@slides + \renewcommand{\sfdefault}{laess} + \renewcommand{\rmdefault}{laess} % no roman + \renewcommand{\ttdefault}{laett} +\else + \renewcommand{\sfdefault}{aess} + \renewcommand{\rmdefault}{aer} + \renewcommand{\ttdefault}{aett} +\fi +\endinput +%% +%% End of file `ae.sty'. +% +% +\def\fileversion{0.9} +\def\filedate{1998/07/23} +\NeedsTeXFormat{LaTeX2e} +%\ProvidesPackage{aecompl}[\filedate\space\fileversion\space % GM +%T1 Complements for AE fonts (D. Roegel)] % GM -- keeping the log file clean(er) + +\def\@ae@compl#1{{\fontencoding{T1}\fontfamily{cmr}\selectfont\symbol{#1}}} +\def\guillemotleft{\@ae@compl{19}} +\def\guillemotright{\@ae@compl{20}} +\def\guilsinglleft{\@ae@compl{14}} +\def\guilsinglright{\@ae@compl{15}} +\def\TH{\@ae@compl{222}} +\def\NG{\@ae@compl{141}} +\def\ng{\@ae@compl{173}} +\def\th{\@ae@compl{254}} +\def\DJ{\@ae@compl{208}} +\def\dj{\@ae@compl{158}} +\def\DH{\@ae@compl{208}} +\def\dh{\@ae@compl{240}} +\def\@perthousandzero{\@ae@compl{24}} +\def\textperthousand{\%\@perthousandzero} +\def\textpertenthousand{\%\@perthousandzero\@perthousandzero} +\endinput +% +% +%% This is file `aeguill.sty' +% This file gives french guillemets (and not guillemots!) +% built with the Polish CMR fonts (default), WNCYR fonts, the LASY fonts +% or with the EC fonts. +% This is useful in conjunction with the ae package +% (this package loads the ae package in case it has not been loaded) +% and with or without the french(le) package. +% +% In order to get the guillemets, it is necessary to either type +% \guillemotleft and \guillemotright, or to use an 8 bit encoding +% (such as ISO-Latin1) which selects these two commands, +% or, if you use the french package (but not the frenchle package), +% to type << or >>. +% +% By default, you get the Polish CMR guillemets; if this package is loaded +% with the `cm' option, you get the LASY guillemets; with `ec,' you +% get the EC guillemets, and with `cyr,' you get the cyrillic guillemets. +% +% In verbatim mode, you always get the EC/TT guillemets. +% +% The default option is interesting in conjunction with PDF, +% because there is a Type 1 version of the Polish CMR fonts +% and these guillemets are very close in shape to the EC guillemets. +% There are no free Type 1 versions of the EC fonts. +% +% Support for Polish CMR guillemets was kindly provided by +% Rolf Niepraschk in version 0.99 (2000/05/22). +% Bernd Raichle provided extensive simplifications to the code +% for version 1.00. +% +% This package is released under the LPPL. +% +% Changes: +% Date version +% 2001/04/12 1.01 the frenchle and french package are now distinguished. +% +\def\fileversion{1.01} +\def\filedate{2001/04/12} +\NeedsTeXFormat{LaTeX2e} +%\ProvidesPackage{aeguill}[2001/04/12 1.01 % % GM +%AE fonts with french guillemets (D. Roegel)] % GM - keeping the log file clean(er) +%\RequirePackage{ae} % GM May 2007 - already embedded here + +\newcommand{\@ae@switch}[4]{#4} +\DeclareOption{ec}{\renewcommand\@ae@switch[4]{#1}} +\DeclareOption{cm}{\renewcommand\@ae@switch[4]{#2}} +\DeclareOption{cyr}{\renewcommand\@ae@switch[4]{#3}} +\DeclareOption{pl}{\renewcommand\@ae@switch[4]{#4}} +\ExecuteOptions{pl} +\ProcessOptions + +% +% Load necessary packages +% +\@ae@switch{% ec + % do nothing +}{% cm + \RequirePackage{latexsym}% GM - May 2007 - already 'mentioned as required' up above +}{% cyr + \RequirePackage[OT2,T1]{fontenc}% +}{% pl + \RequirePackage[OT4,T1]{fontenc}% +} + +% The following command will be compared to \frenchname, +% as defined in french.sty and frenchle.sty. +\def\aeguillfrenchdefault{french}% + +\let\guill@verbatim@font\verbatim@font +\def\verbatim@font{\guill@verbatim@font\ecguills{cmtt}% + \let\guillemotleft\@oguills\let\guillemotright\@fguills} + +\begingroup \catcode`\<=13 \catcode`\>=13 +\def\x{\endgroup + \def\ae@lfguill{<<}% + \def\ae@rfguill{>>}% +}\x + +\newcommand{\ecguills}[1]{% + \def\selectguillfont{\fontencoding{T1}\fontfamily{#1}\selectfont}% + \def\@oguills{{\selectguillfont\symbol{19}}}% + \def\@fguills{{\selectguillfont\symbol{20}}}% + } + +\newcommand{\aeguills}{% + \ae@guills + % We redefine \guillemotleft and \guillemotright + % in order to catch them when they are used + % with \DeclareInputText (in latin1.def for instance) + % We use \auxWARNINGi as a safe indicator that french.sty is used. + \gdef\guillemotleft{\ifx\auxWARNINGi\undefined + \@oguills % neither french.sty nor frenchle.sty + \else + \ifx\aeguillfrenchdefault\frenchname + \ae@lfguill % french.sty + \else + \@oguills % frenchle.sty + \fi + \fi}% + \gdef\guillemotright{\ifx\auxWARNINGi\undefined + \@fguills % neither french.sty nor frenchle.sty + \else + \ifx\aeguillfrenchdefault\frenchname + \ae@rfguill % french.sty + \else + \@fguills % frenchle.sty + \fi + \fi}% + } + +% +% Depending on the class option +% define the internal command \ae@guills +\@ae@switch{% ec + \newcommand{\ae@guills}{% + \ecguills{cmr}}% +}{% cm + \newcommand{\ae@guills}{% + \def\selectguillfont{\fontencoding{U}\fontfamily{lasy}% + \fontseries{m}\fontshape{n}\selectfont}% + \def\@oguills{\leavevmode\nobreak + \hbox{\selectguillfont (\kern-.20em(\kern.20em}\nobreak}% + \def\@fguills{\leavevmode\nobreak + \hbox{\selectguillfont \kern.20em)\kern-.2em)}% + \ifdim\fontdimen\@ne\font>\z@\/\fi}}% +}{% cyr + \newcommand{\ae@guills}{% + \def\selectguillfont{\fontencoding{OT2}\fontfamily{wncyr}\selectfont}% + \def\@oguills{{\selectguillfont\symbol{60}}}% + \def\@fguills{{\selectguillfont\symbol{62}}}} +}{% pl + \newcommand{\ae@guills}{% + \def\selectguillfont{\fontencoding{OT4}\fontfamily{cmr}\selectfont}% + \def\@oguills{{\selectguillfont\symbol{174}}}% + \def\@fguills{{\selectguillfont\symbol{175}}}} +} + + +\AtBeginDocument{% + \ifx\GOfrench\undefined + \aeguills + \else + \let\aeguill@GOfrench\GOfrench + \gdef\GOfrench{\aeguill@GOfrench \aeguills}% + \fi + } + +\endinput +% + diff --git a/writeup/speccfg.tex b/writeup/speccfg.tex new file mode 100644 index 0000000..661c778 --- /dev/null +++ b/writeup/speccfg.tex @@ -0,0 +1,17 @@ +\begin{figure} + + +%\paragraph{Default settings} +%\begin{grammar} + +% ::= `=' +%\alt `for' `=' `to' `do' +%\alt `{' `}' +%\alt + +% ::= `;' | + +%\end{grammar} + +\caption{\label{fig:algorithm}\TOOL algorithm} +\end{figure} diff --git a/writeup/specification.tex b/writeup/specification.tex new file mode 100644 index 0000000..6fe0447 --- /dev/null +++ b/writeup/specification.tex @@ -0,0 +1,416 @@ +\mysection{Specification Language Design}\label{sec:specification} + +We begin by overviewing \TOOL's basic approach. The \TOOL +specification language specifies the correctness properties for +concurrent data structures by establishing a correspondence with an +equivalent sequential data structure, which requires: (1) defining the +equivalent sequential data structure; (2) establishing an equivalent +sequential history; (3) relating the behavior of the concurrent +execution to the sequential history; and (4) specifying the +synchronization properties between method invocations. The +specification language has the following key components: + +\mypara{\bf 1. Equivalent Sequential Data Structure:} This component defines a +sequential data structure against which the concurrent data structure +will be checked. + +\mypara{\bf 2. Defining the Equivalent Sequential History:} +For real-world data structures, generally there exist two types of API methods, +\textit{primitive} API methods and \textit{aggregate} API methods. Take +concurrent hashtables as an example, it provides primitive API methods +such as \code{put} and \code{get} that implement the core functionality of the +data structure, and it also has aggregate API methods such +as \code{putAll} that calls primitive API methods internally. From our +experience working with our benchmark set, it is generally possible to +generate a sequential history of primitive API method invocations for +real-world data structures as they generally serialize on a single memory +location --- while it is possible to observe partially completed aggregate +API method invocations. Therefore, our specifications will focus on the +correctness of primitive API methods. + +Borrowing from VYRD~\cite{vyrd} the concept of commit points, we allow +developers to specify \textit{ordering points} --- the specific atomic +operations between method invocation and response events that are used for +ordering method calls. Ordering points are a generalization of the commit +points as they also use memory operations that do not commit the data structure +operation to order method calls. Developers then specify ordering points to +generate the equivalent sequential history. + +\mypara{\bf 3. Specifying Correct Behaviors:} Developers use +the \TOOL specification to provide a set of \textit{side effects} +and \textit{assertions} to describe the desired behavior of each API +method. Side effects capture how a method updates the equivalent +sequential data structure. Assertions include both preconditions and +postconditions which specify what conditions each method must satisfy +before and after the method call, respectively. The specification of +the side effects and assertions may make use of the states of the +equivalent sequential data structure, meaning that these components +can access the internal variables and methods of the equivalent sequential data +structure. Additionally, they can reference the values available at +the method invocation and response, i.e., the parameter values and the +return value. + +\mypara{\bf 4. Synchronization:} The synchronization specification +describes the desired happens before relations between API method +invocations. \TOOL specifications allow developers to specify the +properties at the abstraction of methods. This makes specifications +cleaner, more understandable, and less error-prone because the +properties do not rely on low-level implementation +details. Moreover, \TOOL specifications allow developers to attach +conditions to methods when specifying synchronization properties so +that a method call might synchronize with another only under a +specific condition. For example, consider a spin lock with +a \code{try\_lock()} method, we need to specify that only a +successful \code{try\_lock()} method invocation must synchronize with the +previous \code{unlock()} method invocation. + +Figure~\ref{fig:speccfg} presents the grammar for the \TOOL specification +language. The grammar defines three types of specification annotations: +\textit{structure annotations}, \textit{method annotations}, and +\textit{ordering point annotations}. +In the grammar, \textit{code} means legal C/C++ source code; and +\textit{label} means a legal C/C++ variable name. +Annotations are embedded in C/C++ comments. +This format does not affect the semantics of the original +program and allows for the same source to be used by both a standard C/C++ +compiler to generate production code and for the \TOOL specification compiler to +extract the \TOOL specification from the comments. We discuss these constructs in more detail throughout the remainder of this section. + +\begin{figure}[!tb] +\vspace{-.2cm} +{\scriptsize + \begin{eqnarray*} + \textit{\textbf{structureSpec}} & \rightarrow & \code{"@Structure\_Define"}\\ + && \textit{structureDefine} \ \ \ (\textit{happensBefore})?\\ + \textit{structureDefine} & \rightarrow & +(\code{"@DeclareStruct:"} \ + \textit{code})\text{*}\\ + && \code{"@DeclareVar:"} \ \textit{code}\\ + && \code{"@InitVar:"} \ \textit{code}\\ + && (\code{"@DefineFunc:"} \ \textit{code})\text{*}\\ + \textit{happensBefore} & \rightarrow & \code{"@Happens\_Before:"} \ + (\textit{invocation} \ \code{"->"} \ + \textit{invocation})\textsuperscript{+}\\ + \textit{invocation} & \rightarrow & \textit{label} \ (\ \ \code{"("} \ + \textit{label} \code{")"} \ \ )?\\ + \textit{\textbf{methodSpec}} & \rightarrow & \code{"@Method:"} \ \textit{label}\\ + && \code{"@Ordering\_Point\_Set:"} \ \textit{label} \ (\code{"|"} \ + \textit{label})\text{*}\\ + && (\code{"@HB\_Condition:"} \ \textit{label} \ \code{"::"} \ \textit{code})\text{*}\\ + && (\code{"@ID:"} \ \textit{code})?\\ + && (\code{"@PreCondition:"} \ \textit{code})?\\ + && (\code{"@SideEffect:"} \ \textit{code})?\\ + && (\code{"@PostCondition:"} \ \textit{code})?\\ + \textit{\textbf{potentialOP}} & \rightarrow & \code{"@Potential\_Ordering\_Point:"} \ \textit{code}\\ + && \code{"@Label:"} \ \ \textit{label}\\ + \textit{\textbf{opCheck}} & \rightarrow & \code{"@Ordering\_Point\_Check:"} \ \textit{code}\\ + && \code{"@Potential\_Ordering\_Point\_Label:"} \ \textit{label}\\ + && \code{"@Label:"} \ \ \textit{label}\\ + \textit{\textbf{opLabelCheck}} & \rightarrow & \code{"@Ordering\_Point\_Label\_Check:"} \ \textit{code}\\ + && \code{"@Label:"} \ \ \textit{label}\\ + \textit{\textbf{opClear}} & \rightarrow & \code{"@Ordering\_Point\_Clear:"} \ \textit{code}\\ + && \code{"@Label:"} \ \ \textit{label}\\ + \textit{code} & \rightarrow & \code{} + \end{eqnarray*}} +\vspace{-.7cm} +\caption{\label{fig:speccfg}Grammar for \TOOL specification language} +\vspace{-.3cm} +\end{figure} + + +\mysubsection{Example} + +To make the \TOOL specification language more concrete, +Figure~\ref{fig:rcuSpecExample} presents the annotated RCU example. We +use ordering points to order the method invocations to construct +the equivalent sequential history for the concurrent execution. We +first specify the ordering points for the \code{read} +and \code{update} methods to define the equivalent sequential +history. For the +\code{read} method, the load access of the \code{node} field in +Line~\ref{line:rcuSpecReadLoad} is the only operation that can be an ordering +point. For the \code{update} method, there exists more than one atomic +operation. However, they only serve as an ordering point when it successfully uses the CAS operation +to update the \code{node} field. Thus, we specify in +Line~\ref{line:rcuSpecUpdateOPBegin} that the CAS operation should be the +ordering point for the update operation when \code{succ} is \code{true}. We +associate the methods with the two ordering points in +Lines~\ref{line:rcuSpecReadInterfaceOPSet} and +\ref{line:rcuSpecUpdateInterfaceOPSet}. + +Next, we specify the equivalent sequential data structure for this RCU implementation. +Line~\ref{line:declVar} declares two integer fields \code{\_data} and +\code{\_version} as the internal states of the equivalent sequential RCU, and +Line~\ref{line:initVar} initializes both variables to \code{0}. + +We then specify the correct behaviors of the equivalent sequential +history by defining the side effects and assertions for +the \code{read} and \code{update} methods. Side effects specify how +to perform the corresponding operation on the equivalent sequential +data structure. For example, +Line~\ref{line:rcuSpecUpdateInterfaceSideEffect} specifies the side +effects of the \code{update} to the sequential states. +Assertions specify properties that should be true of the concurrent data structure execution. +For example, Line~\ref{line:rcuSpecReadInterfacePostCondition} +specifies that the \code{read} method should satisfy the postcondition that the +returned \code{data} and \code{version} fields should have consistent values +as the internal states of the equivalent sequential data structure. + +Our implementation of the RCU data structure is designed to establish +synchronization between the \code{update} method invocation and the later +\code{read} or \code{update} method invocation. This is important, for +example, if a client thread were to update an array index and use the RCU data +structure to communicate the updated index to a second client thread. Without +synchronization, the second client thread may not see the update to the array +index. Besides, the synchronization between two \code{update} calls ensures that +a later \code{read} will see the most updated values. +In order to specify the synchronization, we associate \code{read} and \code{update} methods with method call identifiers +(Lines~\ref{line:rcuSpecReadInterfaceID} and~\ref{line:rcuSpecUpdateInterfaceID}), which for this example is the value of the +\code{this} pointer. +Together these annotations ensure that every +API method call on the same RCU object will have the same method call ID. +Line~\ref{line:rcuSpecHB} then specifies +the synchronization properties for the RCU --- any \code{update} method invocation +should synchronize with all later \code{read} and \code{update} method invocations that have the +same method call identifier as that \code{update} method. This guarantees that +\code{update} calls should synchronize with the \code{read} and \code{update} +calls of the same RCU object. + + +\begin{figure}[h!] +\vspace{-.2cm} +\begin{lstlisting}[xleftmargin=6.0ex] +class RCU { + /** @Structure_Define: + @DeclareVar:/*@ \label{line:declVar} @*/ int _data, _version; + @InitVar:/*@ \label{line:initVar} @*/ _data = 0; _version = 0; + @Happens_Before: Update->Read Update->Update*//*@ \label{line:rcuSpecHB} @*/ + atomic node; + public: + RCU() { + Node *n = new Node; + n->data = 0; + n->version = 0; + atomic_init(&node, n); + } + /** @Interface: Read/*@ \label{line:rcuSpecReadInterfaceLabel} @*/ + @Ordering_Point_Set: Read_Point/*@ \label{line:rcuSpecReadInterfaceOPSet} @*/ + @ID: this/*@ \label{line:rcuSpecReadInterfaceID} @*/ + @PostCondition:/*@ \label{line:rcuSpecReadInterfacePostCondition} @*/ + _data == *data && _version == *version *//*@ \label{line:rcuSpecReadInterfaceEnd} @*/ + void read(int *data, int *version) { + Node *res = node.load(mo_acquire);/*@ \label{line:rcuSpecReadLoad} @*/ + /** @Ordering_Point_Label_Check: true/*@ \label{line:rcuSpecReadOPBegin} @*/ + @Label: Read_Point */ + *data = res->data; + *version = res->version; + } + /** @Interface: Update + @Ordering_Point_Set: Update_Point/*@ \label{line:rcuSpecUpdateInterfaceOPSet} @*/ + @ID: this/*@ \label{line:rcuSpecUpdateInterfaceID} @*/ + @SideEffect: _data = data; _version++; *//*@ \label{line:rcuSpecUpdateInterfaceSideEffect} @*/ + void update(int data) { + bool succ = false; + Node *newNode = new Node;/*@ \label{line:rcuSpecUpdateAlloc} @*/ + Node *prev = node.load(mo_acquire);/*@ \label{line:rcuSpecUpdateLoad} @*/ + do { + newNode->data = data; + newNode->version = prev->version + 1; + succ = node.compare_exchange_strong(prev,/*@\label{line:rcuSpecUpdateCAS} @*/ + newNode, mo_acq_rel, mo_acquire); + /** @Ordering_Point_Label_Check: succ/*@ \label{line:rcuSpecUpdateOPBegin} @*/ + @Label: Update_Point */ + } while (!succ); + } +}; + +\end{lstlisting} +\vspace{-.2cm} +\caption{\label{fig:rcuSpecExample}Annotated RCU specification example} +\vspace{-.3cm} +\end{figure} + +\subsection{Defining the Equivalent Sequential History} + +While defining the equivalent sequential history for concurrent executions is well studied in the context of the +SC memory model, optimizations that developers typically use in the +context of weaker memory models create the following new challenges when +we generate the equivalent sequential history using ordering points. + +\squishlist +\item {\bf Absence of a Meaningful Trace or Total Order:} +For the SC memory model, an execution can be represented by a simple +interleaving of all the memory operations, where each load operation reads from +the last store operation to the same location in the trace. However, under a +relaxed memory model like C/C++11, the interleaving does not uniquely define an +execution because a given load operation can potentially read from many +different store operations in the interleaving. Therefore, we have to rely on +the intrinsic relations between ordering points such as \textit{reads from} and +\textit{modification order} to order method calls. + +\item {\bf Lack of Program Order Preserving Sequential History:} +Moreover, as discussed in Section~\ref{sec:exampleMotivation}, in +general it is not possible to arrange an execution in any totally +ordered sequential history that preserves program order. + +A key insight is that many concurrent data structures' API methods +have a commit point, which is a single memory operation that makes the +update visible to other threads and that also serves as an ordering +point. When two data structure operations have a dependence, it is +often the case that their respective commit points are both +conflicting accesses to the same memory location. In this case, the +modification order provided by C/C++ is sufficient to order these +operations since modification order is guaranteed to be consistent +with the happens before relation (and therefore also the sequenced +before relation). + +For cases where the method calls are independent, such as +a \code{put(X, 1)} followed by a +\code{get(Y)} in a hashtable where \code{X} and \code{Y} are different keys, +the lack of an ordering is not a problem since those methods commute. +\squishend + +\mypara{\bf Ordering Points Annotations:} In many cases, it is not +possible to determine whether a given atomic operation is an ordering +point until later in the execution. For example, +some internal methods may be called by multiple API methods. In this +case, the same atomic operation can be identified as a potential +ordering point for multiple API methods, and each API method later has +a checking annotation to verify whether it was a real ordering +point. Therefore, the \TOOL specification separates the definition of ordering +points as follows: +\squishcount +\item {\code{Potential\_Ordering\_Point} annotation:} The labeling of ordering +points that identifies the location of a potential ordering point. +\item {\code{Ordering\_Point\_Check} annotation:} The checking of ordering +points that checks at a later point whether a potential ordering point was +really an ordering point. +\countend + +These two constructs together identify ordering points. For +example, assume that $A$ is an atomic operation that is potentially an +ordering point under some specific +condition. The developer would then write a +\code{Potential\_Ordering\_Point} annotation with a condition +\code{ConditionA} and a label +\code{LabelA}, and then use the label \code{LabelA} in an +\code{Ordering\_Point\_Check} annotation at a later point. + +The \code{Ordering\_Point\_Label\_Check} annotation combines +the \code{Potential\_Ordering\_Point} and the +\code{Ordering\_Point\_Check} annotations, and makes +specifications simpler for the use case where the ordering point is known immediately. +For example, in Line~\ref{line:rcuSpecReadOPBegin} of +Figure~\ref{fig:rcuSpecExample}, we use the \code{Ordering\_Point\_Label\_Check} annotation to +identify the ordering point for \code{read} because we know the load operation +in Line~\ref{line:rcuSpecReadLoad} is an ordering point at the time it is +executed. + +Some data structure operations may require multiple ordering points. +For example, consider a transaction implementation that first attempts +to lock all of the involved objects (dropping the locks and retrying +if it fails to acquire a lock), performs the updates, and then releases +the locks. To order such transactions in a relaxed memory model, we must consider all of the +locks it acquires rather than just the last lock. Thus, we allow a +method invocation to have more than one ordering point, and the +additional ordering points serve to order the operation with respect to +multiple different memory locations. For the transaction example, it +may be necessary to retry the acquisition of locks. To support this +scenario, the \code{Ordering\_Point\_Clear} annotation removes all +previous ordering points when it satisfies a specific condition. + +Moreover, when an API method calls another API method, they can share ordering points. In +that case, \TOOL requires that at that ordering point, the concurrent data +structure should satisfy the precondition and postcondition of both API methods. + +\subsection{Checking the IO Behavior of Methods} + +With the specified ordering points, \TOOL is able to generate the equivalent +sequential history. Developers then need to define the equivalent sequential +data structure. For example, in Line~\ref{line:declVar} and~\ref{line:initVar} of the annotated RCU example, we use the +\code{Structure\_define} annotation to define the equivalent sequential RCU +by specifying the internal states as two integers, \code{\_version} and \code{\_data}. In the +\code{Structure\_define} annotation, developers can also specify definitions for customized +structs and methods for convenience. We design these annotations in such a way +that developers can +write specifications in C/C++ code such that they do not have to learn a new +specification language. + +After defining the internal states and methods of the +equivalent data structure, developers use the \code{SideEffect} annotation to +define the corresponding sequential API methods, which should contain the action +to be performed on the equivalent sequential data structure. For example, in +Line~\ref{line:rcuSpecUpdateInterfaceSideEffect} of the annotated RCU example, +we use \code{SideEffect} to specify that when we execute the \code{update} +method on the equivalent sequential RCU, we should update the +internal states of \code{\_version} and \code{\_data} accordingly. When +the \code{SideEffect} annotation is omitted for a specific API method, it means +that no side effects will happen on the sequential data structure when that +method is called. Take the annotated RCU as an example, the \code{read} has no +side effects on the equivalent sequential RCU. + +With the well-defined equivalent sequential data structure, developers then relate +the generated equivalent sequential history to the equivalent sequential data +structure. In \TOOL, we allow developers to accomplish this by using the +\code{PreCondition} and \code{PostCondition} annotations to specify the +conditions to be checked before and after the API method appears to happen. +For example, Line~\ref{line:rcuSpecReadInterfaceEnd} in the +annotated RCU example means that when \code{read} appears to happen, it should +return the same value as the current internal variables of the equivalent +sequential RCU. +Note that these two annotations contain legitimate C/C++ +expressions that only access the method call parameters, return value and the +internal states of the equivalent sequential data structure. + +\subsection{Checking Synchronization} + +Under a relaxed memory model, compilers and processors can reorder +memory operations and thus the execution can exhibit counter-intuitive +behaviors. The C/C++11 memory model provides developers with memory ordering that establish synchronization, e.g., \code{acquire}, \code{release}, \code{seq\_cst}. Synchronization +serves to control which reorderings are allowed --- however, +restricting reorderings comes at a runtime cost so developers must +balance complexity against runtime overhead. Checking that data +structures establish proper synchronization is important to ensure +that the data structures can be effectively composed with client code. + +We generalize the notion of happens before to methods as follows. +Method call $c_1$ happens-before method call $c_2$ if the invocation +event of $c_1$ happens before the response event of $c_2$. Note that +by this definition two method calls can both happen before each other +--- an example of this is the \code{barrier} synchronization +construct. With this notion, for example, for a correctly synchronized queue, we want +an enqueue to happen before the corresponding dequeue, which avoids +the synchronization problems discussed earlier in +Section~\ref{sec:introNewChallenges}. + +In order to flexibly express the synchronization between methods, we associate +API methods with method call identifiers (or IDs) and happens-before conditional guard +expressions. The method +call ID is a C/C++ expression that computes a unique ID for the call, and if it +is omitted, a default value is used. For example, in our RCU example in +Figure~\ref{fig:rcuSpecExample}, both the \code{update} and \code{read} methods +have the \code{this} pointer of the corresponding RCU object. +The \code{HB\_Condition} component +associates one happens-before conditional guard expression with a unique label. +For one method, multiple conditional guard expressions are allowed to be +defined, and the conditional guard expression can only access the method +instance's argument values and return value. + +After specifying the +method call IDs and the \code{HB\_Condition} labels, developers +can specify the synchronization as ``\code{\small{method1(HB\_condition1)}} +\code{\small{->}} +\code{\small{method2(HB\_condition2)}}''. When the \code{HB\_condition} is omitted, it +defaults to \code{true}. The semantics of this expression is that all +instances of calls to \code{method1} that satisfy the conditional guard +expression \code{HB\_condition1} should happen-before all later instances (as determined by ordering points) of +calls to \code{method2} that satisfy the conditional guard expression +\code{HB\_condition2} such that both instances shared the same ID. +The ID and happens-before conditional guard expression are important because they +allow developers to impose synchronization only between specific method +invocations under specific conditions. For example, in +Figure~\ref{fig:rcuSpecExample}, Line~\ref{line:rcuSpecHB} specifies two +synchronization rules, which together mean that the +\code{update} should only establish synchronization with later \code{read} and +\code{update} from +the same RCU object under all circumstances. diff --git a/writeup/spell.lst b/writeup/spell.lst new file mode 100644 index 0000000..cc7a0be --- /dev/null +++ b/writeup/spell.lst @@ -0,0 +1,99 @@ +personal_ws-1.1 en 98 +runtime +API +dequeuing +opCheck +overviewing +atomics +PSO +thrd +IRIW +optimizations +atomicity +potentialOP +interleavings +updaters +Paraglider +hb +structureSpec +lookups +Lev +enqueue +resizing +linearizability +lrrr +Amit +cnt +MCS +InitVar +bool +multi +spinlock +trylock +Mellor +decrement +Valeadis +cst +happensBefore +SideEffect +putAll +dequeues +DeclareStruct +MPMC +deque +DefineFunc +methodSpec +STL +lockfree +opLabelCheck +rf +structureDefine +SPSC +sb +sc +hashtables +Cppmem +prev +dequeue +reorderings +VYRD +RW +init +TSO +ConditionA +Crummey +sw +opClear +ccccc +Valeiadis +Relacy +Concurrit +postconditions +iteratively +NDetermin +LabelA +resize +succ +TVLA +acq +nondeterministic +intra +linearizable +PreCondition +DeclareVar +hashtable +boolean +postcondition +PostCondition +CheckFence +enqueues +structs +scalability +struct +opo +newNode +linearization +CAS +RCU +Colvin +dependences diff --git a/writeup/technical.tex b/writeup/technical.tex new file mode 100644 index 0000000..674e37c --- /dev/null +++ b/writeup/technical.tex @@ -0,0 +1 @@ +\section{Technical}\label{sec:technical} -- 2.34.1