JIT compiling expressions/deform + inlining prototype v2.0

Started by Andres Freundover 8 years ago271 messages
#1Andres Freund
andres@anarazel.de
16 attachment(s)

Hi,

I previously had an early prototype of JITing [1]http://archives.postgresql.org/message-id/20161206034955.bh33paeralxbtluv%40alap3.anarazel.de expression evaluation
and tuple deforming. I've since then worked a lot on this.

Here's an initial, not really pretty but functional, submission. This
supports all types of expressions, and tuples, and allows, albeit with
some drawbacks, inlining of builtin functions. Between the version at
[1]: http://archives.postgresql.org/message-id/20161206034955.bh33paeralxbtluv%40alap3.anarazel.de
experiment more with llvm, but I've now translated everything back.
Some features I'd to re-implement due to limitations of C API.

As a teaser:
tpch_5[9586][1]http://archives.postgresql.org/message-id/20161206034955.bh33paeralxbtluv%40alap3.anarazel.de=# set jit_expressions=0;set jit_tuple_deforming=0;
tpch_5[9586][1]http://archives.postgresql.org/message-id/20161206034955.bh33paeralxbtluv%40alap3.anarazel.de=# \i ~/tmp/tpch/pg-tpch/queries/q01.sql
┌──────────────┬──────────────┬───────────┬──────────────────┬──────────────────┬──────────────────┬──────────────────┬──────────────────┬────────────────────┬─────────────┐
│ l_returnflag │ l_linestatus │ sum_qty │ sum_base_price │ sum_disc_price │ sum_charge │ avg_qty │ avg_price │ avg_disc │ count_order │
├──────────────┼──────────────┼───────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┼──────────────────┼────────────────────┼─────────────┤
│ A │ F │ 188818373 │ 283107483036.109 │ 268952035589.054 │ 279714361804.23 │ 25.5025937044707 │ 38237.6725307617 │ 0.0499976863510723 │ 7403889 │
│ N │ F │ 4913382 │ 7364213967.94998 │ 6995782725.6633 │ 7275821143.98952 │ 25.5321530459003 │ 38267.7833908406 │ 0.0500308669240696 │ 192439 │
│ N │ O │ 375088356 │ 562442339707.852 │ 534321895537.884 │ 555701690243.972 │ 25.4978961033505 │ 38233.9150565265 │ 0.0499956453049625 │ 14710561 │
│ R │ F │ 188960009 │ 283310887148.206 │ 269147687267.211 │ 279912972474.866 │ 25.5132328961366 │ 38252.4148049933 │ 0.0499958481590264 │ 7406353 │
└──────────────┴──────────────┴───────────┴──────────────────┴──────────────────┴──────────────────┴──────────────────┴──────────────────┴────────────────────┴─────────────┘
(4 rows)

Time: 4367.486 ms (00:04.367)
tpch_5[9586][1]http://archives.postgresql.org/message-id/20161206034955.bh33paeralxbtluv%40alap3.anarazel.de=# set jit_expressions=1;set jit_tuple_deforming=1;
tpch_5[9586][1]http://archives.postgresql.org/message-id/20161206034955.bh33paeralxbtluv%40alap3.anarazel.de=# \i ~/tmp/tpch/pg-tpch/queries/q01.sql
<repeat>
(4 rows)

Time: 3158.575 ms (00:03.159)

tpch_5[9586][1]http://archives.postgresql.org/message-id/20161206034955.bh33paeralxbtluv%40alap3.anarazel.de=# set jit_expressions=0;set jit_tuple_deforming=0;
tpch_5[9586][1]http://archives.postgresql.org/message-id/20161206034955.bh33paeralxbtluv%40alap3.anarazel.de=# \i ~/tmp/tpch/pg-tpch/queries/q01.sql
<repeat>
(4 rows)
Time: 4383.562 ms (00:04.384)

The potential wins of the JITing itself are considerably larger than the
already significant gains demonstrated above - this version here doesn't
exactly generate the nicest native code around. After these patches the
bottlencks for TCP-H's Q01 are largely inside the float* functions and
the non-expressionified execGrouping.c code. The latter needs to be
expressified to gain benefits due to JIT - that shouldn't be very hard.

The code generation can be improved by moving more of the variable data
into llvm allocated stack data, that also has other benefits.

The patch series currently consists out of the following:

0001-Rely-on-executor-utils-to-build-targetlist-for-DML-R.patch
- boring prep work

0002-WIP-Allow-tupleslots-to-have-a-fixed-tupledesc-use-i.patch
- for JITed deforming we need to know whether a slot's tupledesc will
change

0003-WIP-Add-configure-infrastructure-to-enable-LLVM.patch
- boring

0004-WIP-Beginning-of-a-LLVM-JIT-infrastructure.patch
- infrastructure for llvm, including memory lifetime management, and
bulk emission of functions.

0005-Perform-slot-validity-checks-in-a-separate-pass-over.patch
- boring, prep work for expression jiting

0006-WIP-deduplicate-int-float-overflow-handling-code.patch
- boring

0007-Pass-through-PlanState-parent-to-expression-instanti.patch
- boring

0008-WIP-JIT-compile-expression.patch
- that's the biggest patch, actually adding JITing
- code needs to be better documented, tested, and deduplicated

0009-Simplify-aggregate-code-a-bit.patch
0010-More-efficient-AggState-pertrans-iteration.patch
0011-Avoid-dereferencing-tts_values-nulls-repeatedly.patch
0012-Centralize-slot-deforming-logic-a-bit.patch
- boring, mostly to make comparison between JITed and non-jitted a bit
fairer and to remove unnecessary other bottlenecks.

0013-WIP-Make-scan-desc-available-for-all-PlanStates.patch
- this isn't clean enough.

0014-WIP-JITed-tuple-deforming.patch

- do JITing of deforming, but only when called from within expression,
there we know which columns we want to be deformed etc.

- Not clear what'd be a good way to also JIT other deforming without
additional infrastructure - doing a separate function emission for
every slot_deform_tuple() is unattractive performancewise and
memory-lifetime wise, I did have that at first.

0015-WIP-Expression-based-agg-transition.patch
- allows to JIT aggregate transition invocation, but also speeds up
aggregates without JIT.

0016-Hacky-Preliminary-inlining-implementation.patch
- allows to inline functions, by using bitcode. That bitcode can be
loaded from a list of directories - as long as compatibly configured
the bitcode doesn't have to be generated by the same compiler as the
postgres binary. i.e. gcc postgres + clang bitcode works.

I've whacked this around quite heavily today, this likely has some new
bugs, sorry for that :(

I plan to spend some considerable time over the next weeks to clean this
up and address some of the areas where the performance isn't yet as good
as desirable.

Greetings,

Andres Freund

[1]: http://archives.postgresql.org/message-id/20161206034955.bh33paeralxbtluv%40alap3.anarazel.de

Attachments:

0001-Rely-on-executor-utils-to-build-targetlist-for-DML-R.patchtext/x-diff; charset=us-asciiDownload
From 9dd646b49ce2385fdf950f459879ded116ef4bb0 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 16 Aug 2017 01:03:51 -0700
Subject: [PATCH 01/16] Rely on executor utils to build targetlist for DML
 RETURNING.

---
 src/backend/executor/nodeModifyTable.c | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c
index e12721a9b6..57946e1591 100644
--- a/src/backend/executor/nodeModifyTable.c
+++ b/src/backend/executor/nodeModifyTable.c
@@ -1793,7 +1793,6 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
 	int			nplans = list_length(node->plans);
 	ResultRelInfo *saved_resultRelInfo;
 	ResultRelInfo *resultRelInfo;
-	TupleDesc	tupDesc;
 	Plan	   *subplan;
 	ListCell   *l;
 	int			i;
@@ -2027,12 +2026,11 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
 		 * Initialize result tuple slot and assign its rowtype using the first
 		 * RETURNING list.  We assume the rest will look the same.
 		 */
-		tupDesc = ExecTypeFromTL((List *) linitial(node->returningLists),
-								 false);
+		mtstate->ps.plan->targetlist = (List *) linitial(node->returningLists);
 
 		/* Set up a slot for the output of the RETURNING projection(s) */
 		ExecInitResultTupleSlot(estate, &mtstate->ps);
-		ExecAssignResultType(&mtstate->ps, tupDesc);
+		ExecAssignResultTypeFromTL(&mtstate->ps);
 		slot = mtstate->ps.ps_ResultTupleSlot;
 
 		/* Need an econtext too */
@@ -2084,9 +2082,9 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
 		 * We still must construct a dummy result tuple type, because InitPlan
 		 * expects one (maybe should change that?).
 		 */
-		tupDesc = ExecTypeFromTL(NIL, false);
+		mtstate->ps.plan->targetlist = NIL;
 		ExecInitResultTupleSlot(estate, &mtstate->ps);
-		ExecAssignResultType(&mtstate->ps, tupDesc);
+		ExecAssignResultTypeFromTL(&mtstate->ps);
 
 		mtstate->ps.ps_ExprContext = NULL;
 	}
-- 
2.14.1.2.g4274c698f4.dirty

0002-WIP-Allow-tupleslots-to-have-a-fixed-tupledesc-use-i.patchtext/x-diff; charset=us-asciiDownload
From 9000faa6ccb3f5bbbd8944590c82826fa13404e9 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Fri, 25 Aug 2017 14:19:23 -0700
Subject: [PATCH 02/16] WIP: Allow tupleslots to have a fixed tupledesc, use in
 executor nodes.

The reason for doing so is that it will allow expression evaluation to
optimize based on the underlying tupledesc. In particular it allows
JITing tuple deforming together with the expression itself.

For that expression initialization needs to be moved after the
relevant slots are initialized - mostly unproblematic, except in the
case of nodeWorktablescan.c.
---
 src/backend/executor/execMain.c                |  2 +-
 src/backend/executor/execTuples.c              | 50 ++++++++++++-----
 src/backend/executor/execUtils.c               | 45 +--------------
 src/backend/executor/nodeAgg.c                 | 42 +++++++-------
 src/backend/executor/nodeAppend.c              | 17 +++---
 src/backend/executor/nodeBitmapAnd.c           | 14 ++---
 src/backend/executor/nodeBitmapHeapscan.c      | 43 +++++++-------
 src/backend/executor/nodeBitmapIndexscan.c     | 14 ++---
 src/backend/executor/nodeBitmapOr.c            | 14 ++---
 src/backend/executor/nodeCtescan.c             | 20 +++----
 src/backend/executor/nodeCustom.c              | 16 +++---
 src/backend/executor/nodeForeignscan.c         | 24 ++++----
 src/backend/executor/nodeFunctionscan.c        | 26 ++++-----
 src/backend/executor/nodeGather.c              |  3 +-
 src/backend/executor/nodeGatherMerge.c         |  3 +-
 src/backend/executor/nodeGroup.c               | 18 +++---
 src/backend/executor/nodeHash.c                | 13 ++---
 src/backend/executor/nodeHashjoin.c            | 25 ++++-----
 src/backend/executor/nodeIndexonlyscan.c       | 28 +++++-----
 src/backend/executor/nodeIndexscan.c           | 49 ++++++++--------
 src/backend/executor/nodeLimit.c               |  3 +-
 src/backend/executor/nodeLockRows.c            | 15 +++--
 src/backend/executor/nodeMaterial.c            | 20 +++----
 src/backend/executor/nodeMergeAppend.c         |  3 +-
 src/backend/executor/nodeMergejoin.c           | 25 ++++-----
 src/backend/executor/nodeModifyTable.c         |  6 +-
 src/backend/executor/nodeNamedtuplestorescan.c | 18 ++----
 src/backend/executor/nodeNestloop.c            | 21 ++++---
 src/backend/executor/nodeProjectSet.c          |  3 +-
 src/backend/executor/nodeRecursiveunion.c      | 40 ++++++-------
 src/backend/executor/nodeResult.c              | 27 +++++----
 src/backend/executor/nodeSamplescan.c          | 77 ++++++++++----------------
 src/backend/executor/nodeSeqscan.c             | 56 +++++++------------
 src/backend/executor/nodeSetOp.c               |  3 +-
 src/backend/executor/nodeSort.c                | 20 +++----
 src/backend/executor/nodeSubqueryscan.c        | 18 +++---
 src/backend/executor/nodeTableFuncscan.c       | 25 ++++-----
 src/backend/executor/nodeTidscan.c             | 49 ++++++++--------
 src/backend/executor/nodeUnique.c              |  3 +-
 src/backend/executor/nodeValuesscan.c          | 18 +++---
 src/backend/executor/nodeWindowAgg.c           |  6 +-
 src/backend/executor/nodeWorktablescan.c       | 13 ++---
 src/include/executor/executor.h                |  8 +--
 src/include/executor/tuptable.h                |  5 +-
 44 files changed, 422 insertions(+), 526 deletions(-)

diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c
index 2946a0edee..89ef0fc8ee 100644
--- a/src/backend/executor/execMain.c
+++ b/src/backend/executor/execMain.c
@@ -3290,7 +3290,7 @@ ExecSetupPartitionTupleRouting(Relation rel,
 	 * (such as ModifyTableState) and released when the node finishes
 	 * processing.
 	 */
-	*partition_tuple_slot = MakeTupleTableSlot();
+	*partition_tuple_slot = MakeTupleTableSlot(NULL);
 
 	leaf_part_rri = *partitions;
 	i = 0;
diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c
index 31f814c0f0..8280b89f7f 100644
--- a/src/backend/executor/execTuples.c
+++ b/src/backend/executor/execTuples.c
@@ -58,7 +58,7 @@
  *		At ExecutorStart()
  *		----------------
  *		- ExecInitSeqScan() calls ExecInitScanTupleSlot() and
- *		  ExecInitResultTupleSlot() to construct TupleTableSlots
+ *		  ExecInitResultTupleSlotTL() to construct TupleTableSlots
  *		  for the tuples returned by the access methods and the
  *		  tuples resulting from performing target list projections.
  *
@@ -108,7 +108,7 @@ static TupleDesc ExecTypeFromTLInternal(List *targetList,
  * --------------------------------
  */
 TupleTableSlot *
-MakeTupleTableSlot(void)
+MakeTupleTableSlot(TupleDesc tupleDesc)
 {
 	TupleTableSlot *slot = makeNode(TupleTableSlot);
 
@@ -116,6 +116,7 @@ MakeTupleTableSlot(void)
 	slot->tts_shouldFree = false;
 	slot->tts_shouldFreeMin = false;
 	slot->tts_tuple = NULL;
+	slot->tts_fixedTupleDescriptor = false;
 	slot->tts_tupleDescriptor = NULL;
 	slot->tts_mcxt = CurrentMemoryContext;
 	slot->tts_buffer = InvalidBuffer;
@@ -124,6 +125,13 @@ MakeTupleTableSlot(void)
 	slot->tts_isnull = NULL;
 	slot->tts_mintuple = NULL;
 
+	/* FIXME: instead allocate everything in one go */
+	if (tupleDesc != NULL)
+	{
+		ExecSetSlotDescriptor(slot, tupleDesc);
+		slot->tts_fixedTupleDescriptor = true;
+	}
+
 	return slot;
 }
 
@@ -134,9 +142,9 @@ MakeTupleTableSlot(void)
  * --------------------------------
  */
 TupleTableSlot *
-ExecAllocTableSlot(List **tupleTable)
+ExecAllocTableSlot(List **tupleTable, TupleDesc desc)
 {
-	TupleTableSlot *slot = MakeTupleTableSlot();
+	TupleTableSlot *slot = MakeTupleTableSlot(desc);
 
 	*tupleTable = lappend(*tupleTable, slot);
 
@@ -198,9 +206,7 @@ ExecResetTupleTable(List *tupleTable,	/* tuple table */
 TupleTableSlot *
 MakeSingleTupleTableSlot(TupleDesc tupdesc)
 {
-	TupleTableSlot *slot = MakeTupleTableSlot();
-
-	ExecSetSlotDescriptor(slot, tupdesc);
+	TupleTableSlot *slot = MakeTupleTableSlot(tupdesc);
 
 	return slot;
 }
@@ -247,6 +253,8 @@ void
 ExecSetSlotDescriptor(TupleTableSlot *slot, /* slot to change */
 					  TupleDesc tupdesc)	/* new tuple descriptor */
 {
+	Assert(!slot->tts_fixedTupleDescriptor);
+
 	/* For safety, make sure slot is empty before changing it */
 	ExecClearTuple(slot);
 
@@ -825,13 +833,28 @@ ExecCopySlot(TupleTableSlot *dstslot, TupleTableSlot *srcslot)
  */
 
 /* ----------------
- *		ExecInitResultTupleSlot
+ *		ExecInitResultTupleSlotTL
  * ----------------
  */
 void
-ExecInitResultTupleSlot(EState *estate, PlanState *planstate)
+ExecInitResultTupleSlotTL(EState *estate, PlanState *planstate)
 {
-	planstate->ps_ResultTupleSlot = ExecAllocTableSlot(&estate->es_tupleTable);
+	bool		hasoid;
+	TupleDesc	tupDesc;
+
+	if (ExecContextForcesOids(planstate, &hasoid))
+	{
+		/* context forces OID choice; hasoid is now set correctly */
+	}
+	else
+	{
+		/* given free choice, don't leave space for OIDs in result tuples */
+		hasoid = false;
+	}
+
+	tupDesc = ExecTypeFromTL(planstate->plan->targetlist, hasoid);
+
+	planstate->ps_ResultTupleSlot = ExecAllocTableSlot(&estate->es_tupleTable, tupDesc);
 }
 
 /* ----------------
@@ -839,9 +862,10 @@ ExecInitResultTupleSlot(EState *estate, PlanState *planstate)
  * ----------------
  */
 void
-ExecInitScanTupleSlot(EState *estate, ScanState *scanstate)
+ExecInitScanTupleSlot(EState *estate, ScanState *scanstate, TupleDesc tupledesc)
 {
-	scanstate->ss_ScanTupleSlot = ExecAllocTableSlot(&estate->es_tupleTable);
+	scanstate->ss_ScanTupleSlot = ExecAllocTableSlot(&estate->es_tupleTable,
+													 tupledesc);
 }
 
 /* ----------------
@@ -851,7 +875,7 @@ ExecInitScanTupleSlot(EState *estate, ScanState *scanstate)
 TupleTableSlot *
 ExecInitExtraTupleSlot(EState *estate)
 {
-	return ExecAllocTableSlot(&estate->es_tupleTable);
+	return ExecAllocTableSlot(&estate->es_tupleTable, NULL);
 }
 
 /* ----------------
diff --git a/src/backend/executor/execUtils.c b/src/backend/executor/execUtils.c
index 9528393976..5928c38f90 100644
--- a/src/backend/executor/execUtils.c
+++ b/src/backend/executor/execUtils.c
@@ -425,47 +425,6 @@ ExecAssignExprContext(EState *estate, PlanState *planstate)
 	planstate->ps_ExprContext = CreateExprContext(estate);
 }
 
-/* ----------------
- *		ExecAssignResultType
- * ----------------
- */
-void
-ExecAssignResultType(PlanState *planstate, TupleDesc tupDesc)
-{
-	TupleTableSlot *slot = planstate->ps_ResultTupleSlot;
-
-	ExecSetSlotDescriptor(slot, tupDesc);
-}
-
-/* ----------------
- *		ExecAssignResultTypeFromTL
- * ----------------
- */
-void
-ExecAssignResultTypeFromTL(PlanState *planstate)
-{
-	bool		hasoid;
-	TupleDesc	tupDesc;
-
-	if (ExecContextForcesOids(planstate, &hasoid))
-	{
-		/* context forces OID choice; hasoid is now set correctly */
-	}
-	else
-	{
-		/* given free choice, don't leave space for OIDs in result tuples */
-		hasoid = false;
-	}
-
-	/*
-	 * ExecTypeFromTL needs the parse-time representation of the tlist, not a
-	 * list of ExprStates.  This is good because some plan nodes don't bother
-	 * to set up planstate->targetlist ...
-	 */
-	tupDesc = ExecTypeFromTL(planstate->plan->targetlist, hasoid);
-	ExecAssignResultType(planstate, tupDesc);
-}
-
 /* ----------------
  *		ExecGetResultType
  * ----------------
@@ -554,7 +513,7 @@ ExecAssignScanType(ScanState *scanstate, TupleDesc tupDesc)
  * ----------------
  */
 void
-ExecAssignScanTypeFromOuterPlan(ScanState *scanstate)
+ExecCreateScanSlotForOuterPlan(EState *estate, ScanState *scanstate)
 {
 	PlanState  *outerPlan;
 	TupleDesc	tupDesc;
@@ -562,7 +521,7 @@ ExecAssignScanTypeFromOuterPlan(ScanState *scanstate)
 	outerPlan = outerPlanState(scanstate);
 	tupDesc = ExecGetResultType(outerPlan);
 
-	ExecAssignScanType(scanstate, tupDesc);
+	ExecInitScanTupleSlot(estate, scanstate, tupDesc);
 }
 
 
diff --git a/src/backend/executor/nodeAgg.c b/src/backend/executor/nodeAgg.c
index 0ae5873868..1783f38f14 100644
--- a/src/backend/executor/nodeAgg.c
+++ b/src/backend/executor/nodeAgg.c
@@ -2795,10 +2795,28 @@ ExecInitAgg(Agg *node, EState *estate, int eflags)
 	 *
 	 * For hashtables, we create some additional slots below.
 	 */
-	ExecInitScanTupleSlot(estate, &aggstate->ss);
-	ExecInitResultTupleSlot(estate, &aggstate->ss.ps);
+	ExecInitResultTupleSlotTL(estate, &aggstate->ss.ps);
 	aggstate->sort_slot = ExecInitExtraTupleSlot(estate);
 
+	/*
+	 * Initialize child nodes.
+	 *
+	 * If we are doing a hashed aggregation then the child plan does not need
+	 * to handle REWIND efficiently; see ExecReScanAgg.
+	 */
+	if (node->aggstrategy == AGG_HASHED)
+		eflags &= ~EXEC_FLAG_REWIND;
+	outerPlan = outerPlan(node);
+	outerPlanState(aggstate) = ExecInitNode(outerPlan, estate, eflags);
+
+	/*
+	 * initialize source tuple type.
+	 */
+	ExecCreateScanSlotForOuterPlan(estate, &aggstate->ss);
+	if (node->chain)
+		ExecSetSlotDescriptor(aggstate->sort_slot,
+							  aggstate->ss.ss_ScanTupleSlot->tts_tupleDescriptor);
+
 	/*
 	 * initialize child expressions
 	 *
@@ -2814,29 +2832,9 @@ ExecInitAgg(Agg *node, EState *estate, int eflags)
 	aggstate->ss.ps.qual =
 		ExecInitQual(node->plan.qual, (PlanState *) aggstate);
 
-	/*
-	 * Initialize child nodes.
-	 *
-	 * If we are doing a hashed aggregation then the child plan does not need
-	 * to handle REWIND efficiently; see ExecReScanAgg.
-	 */
-	if (node->aggstrategy == AGG_HASHED)
-		eflags &= ~EXEC_FLAG_REWIND;
-	outerPlan = outerPlan(node);
-	outerPlanState(aggstate) = ExecInitNode(outerPlan, estate, eflags);
-
-	/*
-	 * initialize source tuple type.
-	 */
-	ExecAssignScanTypeFromOuterPlan(&aggstate->ss);
-	if (node->chain)
-		ExecSetSlotDescriptor(aggstate->sort_slot,
-							  aggstate->ss.ss_ScanTupleSlot->tts_tupleDescriptor);
-
 	/*
 	 * Initialize result tuple type and projection info.
 	 */
-	ExecAssignResultTypeFromTL(&aggstate->ss.ps);
 	ExecAssignProjectionInfo(&aggstate->ss.ps, NULL);
 
 	/*
diff --git a/src/backend/executor/nodeAppend.c b/src/backend/executor/nodeAppend.c
index bed9bb8713..e67d0c36d3 100644
--- a/src/backend/executor/nodeAppend.c
+++ b/src/backend/executor/nodeAppend.c
@@ -152,18 +152,11 @@ ExecInitAppend(Append *node, EState *estate, int eflags)
 	appendstate->appendplans = appendplanstates;
 	appendstate->as_nplans = nplans;
 
-	/*
-	 * Miscellaneous initialization
-	 *
-	 * Append plans don't have expression contexts because they never call
-	 * ExecQual or ExecProject.
-	 */
-
 	/*
 	 * append nodes still have Result slots, which hold pointers to tuples, so
 	 * we have to initialize them.
 	 */
-	ExecInitResultTupleSlot(estate, &appendstate->ps);
+	ExecInitResultTupleSlotTL(estate, &appendstate->ps);
 
 	/*
 	 * call ExecInitNode on each of the plans to be executed and save the
@@ -181,9 +174,15 @@ ExecInitAppend(Append *node, EState *estate, int eflags)
 	/*
 	 * initialize output tuple type
 	 */
-	ExecAssignResultTypeFromTL(&appendstate->ps);
 	appendstate->ps.ps_ProjInfo = NULL;
 
+	/*
+	 * Miscellaneous initialization
+	 *
+	 * Append plans don't have expression contexts because they never call
+	 * ExecQual or ExecProject.
+	 */
+
 	/*
 	 * initialize to scan first subplan
 	 */
diff --git a/src/backend/executor/nodeBitmapAnd.c b/src/backend/executor/nodeBitmapAnd.c
index 1c5c312c95..b2b30842c6 100644
--- a/src/backend/executor/nodeBitmapAnd.c
+++ b/src/backend/executor/nodeBitmapAnd.c
@@ -80,13 +80,6 @@ ExecInitBitmapAnd(BitmapAnd *node, EState *estate, int eflags)
 	bitmapandstate->bitmapplans = bitmapplanstates;
 	bitmapandstate->nplans = nplans;
 
-	/*
-	 * Miscellaneous initialization
-	 *
-	 * BitmapAnd plans don't have expression contexts because they never call
-	 * ExecQual or ExecProject.  They don't need any tuple slots either.
-	 */
-
 	/*
 	 * call ExecInitNode on each of the plans to be executed and save the
 	 * results into the array "bitmapplanstates".
@@ -99,6 +92,13 @@ ExecInitBitmapAnd(BitmapAnd *node, EState *estate, int eflags)
 		i++;
 	}
 
+	/*
+	 * Miscellaneous initialization
+	 *
+	 * BitmapAnd plans don't have expression contexts because they never call
+	 * ExecQual or ExecProject.  They don't need any tuple slots either.
+	 */
+
 	return bitmapandstate;
 }
 
diff --git a/src/backend/executor/nodeBitmapHeapscan.c b/src/backend/executor/nodeBitmapHeapscan.c
index f7e55e0b45..021fe0e272 100644
--- a/src/backend/executor/nodeBitmapHeapscan.c
+++ b/src/backend/executor/nodeBitmapHeapscan.c
@@ -824,6 +824,27 @@ ExecInitBitmapHeapScan(BitmapHeapScan *node, EState *estate, int eflags)
 	 */
 	ExecAssignExprContext(estate, &scanstate->ss.ps);
 
+	/*
+	 * open the base relation and acquire appropriate lock on it.
+	 */
+	currentRelation = ExecOpenScanRelation(estate, node->scan.scanrelid, eflags);
+
+	/*
+	 * tuple table initialization
+	 */
+	ExecInitResultTupleSlotTL(estate, &scanstate->ss.ps);
+
+	/*
+	 * get the scan type from the relation descriptor.
+	 */
+	ExecInitScanTupleSlot(estate, &scanstate->ss,
+						  RelationGetDescr(currentRelation));
+
+	/*
+	 * Initialize result tuple type and projection info.
+	 */
+	ExecAssignScanProjectionInfo(&scanstate->ss);
+
 	/*
 	 * initialize child expressions
 	 */
@@ -832,17 +853,6 @@ ExecInitBitmapHeapScan(BitmapHeapScan *node, EState *estate, int eflags)
 	scanstate->bitmapqualorig =
 		ExecInitQual(node->bitmapqualorig, (PlanState *) scanstate);
 
-	/*
-	 * tuple table initialization
-	 */
-	ExecInitResultTupleSlot(estate, &scanstate->ss.ps);
-	ExecInitScanTupleSlot(estate, &scanstate->ss);
-
-	/*
-	 * open the base relation and acquire appropriate lock on it.
-	 */
-	currentRelation = ExecOpenScanRelation(estate, node->scan.scanrelid, eflags);
-
 	/*
 	 * Determine the maximum for prefetch_target.  If the tablespace has a
 	 * specific IO concurrency set, use that to compute the corresponding
@@ -870,17 +880,6 @@ ExecInitBitmapHeapScan(BitmapHeapScan *node, EState *estate, int eflags)
 														 0,
 														 NULL);
 
-	/*
-	 * get the scan type from the relation descriptor.
-	 */
-	ExecAssignScanType(&scanstate->ss, RelationGetDescr(currentRelation));
-
-	/*
-	 * Initialize result tuple type and projection info.
-	 */
-	ExecAssignResultTypeFromTL(&scanstate->ss.ps);
-	ExecAssignScanProjectionInfo(&scanstate->ss);
-
 	/*
 	 * initialize child nodes
 	 *
diff --git a/src/backend/executor/nodeBitmapIndexscan.c b/src/backend/executor/nodeBitmapIndexscan.c
index 6feb70f4ae..1178dc82b2 100644
--- a/src/backend/executor/nodeBitmapIndexscan.c
+++ b/src/backend/executor/nodeBitmapIndexscan.c
@@ -226,13 +226,6 @@ ExecInitBitmapIndexScan(BitmapIndexScan *node, EState *estate, int eflags)
 	/* normally we don't make the result bitmap till runtime */
 	indexstate->biss_result = NULL;
 
-	/*
-	 * Miscellaneous initialization
-	 *
-	 * We do not need a standard exprcontext for this node, though we may
-	 * decide below to create a runtime-key exprcontext
-	 */
-
 	/*
 	 * initialize child expressions
 	 *
@@ -248,6 +241,13 @@ ExecInitBitmapIndexScan(BitmapIndexScan *node, EState *estate, int eflags)
 	 * the heap relation throughout the execution of the plan tree.
 	 */
 
+	/*
+	 * Miscellaneous initialization
+	 *
+	 * We do not need a standard exprcontext for this node, though we may
+	 * decide below to create a runtime-key exprcontext
+	 */
+
 	indexstate->ss.ss_currentRelation = NULL;
 	indexstate->ss.ss_currentScanDesc = NULL;
 
diff --git a/src/backend/executor/nodeBitmapOr.c b/src/backend/executor/nodeBitmapOr.c
index 66a7a89a8b..73c08e4652 100644
--- a/src/backend/executor/nodeBitmapOr.c
+++ b/src/backend/executor/nodeBitmapOr.c
@@ -81,13 +81,6 @@ ExecInitBitmapOr(BitmapOr *node, EState *estate, int eflags)
 	bitmaporstate->bitmapplans = bitmapplanstates;
 	bitmaporstate->nplans = nplans;
 
-	/*
-	 * Miscellaneous initialization
-	 *
-	 * BitmapOr plans don't have expression contexts because they never call
-	 * ExecQual or ExecProject.  They don't need any tuple slots either.
-	 */
-
 	/*
 	 * call ExecInitNode on each of the plans to be executed and save the
 	 * results into the array "bitmapplanstates".
@@ -100,6 +93,13 @@ ExecInitBitmapOr(BitmapOr *node, EState *estate, int eflags)
 		i++;
 	}
 
+	/*
+	 * Miscellaneous initialization
+	 *
+	 * BitmapOr plans don't have expression contexts because they never call
+	 * ExecQual or ExecProject.  They don't need any tuple slots either.
+	 */
+
 	return bitmaporstate;
 }
 
diff --git a/src/backend/executor/nodeCtescan.c b/src/backend/executor/nodeCtescan.c
index 79676ca978..934885dce5 100644
--- a/src/backend/executor/nodeCtescan.c
+++ b/src/backend/executor/nodeCtescan.c
@@ -242,31 +242,29 @@ ExecInitCteScan(CteScan *node, EState *estate, int eflags)
 	 */
 	ExecAssignExprContext(estate, &scanstate->ss.ps);
 
-	/*
-	 * initialize child expressions
-	 */
-	scanstate->ss.ps.qual =
-		ExecInitQual(node->scan.plan.qual, (PlanState *) scanstate);
-
 	/*
 	 * tuple table initialization
 	 */
-	ExecInitResultTupleSlot(estate, &scanstate->ss.ps);
-	ExecInitScanTupleSlot(estate, &scanstate->ss);
+	ExecInitResultTupleSlotTL(estate, &scanstate->ss.ps);
 
 	/*
 	 * The scan tuple type (ie, the rowtype we expect to find in the work
 	 * table) is the same as the result rowtype of the CTE query.
 	 */
-	ExecAssignScanType(&scanstate->ss,
-					   ExecGetResultType(scanstate->cteplanstate));
+	ExecInitScanTupleSlot(estate, &scanstate->ss,
+						  ExecGetResultType(scanstate->cteplanstate));
 
 	/*
 	 * Initialize result tuple type and projection info.
 	 */
-	ExecAssignResultTypeFromTL(&scanstate->ss.ps);
 	ExecAssignScanProjectionInfo(&scanstate->ss);
 
+	/*
+	 * initialize child expressions
+	 */
+	scanstate->ss.ps.qual =
+		ExecInitQual(node->scan.plan.qual, (PlanState *) scanstate);
+
 	return scanstate;
 }
 
diff --git a/src/backend/executor/nodeCustom.c b/src/backend/executor/nodeCustom.c
index 07dcabef55..3d9b69e550 100644
--- a/src/backend/executor/nodeCustom.c
+++ b/src/backend/executor/nodeCustom.c
@@ -54,13 +54,8 @@ ExecInitCustomScan(CustomScan *cscan, EState *estate, int eflags)
 	/* create expression context for node */
 	ExecAssignExprContext(estate, &css->ss.ps);
 
-	/* initialize child expressions */
-	css->ss.ps.qual =
-		ExecInitQual(cscan->scan.plan.qual, (PlanState *) css);
-
 	/* tuple table initialization */
-	ExecInitScanTupleSlot(estate, &css->ss);
-	ExecInitResultTupleSlot(estate, &css->ss.ps);
+	ExecInitResultTupleSlotTL(estate, &css->ss.ps);
 
 	/*
 	 * open the base relation, if any, and acquire an appropriate lock on it
@@ -81,13 +76,13 @@ ExecInitCustomScan(CustomScan *cscan, EState *estate, int eflags)
 		TupleDesc	scan_tupdesc;
 
 		scan_tupdesc = ExecTypeFromTL(cscan->custom_scan_tlist, false);
-		ExecAssignScanType(&css->ss, scan_tupdesc);
+		ExecInitScanTupleSlot(estate, &css->ss, scan_tupdesc);
 		/* Node's targetlist will contain Vars with varno = INDEX_VAR */
 		tlistvarno = INDEX_VAR;
 	}
 	else
 	{
-		ExecAssignScanType(&css->ss, RelationGetDescr(scan_rel));
+		ExecInitScanTupleSlot(estate, &css->ss, RelationGetDescr(scan_rel));
 		/* Node's targetlist will contain Vars with varno = scanrelid */
 		tlistvarno = scanrelid;
 	}
@@ -95,9 +90,12 @@ ExecInitCustomScan(CustomScan *cscan, EState *estate, int eflags)
 	/*
 	 * Initialize result tuple type and projection info.
 	 */
-	ExecAssignResultTypeFromTL(&css->ss.ps);
 	ExecAssignScanProjectionInfoWithVarno(&css->ss, tlistvarno);
 
+	/* initialize child expressions */
+	css->ss.ps.qual =
+		ExecInitQual(cscan->scan.plan.qual, (PlanState *) css);
+
 	/*
 	 * The callback of custom-scan provider applies the final initialization
 	 * of the custom-scan-state node according to its logic.
diff --git a/src/backend/executor/nodeForeignscan.c b/src/backend/executor/nodeForeignscan.c
index 20892d6d5f..fb67a53d1e 100644
--- a/src/backend/executor/nodeForeignscan.c
+++ b/src/backend/executor/nodeForeignscan.c
@@ -155,19 +155,10 @@ ExecInitForeignScan(ForeignScan *node, EState *estate, int eflags)
 	 */
 	ExecAssignExprContext(estate, &scanstate->ss.ps);
 
-	/*
-	 * initialize child expressions
-	 */
-	scanstate->ss.ps.qual =
-		ExecInitQual(node->scan.plan.qual, (PlanState *) scanstate);
-	scanstate->fdw_recheck_quals =
-		ExecInitQual(node->fdw_recheck_quals, (PlanState *) scanstate);
-
 	/*
 	 * tuple table initialization
 	 */
-	ExecInitResultTupleSlot(estate, &scanstate->ss.ps);
-	ExecInitScanTupleSlot(estate, &scanstate->ss);
+	ExecInitResultTupleSlotTL(estate, &scanstate->ss.ps);
 
 	/*
 	 * open the base relation, if any, and acquire an appropriate lock on it;
@@ -194,13 +185,13 @@ ExecInitForeignScan(ForeignScan *node, EState *estate, int eflags)
 		TupleDesc	scan_tupdesc;
 
 		scan_tupdesc = ExecTypeFromTL(node->fdw_scan_tlist, false);
-		ExecAssignScanType(&scanstate->ss, scan_tupdesc);
+		ExecInitScanTupleSlot(estate, &scanstate->ss, scan_tupdesc);
 		/* Node's targetlist will contain Vars with varno = INDEX_VAR */
 		tlistvarno = INDEX_VAR;
 	}
 	else
 	{
-		ExecAssignScanType(&scanstate->ss, RelationGetDescr(currentRelation));
+		ExecInitScanTupleSlot(estate, &scanstate->ss, RelationGetDescr(currentRelation));
 		/* Node's targetlist will contain Vars with varno = scanrelid */
 		tlistvarno = scanrelid;
 	}
@@ -208,9 +199,16 @@ ExecInitForeignScan(ForeignScan *node, EState *estate, int eflags)
 	/*
 	 * Initialize result tuple type and projection info.
 	 */
-	ExecAssignResultTypeFromTL(&scanstate->ss.ps);
 	ExecAssignScanProjectionInfoWithVarno(&scanstate->ss, tlistvarno);
 
+	/*
+	 * initialize child expressions
+	 */
+	scanstate->ss.ps.qual =
+		ExecInitQual(node->scan.plan.qual, (PlanState *) scanstate);
+	scanstate->fdw_recheck_quals =
+		ExecInitQual(node->fdw_recheck_quals, (PlanState *) scanstate);
+
 	/*
 	 * Initialize FDW-related state.
 	 */
diff --git a/src/backend/executor/nodeFunctionscan.c b/src/backend/executor/nodeFunctionscan.c
index 9f87a7e5cd..8d834820c1 100644
--- a/src/backend/executor/nodeFunctionscan.c
+++ b/src/backend/executor/nodeFunctionscan.c
@@ -334,18 +334,6 @@ ExecInitFunctionScan(FunctionScan *node, EState *estate, int eflags)
 	 */
 	ExecAssignExprContext(estate, &scanstate->ss.ps);
 
-	/*
-	 * tuple table initialization
-	 */
-	ExecInitResultTupleSlot(estate, &scanstate->ss.ps);
-	ExecInitScanTupleSlot(estate, &scanstate->ss);
-
-	/*
-	 * initialize child expressions
-	 */
-	scanstate->ss.ps.qual =
-		ExecInitQual(node->scan.plan.qual, (PlanState *) scanstate);
-
 	scanstate->funcstates = palloc(nfuncs * sizeof(FunctionScanPerFuncState));
 
 	natts = 0;
@@ -491,14 +479,24 @@ ExecInitFunctionScan(FunctionScan *node, EState *estate, int eflags)
 		Assert(attno == natts);
 	}
 
-	ExecAssignScanType(&scanstate->ss, scan_tupdesc);
+	/*
+	 * tuple table initialization
+	 */
+	ExecInitResultTupleSlotTL(estate, &scanstate->ss.ps);
+	ExecInitScanTupleSlot(estate, &scanstate->ss, scan_tupdesc);
 
 	/*
 	 * Initialize result tuple type and projection info.
 	 */
-	ExecAssignResultTypeFromTL(&scanstate->ss.ps);
 	ExecAssignScanProjectionInfo(&scanstate->ss);
 
+	/*
+	 * initialize child expressions
+	 */
+	scanstate->ss.ps.qual =
+		ExecInitQual(node->scan.plan.qual, (PlanState *) scanstate);
+
+
 	/*
 	 * Create a memory context that ExecMakeTableFunctionResult can use to
 	 * evaluate function arguments in.  We can't use the per-tuple context for
diff --git a/src/backend/executor/nodeGather.c b/src/backend/executor/nodeGather.c
index d93fbacdf9..7656aaaee2 100644
--- a/src/backend/executor/nodeGather.c
+++ b/src/backend/executor/nodeGather.c
@@ -93,7 +93,7 @@ ExecInitGather(Gather *node, EState *estate, int eflags)
 	 * tuple table initialization
 	 */
 	gatherstate->funnel_slot = ExecInitExtraTupleSlot(estate);
-	ExecInitResultTupleSlot(estate, &gatherstate->ps);
+	ExecInitResultTupleSlotTL(estate, &gatherstate->ps);
 
 	/*
 	 * now initialize outer plan
@@ -104,7 +104,6 @@ ExecInitGather(Gather *node, EState *estate, int eflags)
 	/*
 	 * Initialize result tuple type and projection info.
 	 */
-	ExecAssignResultTypeFromTL(&gatherstate->ps);
 	ExecAssignProjectionInfo(&gatherstate->ps, NULL);
 
 	/*
diff --git a/src/backend/executor/nodeGatherMerge.c b/src/backend/executor/nodeGatherMerge.c
index b8bb4f8eb0..b940fb3cb5 100644
--- a/src/backend/executor/nodeGatherMerge.c
+++ b/src/backend/executor/nodeGatherMerge.c
@@ -106,7 +106,7 @@ ExecInitGatherMerge(GatherMerge *node, EState *estate, int eflags)
 	/*
 	 * tuple table initialization
 	 */
-	ExecInitResultTupleSlot(estate, &gm_state->ps);
+	ExecInitResultTupleSlotTL(estate, &gm_state->ps);
 
 	/*
 	 * now initialize outer plan
@@ -117,7 +117,6 @@ ExecInitGatherMerge(GatherMerge *node, EState *estate, int eflags)
 	/*
 	 * Initialize result tuple type and projection info.
 	 */
-	ExecAssignResultTypeFromTL(&gm_state->ps);
 	ExecAssignProjectionInfo(&gm_state->ps, NULL);
 
 	/*
diff --git a/src/backend/executor/nodeGroup.c b/src/backend/executor/nodeGroup.c
index ab4ae24a6b..acd679fa14 100644
--- a/src/backend/executor/nodeGroup.c
+++ b/src/backend/executor/nodeGroup.c
@@ -187,14 +187,7 @@ ExecInitGroup(Group *node, EState *estate, int eflags)
 	/*
 	 * tuple table initialization
 	 */
-	ExecInitScanTupleSlot(estate, &grpstate->ss);
-	ExecInitResultTupleSlot(estate, &grpstate->ss.ps);
-
-	/*
-	 * initialize child expressions
-	 */
-	grpstate->ss.ps.qual =
-		ExecInitQual(node->plan.qual, (PlanState *) grpstate);
+	ExecInitResultTupleSlotTL(estate, &grpstate->ss.ps);
 
 	/*
 	 * initialize child nodes
@@ -204,14 +197,19 @@ ExecInitGroup(Group *node, EState *estate, int eflags)
 	/*
 	 * initialize tuple type.
 	 */
-	ExecAssignScanTypeFromOuterPlan(&grpstate->ss);
+	ExecCreateScanSlotForOuterPlan(estate, &grpstate->ss);
 
 	/*
 	 * Initialize result tuple type and projection info.
 	 */
-	ExecAssignResultTypeFromTL(&grpstate->ss.ps);
 	ExecAssignProjectionInfo(&grpstate->ss.ps, NULL);
 
+	/*
+	 * initialize child expressions
+	 */
+	grpstate->ss.ps.qual =
+		ExecInitQual(node->plan.qual, (PlanState *) grpstate);
+
 	/*
 	 * Precompute fmgr lookup data for inner loop
 	 */
diff --git a/src/backend/executor/nodeHash.c b/src/backend/executor/nodeHash.c
index d10d94ccc2..c551f319ac 100644
--- a/src/backend/executor/nodeHash.c
+++ b/src/backend/executor/nodeHash.c
@@ -186,7 +186,12 @@ ExecInitHash(Hash *node, EState *estate, int eflags)
 	/*
 	 * initialize our result slot
 	 */
-	ExecInitResultTupleSlot(estate, &hashstate->ps);
+	ExecInitResultTupleSlotTL(estate, &hashstate->ps);
+
+	/*
+	 * initialize child nodes
+	 */
+	outerPlanState(hashstate) = ExecInitNode(outerPlan(node), estate, eflags);
 
 	/*
 	 * initialize child expressions
@@ -194,16 +199,10 @@ ExecInitHash(Hash *node, EState *estate, int eflags)
 	hashstate->ps.qual =
 		ExecInitQual(node->plan.qual, (PlanState *) hashstate);
 
-	/*
-	 * initialize child nodes
-	 */
-	outerPlanState(hashstate) = ExecInitNode(outerPlan(node), estate, eflags);
-
 	/*
 	 * initialize tuple type. no need to initialize projection info because
 	 * this node doesn't do projections
 	 */
-	ExecAssignResultTypeFromTL(&hashstate->ps);
 	hashstate->ps.ps_ProjInfo = NULL;
 
 	return hashstate;
diff --git a/src/backend/executor/nodeHashjoin.c b/src/backend/executor/nodeHashjoin.c
index ab1632cc13..f35538924a 100644
--- a/src/backend/executor/nodeHashjoin.c
+++ b/src/backend/executor/nodeHashjoin.c
@@ -401,6 +401,7 @@ ExecInitHashJoin(HashJoin *node, EState *estate, int eflags)
 	hjstate->js.ps.plan = (Plan *) node;
 	hjstate->js.ps.state = estate;
 	hjstate->js.ps.ExecProcNode = ExecHashJoin;
+	hjstate->js.jointype = node->join.jointype;
 
 	/*
 	 * Miscellaneous initialization
@@ -409,17 +410,6 @@ ExecInitHashJoin(HashJoin *node, EState *estate, int eflags)
 	 */
 	ExecAssignExprContext(estate, &hjstate->js.ps);
 
-	/*
-	 * initialize child expressions
-	 */
-	hjstate->js.ps.qual =
-		ExecInitQual(node->join.plan.qual, (PlanState *) hjstate);
-	hjstate->js.jointype = node->join.jointype;
-	hjstate->js.joinqual =
-		ExecInitQual(node->join.joinqual, (PlanState *) hjstate);
-	hjstate->hashclauses =
-		ExecInitQual(node->hashclauses, (PlanState *) hjstate);
-
 	/*
 	 * initialize child nodes
 	 *
@@ -436,7 +426,7 @@ ExecInitHashJoin(HashJoin *node, EState *estate, int eflags)
 	/*
 	 * tuple table initialization
 	 */
-	ExecInitResultTupleSlot(estate, &hjstate->js.ps);
+	ExecInitResultTupleSlotTL(estate, &hjstate->js.ps);
 	hjstate->hj_OuterTupleSlot = ExecInitExtraTupleSlot(estate);
 
 	/*
@@ -492,12 +482,21 @@ ExecInitHashJoin(HashJoin *node, EState *estate, int eflags)
 	/*
 	 * initialize tuple type and projection info
 	 */
-	ExecAssignResultTypeFromTL(&hjstate->js.ps);
 	ExecAssignProjectionInfo(&hjstate->js.ps, NULL);
 
 	ExecSetSlotDescriptor(hjstate->hj_OuterTupleSlot,
 						  ExecGetResultType(outerPlanState(hjstate)));
 
+	/*
+	 * initialize child expressions
+	 */
+	hjstate->js.ps.qual =
+		ExecInitQual(node->join.plan.qual, (PlanState *) hjstate);
+	hjstate->js.joinqual =
+		ExecInitQual(node->join.joinqual, (PlanState *) hjstate);
+	hjstate->hashclauses =
+		ExecInitQual(node->hashclauses, (PlanState *) hjstate);
+
 	/*
 	 * initialize hash-specific info
 	 */
diff --git a/src/backend/executor/nodeIndexonlyscan.c b/src/backend/executor/nodeIndexonlyscan.c
index 5351cb8981..479d6b3e0a 100644
--- a/src/backend/executor/nodeIndexonlyscan.c
+++ b/src/backend/executor/nodeIndexonlyscan.c
@@ -474,22 +474,10 @@ ExecInitIndexOnlyScan(IndexOnlyScan *node, EState *estate, int eflags)
 	 */
 	ExecAssignExprContext(estate, &indexstate->ss.ps);
 
-	/*
-	 * initialize child expressions
-	 *
-	 * Note: we don't initialize all of the indexorderby expression, only the
-	 * sub-parts corresponding to runtime keys (see below).
-	 */
-	indexstate->ss.ps.qual =
-		ExecInitQual(node->scan.plan.qual, (PlanState *) indexstate);
-	indexstate->indexqual =
-		ExecInitQual(node->indexqual, (PlanState *) indexstate);
-
 	/*
 	 * tuple table initialization
 	 */
-	ExecInitResultTupleSlot(estate, &indexstate->ss.ps);
-	ExecInitScanTupleSlot(estate, &indexstate->ss);
+	ExecInitResultTupleSlotTL(estate, &indexstate->ss.ps);
 
 	/*
 	 * open the base relation and acquire appropriate lock on it.
@@ -507,16 +495,26 @@ ExecInitIndexOnlyScan(IndexOnlyScan *node, EState *estate, int eflags)
 	 * suitable data anyway.)
 	 */
 	tupDesc = ExecTypeFromTL(node->indextlist, false);
-	ExecAssignScanType(&indexstate->ss, tupDesc);
+	ExecInitScanTupleSlot(estate, &indexstate->ss, tupDesc);
 
 	/*
 	 * Initialize result tuple type and projection info.  The node's
 	 * targetlist will contain Vars with varno = INDEX_VAR, referencing the
 	 * scan tuple.
 	 */
-	ExecAssignResultTypeFromTL(&indexstate->ss.ps);
 	ExecAssignScanProjectionInfoWithVarno(&indexstate->ss, INDEX_VAR);
 
+	/*
+	 * initialize child expressions
+	 *
+	 * Note: we don't initialize all of the indexorderby expression, only the
+	 * sub-parts corresponding to runtime keys (see below).
+	 */
+	indexstate->ss.ps.qual =
+		ExecInitQual(node->scan.plan.qual, (PlanState *) indexstate);
+	indexstate->indexqual =
+		ExecInitQual(node->indexqual, (PlanState *) indexstate);
+
 	/*
 	 * If we are just doing EXPLAIN (ie, aren't going to run the plan), stop
 	 * here.  This allows an index-advisor plugin to EXPLAIN a plan containing
diff --git a/src/backend/executor/nodeIndexscan.c b/src/backend/executor/nodeIndexscan.c
index 638b17b07c..998a39418c 100644
--- a/src/backend/executor/nodeIndexscan.c
+++ b/src/backend/executor/nodeIndexscan.c
@@ -900,6 +900,30 @@ ExecInitIndexScan(IndexScan *node, EState *estate, int eflags)
 	 */
 	ExecAssignExprContext(estate, &indexstate->ss.ps);
 
+	/*
+	 * open the base relation and acquire appropriate lock on it.
+	 */
+	currentRelation = ExecOpenScanRelation(estate, node->scan.scanrelid, eflags);
+
+	indexstate->ss.ss_currentRelation = currentRelation;
+	indexstate->ss.ss_currentScanDesc = NULL;	/* no heap scan here */
+
+	/*
+	 * tuple table initialization
+	 */
+	ExecInitResultTupleSlotTL(estate, &indexstate->ss.ps);
+
+	/*
+	 * get the scan type from the relation descriptor.
+	 */
+	ExecInitScanTupleSlot(estate, &indexstate->ss,
+						  RelationGetDescr(currentRelation));
+
+	/*
+	 * Initialize result tuple type and projection info.
+	 */
+	ExecAssignScanProjectionInfo(&indexstate->ss);
+
 	/*
 	 * initialize child expressions
 	 *
@@ -917,31 +941,6 @@ ExecInitIndexScan(IndexScan *node, EState *estate, int eflags)
 	indexstate->indexorderbyorig =
 		ExecInitExprList(node->indexorderbyorig, (PlanState *) indexstate);
 
-	/*
-	 * tuple table initialization
-	 */
-	ExecInitResultTupleSlot(estate, &indexstate->ss.ps);
-	ExecInitScanTupleSlot(estate, &indexstate->ss);
-
-	/*
-	 * open the base relation and acquire appropriate lock on it.
-	 */
-	currentRelation = ExecOpenScanRelation(estate, node->scan.scanrelid, eflags);
-
-	indexstate->ss.ss_currentRelation = currentRelation;
-	indexstate->ss.ss_currentScanDesc = NULL;	/* no heap scan here */
-
-	/*
-	 * get the scan type from the relation descriptor.
-	 */
-	ExecAssignScanType(&indexstate->ss, RelationGetDescr(currentRelation));
-
-	/*
-	 * Initialize result tuple type and projection info.
-	 */
-	ExecAssignResultTypeFromTL(&indexstate->ss.ps);
-	ExecAssignScanProjectionInfo(&indexstate->ss);
-
 	/*
 	 * If we are just doing EXPLAIN (ie, aren't going to run the plan), stop
 	 * here.  This allows an index-advisor plugin to EXPLAIN a plan containing
diff --git a/src/backend/executor/nodeLimit.c b/src/backend/executor/nodeLimit.c
index 883f46ce7c..0eed8f74b1 100644
--- a/src/backend/executor/nodeLimit.c
+++ b/src/backend/executor/nodeLimit.c
@@ -364,7 +364,7 @@ ExecInitLimit(Limit *node, EState *estate, int eflags)
 	/*
 	 * Tuple table initialization (XXX not actually used...)
 	 */
-	ExecInitResultTupleSlot(estate, &limitstate->ps);
+	ExecInitResultTupleSlotTL(estate, &limitstate->ps);
 
 	/*
 	 * then initialize outer plan
@@ -376,7 +376,6 @@ ExecInitLimit(Limit *node, EState *estate, int eflags)
 	 * limit nodes do no projections, so initialize projection info for this
 	 * node appropriately
 	 */
-	ExecAssignResultTypeFromTL(&limitstate->ps);
 	limitstate->ps.ps_ProjInfo = NULL;
 
 	return limitstate;
diff --git a/src/backend/executor/nodeLockRows.c b/src/backend/executor/nodeLockRows.c
index 93895600a5..9dfb2f4524 100644
--- a/src/backend/executor/nodeLockRows.c
+++ b/src/backend/executor/nodeLockRows.c
@@ -367,16 +367,10 @@ ExecInitLockRows(LockRows *node, EState *estate, int eflags)
 	lrstate->ps.state = estate;
 	lrstate->ps.ExecProcNode = ExecLockRows;
 
-	/*
-	 * Miscellaneous initialization
-	 *
-	 * LockRows nodes never call ExecQual or ExecProject.
-	 */
-
 	/*
 	 * Tuple table initialization (XXX not actually used...)
 	 */
-	ExecInitResultTupleSlot(estate, &lrstate->ps);
+	ExecInitResultTupleSlotTL(estate, &lrstate->ps);
 
 	/*
 	 * then initialize outer plan
@@ -387,9 +381,14 @@ ExecInitLockRows(LockRows *node, EState *estate, int eflags)
 	 * LockRows nodes do no projections, so initialize projection info for
 	 * this node appropriately
 	 */
-	ExecAssignResultTypeFromTL(&lrstate->ps);
 	lrstate->ps.ps_ProjInfo = NULL;
 
+	/*
+	 * Miscellaneous initialization
+	 *
+	 * LockRows nodes never call ExecQual or ExecProject.
+	 */
+
 	/*
 	 * Create workspace in which we can remember per-RTE locked tuples
 	 */
diff --git a/src/backend/executor/nodeMaterial.c b/src/backend/executor/nodeMaterial.c
index 91178f1019..470d3ed717 100644
--- a/src/backend/executor/nodeMaterial.c
+++ b/src/backend/executor/nodeMaterial.c
@@ -199,20 +199,12 @@ ExecInitMaterial(Material *node, EState *estate, int eflags)
 	matstate->eof_underlying = false;
 	matstate->tuplestorestate = NULL;
 
-	/*
-	 * Miscellaneous initialization
-	 *
-	 * Materialization nodes don't need ExprContexts because they never call
-	 * ExecQual or ExecProject.
-	 */
-
 	/*
 	 * tuple table initialization
 	 *
 	 * material nodes only return tuples from their materialized relation.
 	 */
-	ExecInitResultTupleSlot(estate, &matstate->ss.ps);
-	ExecInitScanTupleSlot(estate, &matstate->ss);
+	ExecInitResultTupleSlotTL(estate, &matstate->ss.ps);
 
 	/*
 	 * initialize child nodes
@@ -229,10 +221,16 @@ ExecInitMaterial(Material *node, EState *estate, int eflags)
 	 * initialize tuple type.  no need to initialize projection info because
 	 * this node doesn't do projections.
 	 */
-	ExecAssignResultTypeFromTL(&matstate->ss.ps);
-	ExecAssignScanTypeFromOuterPlan(&matstate->ss);
+	ExecCreateScanSlotForOuterPlan(estate, &matstate->ss);
 	matstate->ss.ps.ps_ProjInfo = NULL;
 
+	/*
+	 * Miscellaneous initialization
+	 *
+	 * Materialization nodes don't need ExprContexts because they never call
+	 * ExecQual or ExecProject.
+	 */
+
 	return matstate;
 }
 
diff --git a/src/backend/executor/nodeMergeAppend.c b/src/backend/executor/nodeMergeAppend.c
index 6bf490bd70..f50464fd7d 100644
--- a/src/backend/executor/nodeMergeAppend.c
+++ b/src/backend/executor/nodeMergeAppend.c
@@ -109,7 +109,7 @@ ExecInitMergeAppend(MergeAppend *node, EState *estate, int eflags)
 	 * MergeAppend nodes do have Result slots, which hold pointers to tuples,
 	 * so we have to initialize them.
 	 */
-	ExecInitResultTupleSlot(estate, &mergestate->ps);
+	ExecInitResultTupleSlotTL(estate, &mergestate->ps);
 
 	/*
 	 * call ExecInitNode on each of the plans to be executed and save the
@@ -127,7 +127,6 @@ ExecInitMergeAppend(MergeAppend *node, EState *estate, int eflags)
 	/*
 	 * initialize output tuple type
 	 */
-	ExecAssignResultTypeFromTL(&mergestate->ps);
 	mergestate->ps.ps_ProjInfo = NULL;
 
 	/*
diff --git a/src/backend/executor/nodeMergejoin.c b/src/backend/executor/nodeMergejoin.c
index 925b4cf553..b11af73aaa 100644
--- a/src/backend/executor/nodeMergejoin.c
+++ b/src/backend/executor/nodeMergejoin.c
@@ -1450,6 +1450,8 @@ ExecInitMergeJoin(MergeJoin *node, EState *estate, int eflags)
 	mergestate->js.ps.plan = (Plan *) node;
 	mergestate->js.ps.state = estate;
 	mergestate->js.ps.ExecProcNode = ExecMergeJoin;
+	mergestate->js.jointype = node->join.jointype;
+	mergestate->mj_ConstFalseJoin = false;
 
 	/*
 	 * Miscellaneous initialization
@@ -1466,17 +1468,6 @@ ExecInitMergeJoin(MergeJoin *node, EState *estate, int eflags)
 	mergestate->mj_OuterEContext = CreateExprContext(estate);
 	mergestate->mj_InnerEContext = CreateExprContext(estate);
 
-	/*
-	 * initialize child expressions
-	 */
-	mergestate->js.ps.qual =
-		ExecInitQual(node->join.plan.qual, (PlanState *) mergestate);
-	mergestate->js.jointype = node->join.jointype;
-	mergestate->js.joinqual =
-		ExecInitQual(node->join.joinqual, (PlanState *) mergestate);
-	mergestate->mj_ConstFalseJoin = false;
-	/* mergeclauses are handled below */
-
 	/*
 	 * initialize child nodes
 	 *
@@ -1513,12 +1504,21 @@ ExecInitMergeJoin(MergeJoin *node, EState *estate, int eflags)
 	/*
 	 * tuple table initialization
 	 */
-	ExecInitResultTupleSlot(estate, &mergestate->js.ps);
+	ExecInitResultTupleSlotTL(estate, &mergestate->js.ps);
 
 	mergestate->mj_MarkedTupleSlot = ExecInitExtraTupleSlot(estate);
 	ExecSetSlotDescriptor(mergestate->mj_MarkedTupleSlot,
 						  ExecGetResultType(innerPlanState(mergestate)));
 
+	/*
+	 * initialize child expressions
+	 */
+	mergestate->js.ps.qual =
+		ExecInitQual(node->join.plan.qual, (PlanState *) mergestate);
+	mergestate->js.joinqual =
+		ExecInitQual(node->join.joinqual, (PlanState *) mergestate);
+	/* mergeclauses are handled below */
+
 	/*
 	 * detect whether we need only consider the first matching inner tuple
 	 */
@@ -1586,7 +1586,6 @@ ExecInitMergeJoin(MergeJoin *node, EState *estate, int eflags)
 	/*
 	 * initialize tuple type and projection info
 	 */
-	ExecAssignResultTypeFromTL(&mergestate->js.ps);
 	ExecAssignProjectionInfo(&mergestate->js.ps, NULL);
 
 	/*
diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c
index 57946e1591..1e76ef7dd4 100644
--- a/src/backend/executor/nodeModifyTable.c
+++ b/src/backend/executor/nodeModifyTable.c
@@ -2029,8 +2029,7 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
 		mtstate->ps.plan->targetlist = (List *) linitial(node->returningLists);
 
 		/* Set up a slot for the output of the RETURNING projection(s) */
-		ExecInitResultTupleSlot(estate, &mtstate->ps);
-		ExecAssignResultTypeFromTL(&mtstate->ps);
+		ExecInitResultTupleSlotTL(estate, &mtstate->ps);
 		slot = mtstate->ps.ps_ResultTupleSlot;
 
 		/* Need an econtext too */
@@ -2083,8 +2082,7 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
 		 * expects one (maybe should change that?).
 		 */
 		mtstate->ps.plan->targetlist = NIL;
-		ExecInitResultTupleSlot(estate, &mtstate->ps);
-		ExecAssignResultTypeFromTL(&mtstate->ps);
+		ExecInitResultTupleSlotTL(estate, &mtstate->ps);
 
 		mtstate->ps.ps_ExprContext = NULL;
 	}
diff --git a/src/backend/executor/nodeNamedtuplestorescan.c b/src/backend/executor/nodeNamedtuplestorescan.c
index 3a65b9f5dc..28036d5076 100644
--- a/src/backend/executor/nodeNamedtuplestorescan.c
+++ b/src/backend/executor/nodeNamedtuplestorescan.c
@@ -132,27 +132,21 @@ ExecInitNamedTuplestoreScan(NamedTuplestoreScan *node, EState *estate, int eflag
 	 */
 	ExecAssignExprContext(estate, &scanstate->ss.ps);
 
+	/*
+	 * tuple table initialization
+	 */
+	ExecInitResultTupleSlotTL(estate, &scanstate->ss.ps);
+	ExecInitScanTupleSlot(estate, &scanstate->ss, scanstate->tupdesc);
+
 	/*
 	 * initialize child expressions
 	 */
 	scanstate->ss.ps.qual =
 		ExecInitQual(node->scan.plan.qual, (PlanState *) scanstate);
 
-	/*
-	 * tuple table initialization
-	 */
-	ExecInitResultTupleSlot(estate, &scanstate->ss.ps);
-	ExecInitScanTupleSlot(estate, &scanstate->ss);
-
-	/*
-	 * The scan tuple type is specified for the tuplestore.
-	 */
-	ExecAssignScanType(&scanstate->ss, scanstate->tupdesc);
-
 	/*
 	 * Initialize result tuple type and projection info.
 	 */
-	ExecAssignResultTypeFromTL(&scanstate->ss.ps);
 	ExecAssignScanProjectionInfo(&scanstate->ss);
 
 	return scanstate;
diff --git a/src/backend/executor/nodeNestloop.c b/src/backend/executor/nodeNestloop.c
index 4447b7c051..32c1544f4f 100644
--- a/src/backend/executor/nodeNestloop.c
+++ b/src/backend/executor/nodeNestloop.c
@@ -285,15 +285,6 @@ ExecInitNestLoop(NestLoop *node, EState *estate, int eflags)
 	 */
 	ExecAssignExprContext(estate, &nlstate->js.ps);
 
-	/*
-	 * initialize child expressions
-	 */
-	nlstate->js.ps.qual =
-		ExecInitQual(node->join.plan.qual, (PlanState *) nlstate);
-	nlstate->js.jointype = node->join.jointype;
-	nlstate->js.joinqual =
-		ExecInitQual(node->join.joinqual, (PlanState *) nlstate);
-
 	/*
 	 * initialize child nodes
 	 *
@@ -313,7 +304,16 @@ ExecInitNestLoop(NestLoop *node, EState *estate, int eflags)
 	/*
 	 * tuple table initialization
 	 */
-	ExecInitResultTupleSlot(estate, &nlstate->js.ps);
+	ExecInitResultTupleSlotTL(estate, &nlstate->js.ps);
+
+	/*
+	 * initialize child expressions
+	 */
+	nlstate->js.ps.qual =
+		ExecInitQual(node->join.plan.qual, (PlanState *) nlstate);
+	nlstate->js.jointype = node->join.jointype;
+	nlstate->js.joinqual =
+		ExecInitQual(node->join.joinqual, (PlanState *) nlstate);
 
 	/*
 	 * detect whether we need only consider the first matching inner tuple
@@ -341,7 +341,6 @@ ExecInitNestLoop(NestLoop *node, EState *estate, int eflags)
 	/*
 	 * initialize tuple type and projection info
 	 */
-	ExecAssignResultTypeFromTL(&nlstate->js.ps);
 	ExecAssignProjectionInfo(&nlstate->js.ps, NULL);
 
 	/*
diff --git a/src/backend/executor/nodeProjectSet.c b/src/backend/executor/nodeProjectSet.c
index d93462c542..c55a5fded0 100644
--- a/src/backend/executor/nodeProjectSet.c
+++ b/src/backend/executor/nodeProjectSet.c
@@ -230,7 +230,7 @@ ExecInitProjectSet(ProjectSet *node, EState *estate, int eflags)
 	/*
 	 * tuple table initialization
 	 */
-	ExecInitResultTupleSlot(estate, &state->ps);
+	ExecInitResultTupleSlotTL(estate, &state->ps);
 
 	/* We don't support any qual on ProjectSet nodes */
 	Assert(node->plan.qual == NIL);
@@ -248,7 +248,6 @@ ExecInitProjectSet(ProjectSet *node, EState *estate, int eflags)
 	/*
 	 * initialize tuple type and projection info
 	 */
-	ExecAssignResultTypeFromTL(&state->ps);
 
 	/* Create workspace for per-tlist-entry expr state & SRF-is-done state */
 	state->nelems = list_length(node->plan.targetlist);
diff --git a/src/backend/executor/nodeRecursiveunion.c b/src/backend/executor/nodeRecursiveunion.c
index a64dd1397a..3c1f9ac7c6 100644
--- a/src/backend/executor/nodeRecursiveunion.c
+++ b/src/backend/executor/nodeRecursiveunion.c
@@ -214,6 +214,26 @@ ExecInitRecursiveUnion(RecursiveUnion *node, EState *estate, int eflags)
 	prmdata->value = PointerGetDatum(rustate);
 	prmdata->isnull = false;
 
+
+	/*
+	 * initialize child nodes
+	 */
+	outerPlanState(rustate) = ExecInitNode(outerPlan(node), estate, eflags);
+	innerPlanState(rustate) = ExecInitNode(innerPlan(node), estate, eflags);
+
+	/*
+	 * RecursiveUnion nodes still have Result slots, which hold pointers to
+	 * tuples, so we have to initialize them.
+	 */
+	ExecInitResultTupleSlotTL(estate, &rustate->ps);
+
+	/*
+	 * Initialize result tuple type and projection info.  (Note: we have to
+	 * set up the result type before initializing child nodes, because
+	 * nodeWorktablescan.c expects it to be valid.)
+	 */
+	rustate->ps.ps_ProjInfo = NULL;
+
 	/*
 	 * Miscellaneous initialization
 	 *
@@ -222,26 +242,6 @@ ExecInitRecursiveUnion(RecursiveUnion *node, EState *estate, int eflags)
 	 */
 	Assert(node->plan.qual == NIL);
 
-	/*
-	 * RecursiveUnion nodes still have Result slots, which hold pointers to
-	 * tuples, so we have to initialize them.
-	 */
-	ExecInitResultTupleSlot(estate, &rustate->ps);
-
-	/*
-	 * Initialize result tuple type and projection info.  (Note: we have to
-	 * set up the result type before initializing child nodes, because
-	 * nodeWorktablescan.c expects it to be valid.)
-	 */
-	ExecAssignResultTypeFromTL(&rustate->ps);
-	rustate->ps.ps_ProjInfo = NULL;
-
-	/*
-	 * initialize child nodes
-	 */
-	outerPlanState(rustate) = ExecInitNode(outerPlan(node), estate, eflags);
-	innerPlanState(rustate) = ExecInitNode(innerPlan(node), estate, eflags);
-
 	/*
 	 * If hashing, precompute fmgr lookup data for inner loop, and create the
 	 * hash table.
diff --git a/src/backend/executor/nodeResult.c b/src/backend/executor/nodeResult.c
index 4c879d8765..7767c7426f 100644
--- a/src/backend/executor/nodeResult.c
+++ b/src/backend/executor/nodeResult.c
@@ -204,19 +204,6 @@ ExecInitResult(Result *node, EState *estate, int eflags)
 	 */
 	ExecAssignExprContext(estate, &resstate->ps);
 
-	/*
-	 * tuple table initialization
-	 */
-	ExecInitResultTupleSlot(estate, &resstate->ps);
-
-	/*
-	 * initialize child expressions
-	 */
-	resstate->ps.qual =
-		ExecInitQual(node->plan.qual, (PlanState *) resstate);
-	resstate->resconstantqual =
-		ExecInitQual((List *) node->resconstantqual, (PlanState *) resstate);
-
 	/*
 	 * initialize child nodes
 	 */
@@ -227,12 +214,24 @@ ExecInitResult(Result *node, EState *estate, int eflags)
 	 */
 	Assert(innerPlan(node) == NULL);
 
+	/*
+	 * tuple table initialization
+	 */
+	ExecInitResultTupleSlotTL(estate, &resstate->ps);
+
 	/*
 	 * initialize tuple type and projection info
 	 */
-	ExecAssignResultTypeFromTL(&resstate->ps);
 	ExecAssignProjectionInfo(&resstate->ps, NULL);
 
+	/*
+	 * initialize child expressions
+	 */
+	resstate->ps.qual =
+		ExecInitQual(node->plan.qual, (PlanState *) resstate);
+	resstate->resconstantqual =
+		ExecInitQual((List *) node->resconstantqual, (PlanState *) resstate);
+
 	return resstate;
 }
 
diff --git a/src/backend/executor/nodeSamplescan.c b/src/backend/executor/nodeSamplescan.c
index 9c74a836e4..89f2a78d14 100644
--- a/src/backend/executor/nodeSamplescan.c
+++ b/src/backend/executor/nodeSamplescan.c
@@ -26,7 +26,6 @@
 #include "utils/rel.h"
 #include "utils/tqual.h"
 
-static void InitScanRelation(SampleScanState *node, EState *estate, int eflags);
 static TupleTableSlot *SampleNext(SampleScanState *node);
 static void tablesample_init(SampleScanState *scanstate);
 static HeapTuple tablesample_getnext(SampleScanState *scanstate);
@@ -106,35 +105,6 @@ ExecSampleScan(PlanState *pstate)
 					(ExecScanRecheckMtd) SampleRecheck);
 }
 
-/* ----------------------------------------------------------------
- *		InitScanRelation
- *
- *		Set up to access the scan relation.
- * ----------------------------------------------------------------
- */
-static void
-InitScanRelation(SampleScanState *node, EState *estate, int eflags)
-{
-	Relation	currentRelation;
-
-	/*
-	 * get the relation object id from the relid'th entry in the range table,
-	 * open that relation and acquire appropriate lock on it.
-	 */
-	currentRelation = ExecOpenScanRelation(estate,
-										   ((SampleScan *) node->ss.ps.plan)->scan.scanrelid,
-										   eflags);
-
-	node->ss.ss_currentRelation = currentRelation;
-
-	/* we won't set up the HeapScanDesc till later */
-	node->ss.ss_currentScanDesc = NULL;
-
-	/* and report the scan tuple slot's rowtype */
-	ExecAssignScanType(&node->ss, RelationGetDescr(currentRelation));
-}
-
-
 /* ----------------------------------------------------------------
  *		ExecInitSampleScan
  * ----------------------------------------------------------------
@@ -164,6 +134,36 @@ ExecInitSampleScan(SampleScan *node, EState *estate, int eflags)
 	 */
 	ExecAssignExprContext(estate, &scanstate->ss.ps);
 
+	/*
+	 * tuple table initialization
+	 */
+	ExecInitResultTupleSlotTL(estate, &scanstate->ss.ps);
+
+	/*
+	 * initialize scan relation
+	 */
+
+	/*
+	 * get the relation object id from the relid'th entry in the range table,
+	 * open that relation and acquire appropriate lock on it.
+	 */
+	scanstate->ss.ss_currentRelation =
+		ExecOpenScanRelation(estate,
+							 node->scan.scanrelid,
+							 eflags);
+
+	/* we won't set up the HeapScanDesc till later */
+	scanstate->ss.ss_currentScanDesc = NULL;
+
+	/* and create slot with appropriate rowtype */
+	ExecInitScanTupleSlot(estate, &scanstate->ss,
+						  RelationGetDescr(scanstate->ss.ss_currentRelation));
+
+	/*
+	 * Initialize result tuple type and projection info.
+	 */
+	ExecAssignScanProjectionInfo(&scanstate->ss);
+
 	/*
 	 * initialize child expressions
 	 */
@@ -174,23 +174,6 @@ ExecInitSampleScan(SampleScan *node, EState *estate, int eflags)
 	scanstate->repeatable =
 		ExecInitExpr(tsc->repeatable, (PlanState *) scanstate);
 
-	/*
-	 * tuple table initialization
-	 */
-	ExecInitResultTupleSlot(estate, &scanstate->ss.ps);
-	ExecInitScanTupleSlot(estate, &scanstate->ss);
-
-	/*
-	 * initialize scan relation
-	 */
-	InitScanRelation(scanstate, estate, eflags);
-
-	/*
-	 * Initialize result tuple type and projection info.
-	 */
-	ExecAssignResultTypeFromTL(&scanstate->ss.ps);
-	ExecAssignScanProjectionInfo(&scanstate->ss);
-
 	/*
 	 * If we don't have a REPEATABLE clause, select a random seed.  We want to
 	 * do this just once, since the seed shouldn't change over rescans.
diff --git a/src/backend/executor/nodeSeqscan.c b/src/backend/executor/nodeSeqscan.c
index d4ac939c9b..da2bb69583 100644
--- a/src/backend/executor/nodeSeqscan.c
+++ b/src/backend/executor/nodeSeqscan.c
@@ -32,7 +32,6 @@
 #include "executor/nodeSeqscan.h"
 #include "utils/rel.h"
 
-static void InitScanRelation(SeqScanState *node, EState *estate, int eflags);
 static TupleTableSlot *SeqNext(SeqScanState *node);
 
 /* ----------------------------------------------------------------
@@ -132,31 +131,6 @@ ExecSeqScan(PlanState *pstate)
 					(ExecScanRecheckMtd) SeqRecheck);
 }
 
-/* ----------------------------------------------------------------
- *		InitScanRelation
- *
- *		Set up to access the scan relation.
- * ----------------------------------------------------------------
- */
-static void
-InitScanRelation(SeqScanState *node, EState *estate, int eflags)
-{
-	Relation	currentRelation;
-
-	/*
-	 * get the relation object id from the relid'th entry in the range table,
-	 * open that relation and acquire appropriate lock on it.
-	 */
-	currentRelation = ExecOpenScanRelation(estate,
-										   ((SeqScan *) node->ss.ps.plan)->scanrelid,
-										   eflags);
-
-	node->ss.ss_currentRelation = currentRelation;
-
-	/* and report the scan tuple slot's rowtype */
-	ExecAssignScanType(&node->ss, RelationGetDescr(currentRelation));
-}
-
 
 /* ----------------------------------------------------------------
  *		ExecInitSeqScan
@@ -189,29 +163,39 @@ ExecInitSeqScan(SeqScan *node, EState *estate, int eflags)
 	 */
 	ExecAssignExprContext(estate, &scanstate->ss.ps);
 
-	/*
-	 * initialize child expressions
-	 */
-	scanstate->ss.ps.qual =
-		ExecInitQual(node->plan.qual, (PlanState *) scanstate);
-
 	/*
 	 * tuple table initialization
 	 */
-	ExecInitResultTupleSlot(estate, &scanstate->ss.ps);
-	ExecInitScanTupleSlot(estate, &scanstate->ss);
+	ExecInitResultTupleSlotTL(estate, &scanstate->ss.ps);
 
 	/*
 	 * initialize scan relation
 	 */
-	InitScanRelation(scanstate, estate, eflags);
+
+	/*
+	 * get the relation object id from the relid'th entry in the range table,
+	 * open that relation and acquire appropriate lock on it.
+	 */
+	scanstate->ss.ss_currentRelation =
+		ExecOpenScanRelation(estate,
+							 node->scanrelid,
+							 eflags);
+
+	/* and create slot with the appropriate rowtype */
+	ExecInitScanTupleSlot(estate, &scanstate->ss,
+						  RelationGetDescr(scanstate->ss.ss_currentRelation));
 
 	/*
 	 * Initialize result tuple type and projection info.
 	 */
-	ExecAssignResultTypeFromTL(&scanstate->ss.ps);
 	ExecAssignScanProjectionInfo(&scanstate->ss);
 
+	/*
+	 * initialize child expressions
+	 */
+	scanstate->ss.ps.qual =
+		ExecInitQual(node->plan.qual, (PlanState *) scanstate);
+
 	return scanstate;
 }
 
diff --git a/src/backend/executor/nodeSetOp.c b/src/backend/executor/nodeSetOp.c
index 571cbf86b1..126e65d4c7 100644
--- a/src/backend/executor/nodeSetOp.c
+++ b/src/backend/executor/nodeSetOp.c
@@ -523,7 +523,7 @@ ExecInitSetOp(SetOp *node, EState *estate, int eflags)
 	/*
 	 * Tuple table initialization
 	 */
-	ExecInitResultTupleSlot(estate, &setopstate->ps);
+	ExecInitResultTupleSlotTL(estate, &setopstate->ps);
 
 	/*
 	 * initialize child nodes
@@ -539,7 +539,6 @@ ExecInitSetOp(SetOp *node, EState *estate, int eflags)
 	 * setop nodes do no projections, so initialize projection info for this
 	 * node appropriately
 	 */
-	ExecAssignResultTypeFromTL(&setopstate->ps);
 	setopstate->ps.ps_ProjInfo = NULL;
 
 	/*
diff --git a/src/backend/executor/nodeSort.c b/src/backend/executor/nodeSort.c
index 98bcaeb66f..de4733bb19 100644
--- a/src/backend/executor/nodeSort.c
+++ b/src/backend/executor/nodeSort.c
@@ -191,20 +191,12 @@ ExecInitSort(Sort *node, EState *estate, int eflags)
 	sortstate->sort_Done = false;
 	sortstate->tuplesortstate = NULL;
 
-	/*
-	 * Miscellaneous initialization
-	 *
-	 * Sort nodes don't initialize their ExprContexts because they never call
-	 * ExecQual or ExecProject.
-	 */
-
 	/*
 	 * tuple table initialization
 	 *
 	 * sort nodes only return scan tuples from their sorted relation.
 	 */
-	ExecInitResultTupleSlot(estate, &sortstate->ss.ps);
-	ExecInitScanTupleSlot(estate, &sortstate->ss);
+	ExecInitResultTupleSlotTL(estate, &sortstate->ss.ps);
 
 	/*
 	 * initialize child nodes
@@ -220,10 +212,16 @@ ExecInitSort(Sort *node, EState *estate, int eflags)
 	 * initialize tuple type.  no need to initialize projection info because
 	 * this node doesn't do projections.
 	 */
-	ExecAssignResultTypeFromTL(&sortstate->ss.ps);
-	ExecAssignScanTypeFromOuterPlan(&sortstate->ss);
+	ExecCreateScanSlotForOuterPlan(estate, &sortstate->ss);
 	sortstate->ss.ps.ps_ProjInfo = NULL;
 
+	/*
+	 * Miscellaneous initialization
+	 *
+	 * Sort nodes don't initialize their ExprContexts because they never call
+	 * ExecQual or ExecProject.
+	 */
+
 	SO1_printf("ExecInitSort: %s\n",
 			   "sort node initialized");
 
diff --git a/src/backend/executor/nodeSubqueryscan.c b/src/backend/executor/nodeSubqueryscan.c
index 088c92992e..93f582eb02 100644
--- a/src/backend/executor/nodeSubqueryscan.c
+++ b/src/backend/executor/nodeSubqueryscan.c
@@ -120,17 +120,10 @@ ExecInitSubqueryScan(SubqueryScan *node, EState *estate, int eflags)
 	 */
 	ExecAssignExprContext(estate, &subquerystate->ss.ps);
 
-	/*
-	 * initialize child expressions
-	 */
-	subquerystate->ss.ps.qual =
-		ExecInitQual(node->scan.plan.qual, (PlanState *) subquerystate);
-
 	/*
 	 * tuple table initialization
 	 */
-	ExecInitResultTupleSlot(estate, &subquerystate->ss.ps);
-	ExecInitScanTupleSlot(estate, &subquerystate->ss);
+	ExecInitResultTupleSlotTL(estate, &subquerystate->ss.ps);
 
 	/*
 	 * initialize subquery
@@ -140,15 +133,20 @@ ExecInitSubqueryScan(SubqueryScan *node, EState *estate, int eflags)
 	/*
 	 * Initialize scan tuple type (needed by ExecAssignScanProjectionInfo)
 	 */
-	ExecAssignScanType(&subquerystate->ss,
+	ExecInitScanTupleSlot(estate, &subquerystate->ss,
 					   ExecGetResultType(subquerystate->subplan));
 
 	/*
 	 * Initialize result tuple type and projection info.
 	 */
-	ExecAssignResultTypeFromTL(&subquerystate->ss.ps);
 	ExecAssignScanProjectionInfo(&subquerystate->ss);
 
+	/*
+	 * initialize child expressions
+	 */
+	subquerystate->ss.ps.qual =
+		ExecInitQual(node->scan.plan.qual, (PlanState *) subquerystate);
+
 	return subquerystate;
 }
 
diff --git a/src/backend/executor/nodeTableFuncscan.c b/src/backend/executor/nodeTableFuncscan.c
index 165fae8c83..d10d8b8097 100644
--- a/src/backend/executor/nodeTableFuncscan.c
+++ b/src/backend/executor/nodeTableFuncscan.c
@@ -139,18 +139,6 @@ ExecInitTableFuncScan(TableFuncScan *node, EState *estate, int eflags)
 	 */
 	ExecAssignExprContext(estate, &scanstate->ss.ps);
 
-	/*
-	 * initialize child expressions
-	 */
-	scanstate->ss.ps.qual =
-		ExecInitQual(node->scan.plan.qual, &scanstate->ss.ps);
-
-	/*
-	 * tuple table initialization
-	 */
-	ExecInitResultTupleSlot(estate, &scanstate->ss.ps);
-	ExecInitScanTupleSlot(estate, &scanstate->ss);
-
 	/*
 	 * initialize source tuple type
 	 */
@@ -159,14 +147,23 @@ ExecInitTableFuncScan(TableFuncScan *node, EState *estate, int eflags)
 								 tf->coltypmods,
 								 tf->colcollations);
 
-	ExecAssignScanType(&scanstate->ss, tupdesc);
+	/*
+	 * tuple table initialization
+	 */
+	ExecInitResultTupleSlotTL(estate, &scanstate->ss.ps);
+	ExecInitScanTupleSlot(estate, &scanstate->ss, tupdesc);
 
 	/*
 	 * Initialize result tuple type and projection info.
 	 */
-	ExecAssignResultTypeFromTL(&scanstate->ss.ps);
 	ExecAssignScanProjectionInfo(&scanstate->ss);
 
+	/*
+	 * initialize child expressions
+	 */
+	scanstate->ss.ps.qual =
+		ExecInitQual(node->scan.plan.qual, &scanstate->ss.ps);
+
 	/* Only XMLTABLE is supported currently */
 	scanstate->routine = &XmlTableRoutine;
 
diff --git a/src/backend/executor/nodeTidscan.c b/src/backend/executor/nodeTidscan.c
index 0ee76e7d25..8d7ea412c2 100644
--- a/src/backend/executor/nodeTidscan.c
+++ b/src/backend/executor/nodeTidscan.c
@@ -530,6 +530,30 @@ ExecInitTidScan(TidScan *node, EState *estate, int eflags)
 	 */
 	ExecAssignExprContext(estate, &tidstate->ss.ps);
 
+	/*
+	 * open the base relation and acquire appropriate lock on it.
+	 */
+	currentRelation = ExecOpenScanRelation(estate, node->scan.scanrelid, eflags);
+
+	tidstate->ss.ss_currentRelation = currentRelation;
+	tidstate->ss.ss_currentScanDesc = NULL; /* no heap scan here */
+
+	/*
+	 * tuple table initialization
+	 */
+	ExecInitResultTupleSlotTL(estate, &tidstate->ss.ps);
+
+	/*
+	 * get the scan type from the relation descriptor.
+	 */
+	ExecInitScanTupleSlot(estate, &tidstate->ss,
+						  RelationGetDescr(currentRelation));
+
+	/*
+	 * Initialize result tuple type and projection info.
+	 */
+	ExecAssignScanProjectionInfo(&tidstate->ss);
+
 	/*
 	 * initialize child expressions
 	 */
@@ -538,12 +562,6 @@ ExecInitTidScan(TidScan *node, EState *estate, int eflags)
 
 	TidExprListCreate(tidstate);
 
-	/*
-	 * tuple table initialization
-	 */
-	ExecInitResultTupleSlot(estate, &tidstate->ss.ps);
-	ExecInitScanTupleSlot(estate, &tidstate->ss);
-
 	/*
 	 * mark tid list as not computed yet
 	 */
@@ -551,25 +569,6 @@ ExecInitTidScan(TidScan *node, EState *estate, int eflags)
 	tidstate->tss_NumTids = 0;
 	tidstate->tss_TidPtr = -1;
 
-	/*
-	 * open the base relation and acquire appropriate lock on it.
-	 */
-	currentRelation = ExecOpenScanRelation(estate, node->scan.scanrelid, eflags);
-
-	tidstate->ss.ss_currentRelation = currentRelation;
-	tidstate->ss.ss_currentScanDesc = NULL; /* no heap scan here */
-
-	/*
-	 * get the scan type from the relation descriptor.
-	 */
-	ExecAssignScanType(&tidstate->ss, RelationGetDescr(currentRelation));
-
-	/*
-	 * Initialize result tuple type and projection info.
-	 */
-	ExecAssignResultTypeFromTL(&tidstate->ss.ps);
-	ExecAssignScanProjectionInfo(&tidstate->ss);
-
 	/*
 	 * all done.
 	 */
diff --git a/src/backend/executor/nodeUnique.c b/src/backend/executor/nodeUnique.c
index 621fdd9b9c..b86f1e549a 100644
--- a/src/backend/executor/nodeUnique.c
+++ b/src/backend/executor/nodeUnique.c
@@ -143,7 +143,7 @@ ExecInitUnique(Unique *node, EState *estate, int eflags)
 	/*
 	 * Tuple table initialization
 	 */
-	ExecInitResultTupleSlot(estate, &uniquestate->ps);
+	ExecInitResultTupleSlotTL(estate, &uniquestate->ps);
 
 	/*
 	 * then initialize outer plan
@@ -154,7 +154,6 @@ ExecInitUnique(Unique *node, EState *estate, int eflags)
 	 * unique nodes do no projections, so initialize projection info for this
 	 * node appropriately
 	 */
-	ExecAssignResultTypeFromTL(&uniquestate->ps);
 	uniquestate->ps.ps_ProjInfo = NULL;
 
 	/*
diff --git a/src/backend/executor/nodeValuesscan.c b/src/backend/executor/nodeValuesscan.c
index 1a72bfe160..232234cfd8 100644
--- a/src/backend/executor/nodeValuesscan.c
+++ b/src/backend/executor/nodeValuesscan.c
@@ -239,21 +239,20 @@ ExecInitValuesScan(ValuesScan *node, EState *estate, int eflags)
 	/*
 	 * tuple table initialization
 	 */
-	ExecInitResultTupleSlot(estate, &scanstate->ss.ps);
-	ExecInitScanTupleSlot(estate, &scanstate->ss);
-
-	/*
-	 * initialize child expressions
-	 */
-	scanstate->ss.ps.qual =
-		ExecInitQual(node->scan.plan.qual, (PlanState *) scanstate);
+	ExecInitResultTupleSlotTL(estate, &scanstate->ss.ps);
 
 	/*
 	 * get info about values list
 	 */
 	tupdesc = ExecTypeFromExprList((List *) linitial(node->values_lists));
 
-	ExecAssignScanType(&scanstate->ss, tupdesc);
+	ExecInitScanTupleSlot(estate, &scanstate->ss, tupdesc);
+
+	/*
+	 * initialize child expressions
+	 */
+	scanstate->ss.ps.qual =
+		ExecInitQual(node->scan.plan.qual, (PlanState *) scanstate);
 
 	/*
 	 * Other node-specific setup
@@ -273,7 +272,6 @@ ExecInitValuesScan(ValuesScan *node, EState *estate, int eflags)
 	/*
 	 * Initialize result tuple type and projection info.
 	 */
-	ExecAssignResultTypeFromTL(&scanstate->ss.ps);
 	ExecAssignScanProjectionInfo(&scanstate->ss);
 
 	return scanstate;
diff --git a/src/backend/executor/nodeWindowAgg.c b/src/backend/executor/nodeWindowAgg.c
index 80be46029f..1b3d075b3a 100644
--- a/src/backend/executor/nodeWindowAgg.c
+++ b/src/backend/executor/nodeWindowAgg.c
@@ -1823,8 +1823,7 @@ ExecInitWindowAgg(WindowAgg *node, EState *estate, int eflags)
 	/*
 	 * tuple table initialization
 	 */
-	ExecInitScanTupleSlot(estate, &winstate->ss);
-	ExecInitResultTupleSlot(estate, &winstate->ss.ps);
+	ExecInitResultTupleSlotTL(estate, &winstate->ss.ps);
 	winstate->first_part_slot = ExecInitExtraTupleSlot(estate);
 	winstate->agg_row_slot = ExecInitExtraTupleSlot(estate);
 	winstate->temp_slot_1 = ExecInitExtraTupleSlot(estate);
@@ -1847,7 +1846,7 @@ ExecInitWindowAgg(WindowAgg *node, EState *estate, int eflags)
 	 * initialize source tuple type (which is also the tuple type that we'll
 	 * store in the tuplestore and use in all our working slots).
 	 */
-	ExecAssignScanTypeFromOuterPlan(&winstate->ss);
+	ExecCreateScanSlotForOuterPlan(estate, &winstate->ss);
 
 	ExecSetSlotDescriptor(winstate->first_part_slot,
 						  winstate->ss.ss_ScanTupleSlot->tts_tupleDescriptor);
@@ -1861,7 +1860,6 @@ ExecInitWindowAgg(WindowAgg *node, EState *estate, int eflags)
 	/*
 	 * Initialize result tuple type and projection info.
 	 */
-	ExecAssignResultTypeFromTL(&winstate->ss.ps);
 	ExecAssignProjectionInfo(&winstate->ss.ps, NULL);
 
 	/* Set up data for comparing tuples */
diff --git a/src/backend/executor/nodeWorktablescan.c b/src/backend/executor/nodeWorktablescan.c
index d5ffadda3e..f7ec95ba67 100644
--- a/src/backend/executor/nodeWorktablescan.c
+++ b/src/backend/executor/nodeWorktablescan.c
@@ -156,22 +156,21 @@ ExecInitWorkTableScan(WorkTableScan *node, EState *estate, int eflags)
 	 */
 	ExecAssignExprContext(estate, &scanstate->ss.ps);
 
+	/*
+	 * tuple table initialization
+	 */
+	ExecInitResultTupleSlotTL(estate, &scanstate->ss.ps);
+	ExecInitScanTupleSlot(estate, &scanstate->ss, NULL);
+
 	/*
 	 * initialize child expressions
 	 */
 	scanstate->ss.ps.qual =
 		ExecInitQual(node->scan.plan.qual, (PlanState *) scanstate);
 
-	/*
-	 * tuple table initialization
-	 */
-	ExecInitResultTupleSlot(estate, &scanstate->ss.ps);
-	ExecInitScanTupleSlot(estate, &scanstate->ss);
-
 	/*
 	 * Initialize result tuple type, but not yet projection info.
 	 */
-	ExecAssignResultTypeFromTL(&scanstate->ss.ps);
 
 	return scanstate;
 }
diff --git a/src/include/executor/executor.h b/src/include/executor/executor.h
index f48a603dae..f0601cb870 100644
--- a/src/include/executor/executor.h
+++ b/src/include/executor/executor.h
@@ -418,8 +418,8 @@ extern void ExecScanReScan(ScanState *node);
 /*
  * prototypes from functions in execTuples.c
  */
-extern void ExecInitResultTupleSlot(EState *estate, PlanState *planstate);
-extern void ExecInitScanTupleSlot(EState *estate, ScanState *scanstate);
+extern void ExecInitResultTupleSlotTL(EState *estate, PlanState *planstate);
+extern void ExecInitScanTupleSlot(EState *estate, ScanState *scanstate, TupleDesc tupleDesc);
 extern TupleTableSlot *ExecInitExtraTupleSlot(EState *estate);
 extern TupleTableSlot *ExecInitNullTupleSlot(EState *estate,
 					  TupleDesc tupType);
@@ -489,14 +489,12 @@ extern ExprContext *MakePerTupleExprContext(EState *estate);
 	} while (0)
 
 extern void ExecAssignExprContext(EState *estate, PlanState *planstate);
-extern void ExecAssignResultType(PlanState *planstate, TupleDesc tupDesc);
-extern void ExecAssignResultTypeFromTL(PlanState *planstate);
 extern TupleDesc ExecGetResultType(PlanState *planstate);
 extern void ExecAssignProjectionInfo(PlanState *planstate,
 						 TupleDesc inputDesc);
 extern void ExecFreeExprContext(PlanState *planstate);
 extern void ExecAssignScanType(ScanState *scanstate, TupleDesc tupDesc);
-extern void ExecAssignScanTypeFromOuterPlan(ScanState *scanstate);
+extern void ExecCreateScanSlotForOuterPlan(EState *estate, ScanState *scanstate);
 
 extern bool ExecRelationIsTargetRelation(EState *estate, Index scanrelid);
 
diff --git a/src/include/executor/tuptable.h b/src/include/executor/tuptable.h
index 55f4cce4ee..6c24fd334d 100644
--- a/src/include/executor/tuptable.h
+++ b/src/include/executor/tuptable.h
@@ -127,6 +127,7 @@ typedef struct TupleTableSlot
 	MinimalTuple tts_mintuple;	/* minimal tuple, or NULL if none */
 	HeapTupleData tts_minhdr;	/* workspace for minimal-tuple-only case */
 	long		tts_off;		/* saved state for slot_deform_tuple */
+	bool		tts_fixedTupleDescriptor;
 } TupleTableSlot;
 
 #define TTS_HAS_PHYSICAL_TUPLE(slot)  \
@@ -139,8 +140,8 @@ typedef struct TupleTableSlot
 	((slot) == NULL || (slot)->tts_isempty)
 
 /* in executor/execTuples.c */
-extern TupleTableSlot *MakeTupleTableSlot(void);
-extern TupleTableSlot *ExecAllocTableSlot(List **tupleTable);
+extern TupleTableSlot *MakeTupleTableSlot(TupleDesc desc);
+extern TupleTableSlot *ExecAllocTableSlot(List **tupleTable, TupleDesc desc);
 extern void ExecResetTupleTable(List *tupleTable, bool shouldFree);
 extern TupleTableSlot *MakeSingleTupleTableSlot(TupleDesc tupdesc);
 extern void ExecDropSingleTupleTableSlot(TupleTableSlot *slot);
-- 
2.14.1.2.g4274c698f4.dirty

0003-WIP-Add-configure-infrastructure-to-enable-LLVM.patchtext/x-diff; charset=us-asciiDownload
From 47dfd412a19a88aef125b4473337bb68c2dadb6a Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 13 Mar 2017 20:22:10 -0700
Subject: [PATCH 03/16] WIP: Add configure infrastructure to enable LLVM.

---
 configure                  | 97 ++++++++++++++++++++++++++++++++++++++++++++++
 configure.in               | 27 +++++++++++++
 src/Makefile.global.in     |  2 +
 src/backend/Makefile       |  4 ++
 src/include/pg_config.h.in |  3 ++
 5 files changed, 133 insertions(+)

diff --git a/configure b/configure
index a2f9a256b4..fe905e294b 100755
--- a/configure
+++ b/configure
@@ -700,6 +700,9 @@ LDFLAGS_EX
 ELF_SYS
 EGREP
 GREP
+with_llvm
+LLVM_LIBS
+LLVM_CONFIG
 with_zlib
 with_system_tzdata
 with_libxslt
@@ -848,6 +851,7 @@ with_libxml
 with_libxslt
 with_system_tzdata
 with_zlib
+with_llvm
 with_gnu_ld
 enable_largefile
 enable_float4_byval
@@ -1546,6 +1550,7 @@ Optional Packages:
   --with-system-tzdata=DIR
                           use system time zone data in DIR
   --without-zlib          do not use Zlib
+  --with-llvm             build with llvm (JIT) support
   --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
 
 Some influential environment variables:
@@ -6460,6 +6465,98 @@ fi
 
 
 
+
+
+
+# Check whether --with-llvm was given.
+if test "${with_llvm+set}" = set; then :
+  withval=$with_llvm;
+  case $withval in
+    yes)
+
+$as_echo "#define USE_LLVM 1" >>confdefs.h
+
+      ;;
+    no)
+      :
+      ;;
+    *)
+      as_fn_error $? "no argument expected for --with-llvm option" "$LINENO" 5
+      ;;
+  esac
+
+else
+  with_llvm=no
+
+fi
+
+
+
+if test "$with_llvm" = yes ; then
+  for ac_prog in llvm-config
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_LLVM_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$LLVM_CONFIG"; then
+  ac_cv_prog_LLVM_CONFIG="$LLVM_CONFIG" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_LLVM_CONFIG="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+LLVM_CONFIG=$ac_cv_prog_LLVM_CONFIG
+if test -n "$LLVM_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LLVM_CONFIG" >&5
+$as_echo "$LLVM_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$LLVM_CONFIG" && break
+done
+
+  if test -n "$LLVM_CONFIG"; then
+    for pgac_option in `$LLVM_CONFIG --cflags`; do
+      case $pgac_option in
+        -I*|-D*) CPPFLAGS="$CPPFLAGS $pgac_option";;
+      esac
+    done
+    for pgac_option in `$LLVM_CONFIG --ldflags`; do
+      case $pgac_option in
+        -L*) LDFLAGS="$LDFLAGS $pgac_option";;
+      esac
+    done
+    for pgac_option in `$LLVM_CONFIG --libs --system-libs engine`; do
+      case $pgac_option in
+        -l*) LLVM_LIBS="$LLVM_LIBS $pgac_option";;
+      esac
+    done
+  fi
+fi
+
+
+
+
 #
 # Elf
 #
diff --git a/configure.in b/configure.in
index e94fba5235..a99da9dff3 100644
--- a/configure.in
+++ b/configure.in
@@ -856,6 +856,33 @@ PGAC_ARG_BOOL(with, zlib, yes,
               [do not use Zlib])
 AC_SUBST(with_zlib)
 
+PGAC_ARG_BOOL(with, llvm, no, [build with llvm (JIT) support],
+              [AC_DEFINE([USE_LLVM], 1, [Define to 1 to build with llvm support. (--with-llvm)])])
+
+if test "$with_llvm" = yes ; then
+  AC_CHECK_PROGS(LLVM_CONFIG, llvm-config)
+  if test -n "$LLVM_CONFIG"; then
+    for pgac_option in `$LLVM_CONFIG --cflags`; do
+      case $pgac_option in
+        -I*|-D*) CPPFLAGS="$CPPFLAGS $pgac_option";;
+      esac
+    done
+    for pgac_option in `$LLVM_CONFIG --ldflags`; do
+      case $pgac_option in
+        -L*) LDFLAGS="$LDFLAGS $pgac_option";;
+      esac
+    done
+    for pgac_option in `$LLVM_CONFIG --libs --system-libs engine`; do
+      case $pgac_option in
+        -l*) LLVM_LIBS="$LLVM_LIBS $pgac_option";;
+      esac
+    done
+  fi
+fi
+AC_SUBST(LLVM_LIBS)
+AC_SUBST(with_llvm)
+
+
 #
 # Elf
 #
diff --git a/src/Makefile.global.in b/src/Makefile.global.in
index e8b3a519cb..ab5862b472 100644
--- a/src/Makefile.global.in
+++ b/src/Makefile.global.in
@@ -186,6 +186,7 @@ with_tcl	= @with_tcl@
 with_openssl	= @with_openssl@
 with_selinux	= @with_selinux@
 with_systemd	= @with_systemd@
+with_llvm	= @with_llvm@
 with_libxml	= @with_libxml@
 with_libxslt	= @with_libxslt@
 with_system_tzdata = @with_system_tzdata@
@@ -270,6 +271,7 @@ LDAP_LIBS_FE = @LDAP_LIBS_FE@
 LDAP_LIBS_BE = @LDAP_LIBS_BE@
 UUID_LIBS = @UUID_LIBS@
 UUID_EXTRA_OBJS = @UUID_EXTRA_OBJS@
+LLVM_LIBS=@LLVM_LIBS@
 LD = @LD@
 with_gnu_ld = @with_gnu_ld@
 
diff --git a/src/backend/Makefile b/src/backend/Makefile
index aab676dbbd..c82ad75bda 100644
--- a/src/backend/Makefile
+++ b/src/backend/Makefile
@@ -45,6 +45,10 @@ LIBS := $(filter-out -lpgport -lpgcommon, $(LIBS)) $(LDAP_LIBS_BE) $(ICU_LIBS)
 # The backend doesn't need everything that's in LIBS, however
 LIBS := $(filter-out -lz -lreadline -ledit -ltermcap -lncurses -lcurses, $(LIBS))
 
+# Only the backend needs LLVM (if enabled) and it's a big library, so
+# only specify here
+LIBS += $(LLVM_LIBS)
+
 ifeq ($(with_systemd),yes)
 LIBS += -lsystemd
 endif
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index dcb7a1a320..633c670de9 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -832,6 +832,9 @@
    (--with-libxslt) */
 #undef USE_LIBXSLT
 
+/* Define to 1 to build with llvm support. (--with-llvm) */
+#undef USE_LLVM
+
 /* Define to select named POSIX semaphores. */
 #undef USE_NAMED_POSIX_SEMAPHORES
 
-- 
2.14.1.2.g4274c698f4.dirty

0004-WIP-Beginning-of-a-LLVM-JIT-infrastructure.patchtext/x-diff; charset=us-asciiDownload
From 23e5dce848ed8dac7b590da5c77321344b30310d Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 13 Mar 2017 20:22:10 -0700
Subject: [PATCH 04/16] WIP: Beginning of a LLVM JIT infrastructure.

This needs to do a lot more, especially around error handling, and
memory management.
---
 configure                             |   2 +-
 configure.in                          |   2 +-
 src/backend/executor/execUtils.c      |   2 +
 src/backend/lib/Makefile              |   2 +-
 src/backend/lib/llvmjit.c             | 519 ++++++++++++++++++++++++++++++++++
 src/backend/utils/misc/guc.c          |  27 ++
 src/backend/utils/resowner/resowner.c |  40 +++
 src/include/lib/llvmjit.h             |  83 ++++++
 src/include/nodes/execnodes.h         |   4 +-
 src/include/utils/resowner_private.h  |   7 +
 10 files changed, 684 insertions(+), 4 deletions(-)
 create mode 100644 src/backend/lib/llvmjit.c
 create mode 100644 src/include/lib/llvmjit.h

diff --git a/configure b/configure
index fe905e294b..b6adceb990 100755
--- a/configure
+++ b/configure
@@ -6546,7 +6546,7 @@ done
         -L*) LDFLAGS="$LDFLAGS $pgac_option";;
       esac
     done
-    for pgac_option in `$LLVM_CONFIG --libs --system-libs engine`; do
+    for pgac_option in `$LLVM_CONFIG --libs --system-libs engine debuginfodwarf orcjit passes perfjitevents`; do
       case $pgac_option in
         -l*) LLVM_LIBS="$LLVM_LIBS $pgac_option";;
       esac
diff --git a/configure.in b/configure.in
index a99da9dff3..7028a31137 100644
--- a/configure.in
+++ b/configure.in
@@ -872,7 +872,7 @@ if test "$with_llvm" = yes ; then
         -L*) LDFLAGS="$LDFLAGS $pgac_option";;
       esac
     done
-    for pgac_option in `$LLVM_CONFIG --libs --system-libs engine`; do
+    for pgac_option in `$LLVM_CONFIG --libs --system-libs engine debuginfodwarf orcjit passes perfjitevents`; do
       case $pgac_option in
         -l*) LLVM_LIBS="$LLVM_LIBS $pgac_option";;
       esac
diff --git a/src/backend/executor/execUtils.c b/src/backend/executor/execUtils.c
index 5928c38f90..aee6111c14 100644
--- a/src/backend/executor/execUtils.c
+++ b/src/backend/executor/execUtils.c
@@ -156,6 +156,8 @@ CreateExecutorState(void)
 	estate->es_epqScanDone = NULL;
 	estate->es_sourceText = NULL;
 
+	estate->es_jit = NULL;
+
 	/*
 	 * Return the executor state structure
 	 */
diff --git a/src/backend/lib/Makefile b/src/backend/lib/Makefile
index d1fefe43f2..dd1390f9cf 100644
--- a/src/backend/lib/Makefile
+++ b/src/backend/lib/Makefile
@@ -13,6 +13,6 @@ top_builddir = ../../..
 include $(top_builddir)/src/Makefile.global
 
 OBJS = binaryheap.o bipartite_match.o dshash.o hyperloglog.o ilist.o \
-	   knapsack.o pairingheap.o rbtree.o stringinfo.o
+	knapsack.o llvmjit.o pairingheap.o rbtree.o stringinfo.o
 
 include $(top_srcdir)/src/backend/common.mk
diff --git a/src/backend/lib/llvmjit.c b/src/backend/lib/llvmjit.c
new file mode 100644
index 0000000000..460cb6b325
--- /dev/null
+++ b/src/backend/lib/llvmjit.c
@@ -0,0 +1,519 @@
+/*
+ * JIT infrastructure.
+ */
+
+#include "postgres.h"
+
+
+#include "lib/llvmjit.h"
+
+#include "utils/memutils.h"
+#include "utils/resowner_private.h"
+
+#ifdef USE_LLVM
+
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include <llvm-c/Core.h>
+#include <llvm-c/ExecutionEngine.h>
+#include <llvm-c/Target.h>
+#include <llvm-c/Analysis.h>
+#include <llvm-c/BitWriter.h>
+#include <llvm-c/OrcBindings.h>
+#include <llvm-c/Support.h>
+#include <llvm-c/Transforms/IPO.h>
+#include <llvm-c/Transforms/Scalar.h>
+
+
+/* GUCs */
+bool jit_log_ir = 0;
+bool jit_dump_bitcode = 0;
+
+static bool llvm_initialized = false;
+static LLVMPassManagerBuilderRef llvm_pmb;
+
+/* very common public things */
+const char *llvm_triple = NULL;
+
+LLVMTargetMachineRef llvm_targetmachine;
+
+LLVMTypeRef TypeSizeT;
+LLVMTypeRef TypeMemoryContext;
+LLVMTypeRef TypePGFunction;
+
+LLVMTypeRef StructHeapTupleFieldsField3;
+LLVMTypeRef StructHeapTupleFields;
+LLVMTypeRef StructHeapTupleHeaderData;
+LLVMTypeRef StructHeapTupleDataChoice;
+LLVMTypeRef StructHeapTupleData;
+LLVMTypeRef StructMinimalTupleData;
+LLVMTypeRef StructItemPointerData;
+LLVMTypeRef StructBlockId;
+LLVMTypeRef StructFormPgAttribute;
+LLVMTypeRef StructTupleConstr;
+LLVMTypeRef StructtupleDesc;
+LLVMTypeRef StructTupleTableSlot;
+LLVMTypeRef StructMemoryContextData;
+LLVMTypeRef StructPGFinfoRecord;
+LLVMTypeRef StructFmgrInfo;
+LLVMTypeRef StructFunctionCallInfoData;
+LLVMTypeRef StructExprState;
+LLVMTypeRef StructExprContext;
+
+
+static LLVMTargetRef llvm_targetref;
+static LLVMOrcJITStackRef llvm_orc;
+
+static void llvm_shutdown(void);
+static void llvm_create_types(void);
+
+
+static void
+llvm_shutdown(void)
+{
+	/* unregister profiling support, needs to be flushed to be useful */
+	if (llvm_orc)
+	{
+		LLVMOrcUnregisterPerf(llvm_orc);
+		llvm_orc = NULL;
+	}
+}
+
+void
+llvm_initialize(void)
+{
+	char *error = NULL;
+	MemoryContext oldcontext;
+
+	if (llvm_initialized)
+		return;
+
+	oldcontext = MemoryContextSwitchTo(TopMemoryContext);
+
+	LLVMInitializeNativeTarget();
+	LLVMInitializeNativeAsmPrinter();
+	LLVMInitializeNativeAsmParser();
+
+	/* force symbols in main binary to be loaded */
+	LLVMLoadLibraryPermanently("");
+
+	llvm_triple = LLVMGetDefaultTargetTriple();
+
+	if (LLVMGetTargetFromTriple(llvm_triple, &llvm_targetref, &error) != 0)
+	{
+		elog(FATAL, "failed to query triple %s\n", error);
+	}
+
+	llvm_targetmachine =
+		LLVMCreateTargetMachine(llvm_targetref, llvm_triple, NULL, NULL,
+								LLVMCodeGenLevelAggressive,
+								LLVMRelocDefault,
+								LLVMCodeModelJITDefault);
+
+	llvm_pmb = LLVMPassManagerBuilderCreate();
+	LLVMPassManagerBuilderSetOptLevel(llvm_pmb, 3);
+
+	llvm_orc = LLVMOrcCreateInstance(llvm_targetmachine);
+
+	LLVMOrcRegisterGDB(llvm_orc);
+	LLVMOrcRegisterPerf(llvm_orc);
+
+	atexit(llvm_shutdown);
+
+	llvm_create_types();
+
+	llvm_initialized = true;
+	MemoryContextSwitchTo(oldcontext);
+}
+
+static void
+llvm_create_types(void)
+{
+	/* so we don't constantly have to decide between 32/64 bit */
+#if SIZEOF_DATUM == 8
+	TypeSizeT = LLVMInt64Type();
+#else
+	TypeSizeT = LLVMInt32Type();
+#endif
+
+	/*
+	 * XXX: should rather load these from disk using bitcode? It's ugly to
+	 * duplicate the information, but in either case we're going to have to
+	 * use member indexes for structs :(.
+	 */
+	{
+		LLVMTypeRef members[2];
+		members[0] = LLVMInt16Type(); /* bi_hi */
+		members[1] = LLVMInt16Type(); /* bi_lo */
+		StructBlockId = LLVMStructCreateNamed(LLVMGetGlobalContext(),
+											  "struct.BlockId");
+		LLVMStructSetBody(StructBlockId, members, 2, false);
+	}
+
+	{
+		LLVMTypeRef members[2];
+		members[0] = StructBlockId;  /* ip_blkid */
+		members[1] = LLVMInt16Type(); /* ip_posid */
+
+		StructItemPointerData = LLVMStructCreateNamed(LLVMGetGlobalContext(),
+											  "struct.ItemPointerData");
+		LLVMStructSetBody(StructItemPointerData, members, lengthof(members), false);
+	}
+
+
+	{
+		LLVMTypeRef members[1];
+
+		members[0] = LLVMInt32Type() ;  /* cid | xvac */
+
+		StructHeapTupleFieldsField3 = LLVMStructCreateNamed(LLVMGetGlobalContext(),
+															"struct.StructHeapTupleFieldsField3");
+		LLVMStructSetBody(StructHeapTupleFieldsField3, members, lengthof(members), false);
+	}
+
+	{
+		LLVMTypeRef members[1];
+
+		members[0] = LLVMInt32Type() ;  /* ? */
+
+		StructPGFinfoRecord = LLVMStructCreateNamed(LLVMGetGlobalContext(),
+													"struct.PGFinfoRecord");
+		LLVMStructSetBody(StructPGFinfoRecord, members, lengthof(members), false);
+	}
+
+	{
+		LLVMTypeRef members[3];
+		members[0] = LLVMInt32Type(); /* xmin */
+		members[1] = LLVMInt32Type(); /* xmax */
+		members[2] = StructHeapTupleFieldsField3; /* cid | xvac */
+
+		StructHeapTupleFields = LLVMStructCreateNamed(LLVMGetGlobalContext(),
+													  "struct.HeapTupleFields");
+		LLVMStructSetBody(StructHeapTupleFields, members, lengthof(members), false);
+	}
+
+	{
+		LLVMTypeRef members[1];
+
+		members[0] = StructHeapTupleFields; /* t_heap | t_datum */
+
+		StructHeapTupleDataChoice = LLVMStructCreateNamed(LLVMGetGlobalContext(),
+														  "struct.HeapTupleHeaderDataChoice");
+		LLVMStructSetBody(StructHeapTupleDataChoice, members, lengthof(members), false);
+
+	}
+
+	{
+		LLVMTypeRef members[6];
+
+		members[0] = StructHeapTupleDataChoice; /* t_heap | t_datum */
+		members[1] = StructItemPointerData; /* t_ctid */
+		members[2] = LLVMInt16Type(); /* t_infomask2 */
+		members[3] = LLVMInt16Type(); /* t_infomask1 */
+		members[4] = LLVMInt8Type(); /* t_hoff */
+		members[5] = LLVMArrayType(LLVMInt8Type(), 0); /* t_bits */
+		/* t_bits and other data follow */
+
+		StructHeapTupleHeaderData = LLVMStructCreateNamed(LLVMGetGlobalContext(),
+														  "struct.HeapTupleHeaderData");
+		LLVMStructSetBody(StructHeapTupleHeaderData, members, lengthof(members), false);
+	}
+
+	{
+		LLVMTypeRef members[4];
+		members[0] = LLVMInt32Type(); /* t_len */
+		members[1] = StructItemPointerData; /* t_self */
+		members[2] = LLVMInt32Type(); /* t_tableOid */
+		members[3] = LLVMPointerType(StructHeapTupleHeaderData, 0); /* t_data */
+
+		StructHeapTupleData = LLVMStructCreateNamed(LLVMGetGlobalContext(),
+														  "struct.HeapTupleData");
+		LLVMStructSetBody(StructHeapTupleData, members, lengthof(members), false);
+	}
+
+	{
+		StructMinimalTupleData = LLVMStructCreateNamed(LLVMGetGlobalContext(),
+													   "struct.MinimalTupleData");
+	}
+
+
+	{
+		StructFormPgAttribute = LLVMStructCreateNamed(LLVMGetGlobalContext(),
+													  "struct.Form_pg_attribute");
+	}
+
+	{
+		StructTupleConstr = LLVMStructCreateNamed(LLVMGetGlobalContext(),
+												  "struct.TupleConstr");
+	}
+
+	{
+		LLVMTypeRef members[7];
+
+		members[0] = LLVMInt32Type(); /* natts */
+		members[1] = LLVMInt32Type(); /* tdtypeid */
+		members[2] = LLVMInt32Type(); /* tdtypemod */
+		members[3] = LLVMInt8Type(); /* tdhasoid */
+		members[4] = LLVMInt32Type(); /* tsrefcount */
+		members[5] = LLVMPointerType(StructTupleConstr, 0); /* constr */
+		members[6] = LLVMArrayType(LLVMPointerType(StructFormPgAttribute, 0), 0); /* attrs */
+
+		StructtupleDesc = LLVMStructCreateNamed(LLVMGetGlobalContext(),
+												"struct.tupleDesc");
+		LLVMStructSetBody(StructtupleDesc, members, lengthof(members), false);
+	}
+
+	{
+		StructMemoryContextData = LLVMStructCreateNamed(LLVMGetGlobalContext(),
+														"struct.MemoryContext");
+	}
+
+	{
+		TypeMemoryContext = LLVMPointerType(StructMemoryContextData, 0);
+	}
+
+	{
+		LLVMTypeRef members[15];
+
+		members[ 0] = LLVMInt32Type(); /* type */
+		members[ 1] = LLVMInt8Type(); /* isempty */
+		members[ 2] = LLVMInt8Type(); /* shouldFree */
+		members[ 3] = LLVMInt8Type(); /* shouldFreeMin */
+		members[ 4] = LLVMInt8Type(); /* slow */
+		members[ 5] = LLVMPointerType(StructHeapTupleData, 0); /* tuple */
+		members[ 6] = LLVMPointerType(StructtupleDesc, 0); /* tupleDescriptor */
+		members[ 7] = TypeMemoryContext; /* mcxt */
+		members[ 8] = LLVMInt32Type(); /* buffer */
+		members[ 9] = LLVMInt32Type(); /* nvalid */
+		members[10] = LLVMPointerType(TypeSizeT, 0); /* values */
+		members[11] = LLVMPointerType(LLVMInt8Type(), 0); /* nulls */
+		members[12] = LLVMPointerType(StructMinimalTupleData, 0); /* mintuple */
+		members[13] = StructHeapTupleData; /* minhdr */
+		members[14] = LLVMInt64Type(); /* off: FIXME, deterministic type, not long */
+
+		StructTupleTableSlot = LLVMStructCreateNamed(LLVMGetGlobalContext(),
+													 "struct.TupleTableSlot");
+		LLVMStructSetBody(StructTupleTableSlot, members, lengthof(members), false);
+	}
+
+	{
+		StructFmgrInfo = LLVMStructCreateNamed(LLVMGetGlobalContext(),
+											   "struct.FmgrInfo");
+	}
+
+	{
+		LLVMTypeRef members[8];
+
+		members[0] = LLVMPointerType(StructFmgrInfo, 0); /* flinfo */
+		members[1] = LLVMPointerType(StructPGFinfoRecord, 0); /* context */
+		members[2] = LLVMPointerType(StructPGFinfoRecord, 0); /* resultinfo */
+		members[3] = LLVMInt32Type(); /* fncollation */
+		members[4] = LLVMInt8Type(); /* isnull */
+		members[5] = LLVMInt16Type(); /* nargs */
+		members[6] = LLVMArrayType(TypeSizeT, FUNC_MAX_ARGS);
+		members[7] = LLVMArrayType(LLVMInt8Type(), FUNC_MAX_ARGS);
+
+		StructFunctionCallInfoData = LLVMStructCreateNamed(LLVMGetGlobalContext(),
+														   "struct.FunctionCallInfoData");
+		LLVMStructSetBody(StructFunctionCallInfoData, members, lengthof(members), false);
+	}
+
+	{
+		LLVMTypeRef members[14];
+
+		members[ 0] = LLVMInt32Type(); /* tag */
+		members[ 1] = LLVMInt8Type(); /* flags */
+		members[ 2] = LLVMInt8Type(); /* resnull */
+		members[ 3] = TypeSizeT; /* resvalue */
+		members[ 4] = LLVMPointerType(StructTupleTableSlot, 0); /* resultslot */
+		members[ 5] = LLVMPointerType(TypeSizeT, 0); /* steps */
+		members[ 6] = LLVMPointerType(TypeSizeT, 0); /* evalfunc */
+		members[ 7] = LLVMPointerType(TypeSizeT, 0); /* expr */
+		members[ 8] = TypeSizeT; /* steps_len */
+		members[ 9] = TypeSizeT; /* steps_alloc */
+		members[10] = LLVMPointerType(TypeSizeT, 0); /* innermost caseval */
+		members[11] = LLVMPointerType(LLVMInt8Type(), 0); /* innermost casenull */
+		members[12] = LLVMPointerType(TypeSizeT, 0); /* innermost domainval */
+		members[13] = LLVMPointerType(LLVMInt8Type(), 0); /* innermost domainnull */
+
+		StructExprState = LLVMStructCreateNamed(LLVMGetGlobalContext(),
+												"struct.ExprState");
+		LLVMStructSetBody(StructExprState, members, lengthof(members), false);
+	}
+
+	{
+		LLVMTypeRef members[16];
+
+		members[ 0] = LLVMInt32Type(); /* tag */
+		members[ 1] = LLVMPointerType(StructTupleTableSlot, 0); /* scantuple */
+		members[ 2] = LLVMPointerType(StructTupleTableSlot, 0); /* innertuple */
+		members[ 3] = LLVMPointerType(StructTupleTableSlot, 0); /* outertuple */
+
+		members[ 4] = LLVMPointerType(TypeSizeT, 0); /* per_query_memory */
+		members[ 5] = LLVMPointerType(TypeSizeT, 0); /* per_tuple_memory */
+
+		members[ 6] = LLVMPointerType(TypeSizeT, 0); /* param_exec */
+		members[ 7] = LLVMPointerType(TypeSizeT, 0); /* param_list_info */
+
+		members[ 8] = LLVMPointerType(TypeSizeT, 0); /* aggvalues */
+		members[ 9] = LLVMPointerType(LLVMInt8Type(), 0); /* aggnulls */
+
+		members[10] = TypeSizeT; /* casvalue */
+		members[11] = LLVMInt8Type(); /* casenull */
+
+		members[12] = TypeSizeT; /* domainvalue */
+		members[13] = LLVMInt8Type(); /* domainnull */
+
+		members[14] = LLVMPointerType(TypeSizeT, 0); /* estate */
+		members[15] = LLVMPointerType(TypeSizeT, 0); /* callbacks */
+
+		StructExprContext = LLVMStructCreateNamed(LLVMGetGlobalContext(),
+												  "struct.ExprContext");
+		LLVMStructSetBody(StructExprContext, members, lengthof(members), false);
+	}
+
+	{
+		LLVMTypeRef params[1];
+		params[0] = LLVMPointerType(StructFunctionCallInfoData, 0);
+		TypePGFunction = LLVMFunctionType(TypeSizeT, params, lengthof(params), 0);
+	}
+}
+
+static uint64_t
+llvm_resolve_symbol(const char *name, void *ctx)
+{
+	return (uint64_t) LLVMSearchForAddressOfSymbol(name);
+}
+
+void *
+llvm_get_function(LLVMJitContext *context, const char *funcname)
+{
+	/*
+	 * If there is a pending, not emitted, module, compile and emit
+	 * now. Otherwise we migh not find the [correct] function.
+	 */
+	if (!context->compiled)
+	{
+		int handle;
+		LLVMSharedModuleRef smod = LLVMOrcMakeSharedModule(context->module);
+		MemoryContext oldcontext;
+
+		if (jit_log_ir)
+		{
+			LLVMDumpModule(context->module);
+		}
+
+		if (jit_dump_bitcode)
+		{
+			/* FIXME: invent module rather than function specific name */
+			char *filename = psprintf("%s.bc", funcname);
+			LLVMWriteBitcodeToFile(context->module, filename);
+			pfree(filename);
+		}
+
+
+		/* perform optimization */
+		{
+			LLVMValueRef func;
+			LLVMPassManagerRef llvm_fpm;
+			LLVMPassManagerRef llvm_mpm;
+
+			llvm_fpm = LLVMCreateFunctionPassManagerForModule(context->module);
+			llvm_mpm = LLVMCreatePassManager();
+
+			LLVMPassManagerBuilderPopulateFunctionPassManager(llvm_pmb, llvm_fpm);
+			LLVMPassManagerBuilderPopulateModulePassManager(llvm_pmb, llvm_mpm);
+			LLVMPassManagerBuilderPopulateLTOPassManager(llvm_pmb, llvm_mpm, true, true);
+
+			LLVMAddAnalysisPasses(llvm_targetmachine, llvm_mpm);
+			LLVMAddAnalysisPasses(llvm_targetmachine, llvm_fpm);
+
+			LLVMAddDeadStoreEliminationPass(llvm_fpm);
+
+			/* do function level optimization */
+			LLVMInitializeFunctionPassManager(llvm_fpm);
+			for (func = LLVMGetFirstFunction(context->module);
+				 func != NULL;
+				 func = LLVMGetNextFunction(func))
+				LLVMRunFunctionPassManager(llvm_fpm, func);
+			LLVMFinalizeFunctionPassManager(llvm_fpm);
+
+			/* do module level optimization */
+			LLVMRunPassManager(llvm_mpm, context->module);
+
+			LLVMDisposePassManager(llvm_fpm);
+			LLVMDisposePassManager(llvm_mpm);
+		}
+
+		/* and emit the code */
+		{
+			handle =
+				LLVMOrcAddEagerlyCompiledIR(llvm_orc, smod,
+											llvm_resolve_symbol, NULL);
+
+			oldcontext = MemoryContextSwitchTo(TopMemoryContext);
+			context->handles = lappend_int(context->handles, handle);
+			MemoryContextSwitchTo(oldcontext);
+
+			LLVMOrcDisposeSharedModuleRef(smod);
+
+			ResourceOwnerEnlargeJIT(CurrentResourceOwner);
+			ResourceOwnerRememberJIT(CurrentResourceOwner, PointerGetDatum(context));
+		}
+
+		context->module = NULL;
+		context->compiled = true;
+	}
+
+	/* search all emitted modules for function we're asked for */
+	{
+		void *addr;
+		char *mangled;
+		ListCell *lc;
+
+		LLVMOrcGetMangledSymbol(llvm_orc, &mangled, funcname);
+		foreach(lc, context->handles)
+		{
+			int handle = lfirst_int(lc);
+
+			addr = (void *) LLVMOrcGetSymbolAddressIn(llvm_orc, handle, mangled);
+			if (addr)
+				return addr;
+		}
+	}
+
+	elog(ERROR, "failed to JIT: %s", funcname);
+
+	return NULL;
+}
+
+void
+llvm_release_handle(ResourceOwner resowner, Datum handle)
+{
+	LLVMJitContext *context = (LLVMJitContext *) DatumGetPointer(handle);
+	ListCell *lc;
+
+	foreach(lc, context->handles)
+	{
+		int handle = lfirst_int(lc);
+
+		LLVMOrcRemoveModule(llvm_orc, handle);
+	}
+	list_free(context->handles);
+	context->handles = NIL;
+
+	ResourceOwnerForgetJIT(resowner, handle);
+}
+
+#else  /* USE_LLVM */
+
+void
+llvm_release_handle(ResourceOwner resowner, Datum handle)
+{
+}
+
+#endif
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 246fea8693..2edc0b33c5 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -42,6 +42,7 @@
 #include "commands/variable.h"
 #include "commands/trigger.h"
 #include "funcapi.h"
+#include "lib/llvmjit.h"
 #include "libpq/auth.h"
 #include "libpq/be-fsstubs.h"
 #include "libpq/libpq.h"
@@ -995,6 +996,32 @@ static struct config_bool ConfigureNamesBool[] =
 		false,
 		NULL, NULL, NULL
 	},
+
+#ifdef USE_LLVM
+	{
+		{"jit_log_ir", PGC_USERSET, DEVELOPER_OPTIONS,
+			gettext_noop("just-in-time debugging: print IR to stdout"),
+			NULL,
+			GUC_NOT_IN_SAMPLE
+		},
+		&jit_log_ir,
+		false,
+		NULL, NULL, NULL
+	},
+
+	{
+		{"jit_dump_bitcode", PGC_USERSET, DEVELOPER_OPTIONS,
+			gettext_noop("just-in-time debuggin: write out bitcode"),
+			NULL,
+			GUC_NOT_IN_SAMPLE
+		},
+		&jit_dump_bitcode,
+		false,
+		NULL, NULL, NULL
+	},
+
+#endif
+
 	{
 		{"zero_damaged_pages", PGC_SUSET, DEVELOPER_OPTIONS,
 			gettext_noop("Continues processing past damaged page headers."),
diff --git a/src/backend/utils/resowner/resowner.c b/src/backend/utils/resowner/resowner.c
index 4a4a287148..3c89db5003 100644
--- a/src/backend/utils/resowner/resowner.c
+++ b/src/backend/utils/resowner/resowner.c
@@ -27,6 +27,7 @@
 #include "utils/rel.h"
 #include "utils/resowner_private.h"
 #include "utils/snapmgr.h"
+#include "lib/llvmjit.h"
 
 
 /*
@@ -124,6 +125,7 @@ typedef struct ResourceOwnerData
 	ResourceArray snapshotarr;	/* snapshot references */
 	ResourceArray filearr;		/* open temporary files */
 	ResourceArray dsmarr;		/* dynamic shmem segments */
+	ResourceArray jitarr;		/* JIT handles */
 
 	/* We can remember up to MAX_RESOWNER_LOCKS references to local locks. */
 	int			nlocks;			/* number of owned locks */
@@ -437,6 +439,7 @@ ResourceOwnerCreate(ResourceOwner parent, const char *name)
 	ResourceArrayInit(&(owner->snapshotarr), PointerGetDatum(NULL));
 	ResourceArrayInit(&(owner->filearr), FileGetDatum(-1));
 	ResourceArrayInit(&(owner->dsmarr), PointerGetDatum(NULL));
+	ResourceArrayInit(&(owner->jitarr), Int32GetDatum(-1));
 
 	return owner;
 }
@@ -552,6 +555,21 @@ ResourceOwnerReleaseInternal(ResourceOwner owner,
 				PrintDSMLeakWarning(res);
 			dsm_detach(res);
 		}
+
+		/* Ditto for jited functions */
+		while (ResourceArrayGetAny(&(owner->jitarr), &foundres))
+		{
+			if (isTopLevel)
+				llvm_release_handle(owner, foundres);
+			else
+			{
+				ResourceOwnerForgetJIT(owner, foundres);
+				ResourceOwnerEnlargeJIT(owner->parent);
+				ResourceOwnerRememberJIT(owner->parent, foundres);
+
+			}
+		}
+
 	}
 	else if (phase == RESOURCE_RELEASE_LOCKS)
 	{
@@ -699,6 +717,7 @@ ResourceOwnerDelete(ResourceOwner owner)
 	Assert(owner->snapshotarr.nitems == 0);
 	Assert(owner->filearr.nitems == 0);
 	Assert(owner->dsmarr.nitems == 0);
+	Assert(owner->jitarr.nitems == 0);
 	Assert(owner->nlocks == 0 || owner->nlocks == MAX_RESOWNER_LOCKS + 1);
 
 	/*
@@ -725,6 +744,7 @@ ResourceOwnerDelete(ResourceOwner owner)
 	ResourceArrayFree(&(owner->snapshotarr));
 	ResourceArrayFree(&(owner->filearr));
 	ResourceArrayFree(&(owner->dsmarr));
+	ResourceArrayFree(&(owner->jitarr));
 
 	pfree(owner);
 }
@@ -1267,3 +1287,23 @@ PrintDSMLeakWarning(dsm_segment *seg)
 	elog(WARNING, "dynamic shared memory leak: segment %u still referenced",
 		 dsm_segment_handle(seg));
 }
+
+void
+ResourceOwnerEnlargeJIT(ResourceOwner owner)
+{
+	ResourceArrayEnlarge(&(owner->jitarr));
+}
+
+void
+ResourceOwnerRememberJIT(ResourceOwner owner, Datum handle)
+{
+	ResourceArrayAdd(&(owner->jitarr), handle);
+}
+
+void
+ResourceOwnerForgetJIT(ResourceOwner owner, Datum handle)
+{
+	if (!ResourceArrayRemove(&(owner->jitarr), handle))
+		elog(ERROR, "jit %lu is not owned by resource owner %s",
+			 handle, owner->name);
+}
diff --git a/src/include/lib/llvmjit.h b/src/include/lib/llvmjit.h
new file mode 100644
index 0000000000..82b0b91c93
--- /dev/null
+++ b/src/include/lib/llvmjit.h
@@ -0,0 +1,83 @@
+#ifndef LLVMJIT_H
+#define LLVMJIT_H
+
+#include "utils/resowner.h"
+
+#ifdef USE_LLVM
+
+/* symbol conflict :( */
+#undef PM
+
+#include "nodes/pg_list.h"
+
+#include <llvm-c/Core.h>
+#include <llvm-c/Core.h>
+#include <llvm-c/ExecutionEngine.h>
+#include <llvm-c/Target.h>
+#include <llvm-c/Analysis.h>
+#include <llvm-c/BitWriter.h>
+#include <llvm-c/IRReader.h>
+#include <llvm-c/BitReader.h>
+#include <llvm-c/Linker.h>
+#include <llvm-c/OrcBindings.h>
+#include <llvm-c/Transforms/PassManagerBuilder.h>
+
+typedef struct LLVMJitContext
+{
+	int counter;
+	LLVMModuleRef module;
+	bool compiled;
+	List *handles;
+} LLVMJitContext;
+
+extern bool jit_log_ir;
+extern bool jit_dump_bitcode;
+
+extern LLVMTargetMachineRef llvm_targetmachine;
+extern const char *llvm_triple;
+
+extern LLVMTypeRef TypeSizeT;
+extern LLVMTypeRef TypePGFunction;
+extern LLVMTypeRef TypeMemoryContext;
+
+extern LLVMTypeRef StructFormPgAttribute;
+extern LLVMTypeRef StructTupleConstr;
+extern LLVMTypeRef StructtupleDesc;
+extern LLVMTypeRef StructHeapTupleFields;
+extern LLVMTypeRef StructHeapTupleFieldsField3;
+extern LLVMTypeRef StructHeapTupleHeaderData;
+extern LLVMTypeRef StructHeapTupleDataChoice;
+extern LLVMTypeRef StructHeapTupleData;
+extern LLVMTypeRef StructMinimalTupleData;
+extern LLVMTypeRef StructItemPointerData;
+extern LLVMTypeRef StructBlockId;
+extern LLVMTypeRef StructTupleTableSlot;
+extern LLVMTypeRef StructMemoryContextData;
+extern LLVMTypeRef StructPGFinfoRecord;
+extern LLVMTypeRef StructFmgrInfo;
+extern LLVMTypeRef StructFunctionCallInfoData;
+extern LLVMTypeRef StructExprState;
+extern LLVMTypeRef StructExprContext;
+
+extern void llvm_initialize(void);
+extern void llvm_dispose_module(LLVMModuleRef mod, const char *funcname);
+
+extern void *llvm_get_function(LLVMJitContext *context, const char *funcname);
+
+extern void llvm_perf_support(LLVMExecutionEngineRef EE);
+extern void llvm_shutdown_perf_support(LLVMExecutionEngineRef EE);
+
+extern void llvm_perf_orc_support(LLVMOrcJITStackRef llvm_orc);
+extern void llvm_shutdown_orc_perf_support(LLVMOrcJITStackRef llvm_orc);
+
+#else
+
+typedef struct LLVMJitContext
+{
+} LLVMJitContext;
+
+#endif /* USE_LLVM */
+
+extern void llvm_release_handle(ResourceOwner resowner, Datum handle);
+
+#endif /* LLVMJIT_H */
diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h
index 90a60abc4d..0dc9fa8d79 100644
--- a/src/include/nodes/execnodes.h
+++ b/src/include/nodes/execnodes.h
@@ -508,7 +508,9 @@ typedef struct EState
 	bool	   *es_epqScanDone; /* true if EPQ tuple has been fetched */
 
 	/* The per-query shared memory area to use for parallel execution. */
-	struct dsa_area *es_query_dsa;
+	struct dsa_area   *es_query_dsa;
+
+	struct LLVMJitContext *es_jit;
 } EState;
 
 
diff --git a/src/include/utils/resowner_private.h b/src/include/utils/resowner_private.h
index 2420b651b3..1921e4e666 100644
--- a/src/include/utils/resowner_private.h
+++ b/src/include/utils/resowner_private.h
@@ -88,4 +88,11 @@ extern void ResourceOwnerRememberDSM(ResourceOwner owner,
 extern void ResourceOwnerForgetDSM(ResourceOwner owner,
 					   dsm_segment *);
 
+/* support for JITed functions */
+extern void ResourceOwnerEnlargeJIT(ResourceOwner owner);
+extern void ResourceOwnerRememberJIT(ResourceOwner owner,
+									 Datum handle);
+extern void ResourceOwnerForgetJIT(ResourceOwner owner,
+								   Datum handle);
+
 #endif							/* RESOWNER_PRIVATE_H */
-- 
2.14.1.2.g4274c698f4.dirty

0005-Perform-slot-validity-checks-in-a-separate-pass-over.patchtext/x-diff; charset=us-asciiDownload
From e4a5f0a418949b9d4700399ba0a85577cd85cb7f Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Thu, 31 Aug 2017 13:22:41 -0700
Subject: [PATCH 05/16] Perform slot validity checks in a separate pass over
 expression.

This is better for JITing and allows to get rid of some code
duplication.
---
 src/backend/executor/execExpr.c       |   8 +-
 src/backend/executor/execExprInterp.c | 192 ++++++++++++++--------------------
 src/include/executor/execExpr.h       |   9 +-
 src/include/nodes/execnodes.h         |   2 +
 4 files changed, 86 insertions(+), 125 deletions(-)

diff --git a/src/backend/executor/execExpr.c b/src/backend/executor/execExpr.c
index be9d23bc32..81549ee915 100644
--- a/src/backend/executor/execExpr.c
+++ b/src/backend/executor/execExpr.c
@@ -637,20 +637,20 @@ ExecInitExprRec(Expr *node, PlanState *parent, ExprState *state,
 					/* regular user column */
 					scratch.d.var.attnum = variable->varattno - 1;
 					scratch.d.var.vartype = variable->vartype;
-					/* select EEOP_*_FIRST opcode to force one-time checks */
+
 					switch (variable->varno)
 					{
 						case INNER_VAR:
-							scratch.opcode = EEOP_INNER_VAR_FIRST;
+							scratch.opcode = EEOP_INNER_VAR;
 							break;
 						case OUTER_VAR:
-							scratch.opcode = EEOP_OUTER_VAR_FIRST;
+							scratch.opcode = EEOP_OUTER_VAR;
 							break;
 
 							/* INDEX_VAR is handled by default case */
 
 						default:
-							scratch.opcode = EEOP_SCAN_VAR_FIRST;
+							scratch.opcode = EEOP_SCAN_VAR;
 							break;
 					}
 				}
diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c
index 83e04471e4..50e3f8b176 100644
--- a/src/backend/executor/execExprInterp.c
+++ b/src/backend/executor/execExprInterp.c
@@ -131,7 +131,6 @@ static Datum ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnul
 static void ExecInitInterpreter(void);
 
 /* support functions */
-static void CheckVarSlotCompatibility(TupleTableSlot *slot, int attnum, Oid vartype);
 static TupleDesc get_cached_rowtype(Oid type_id, int32 typmod,
 				   TupleDesc *cache_field, ExprContext *econtext);
 static void ShutdownTupleDescRef(Datum arg);
@@ -139,11 +138,8 @@ static void ExecEvalRowNullInt(ExprState *state, ExprEvalStep *op,
 				   ExprContext *econtext, bool checkisnull);
 
 /* fast-path evaluation functions */
-static Datum ExecJustInnerVarFirst(ExprState *state, ExprContext *econtext, bool *isnull);
 static Datum ExecJustInnerVar(ExprState *state, ExprContext *econtext, bool *isnull);
-static Datum ExecJustOuterVarFirst(ExprState *state, ExprContext *econtext, bool *isnull);
 static Datum ExecJustOuterVar(ExprState *state, ExprContext *econtext, bool *isnull);
-static Datum ExecJustScanVarFirst(ExprState *state, ExprContext *econtext, bool *isnull);
 static Datum ExecJustScanVar(ExprState *state, ExprContext *econtext, bool *isnull);
 static Datum ExecJustConst(ExprState *state, ExprContext *econtext, bool *isnull);
 static Datum ExecJustAssignInnerVar(ExprState *state, ExprContext *econtext, bool *isnull);
@@ -172,6 +168,8 @@ ExecReadyInterpretedExpr(ExprState *state)
 	if (state->flags & EEO_FLAG_INTERPRETER_INITIALIZED)
 		return;
 
+	state->evalfunc = ExecInterpExprStillValid;
+
 	/* DIRECT_THREADED should not already be set */
 	Assert((state->flags & EEO_FLAG_DIRECT_THREADED) == 0);
 
@@ -195,46 +193,46 @@ ExecReadyInterpretedExpr(ExprState *state)
 		ExprEvalOp	step1 = state->steps[1].opcode;
 
 		if (step0 == EEOP_INNER_FETCHSOME &&
-			step1 == EEOP_INNER_VAR_FIRST)
+			step1 == EEOP_INNER_VAR)
 		{
-			state->evalfunc = ExecJustInnerVarFirst;
+			state->evalfunc_private = ExecJustInnerVar;
 			return;
 		}
 		else if (step0 == EEOP_OUTER_FETCHSOME &&
-				 step1 == EEOP_OUTER_VAR_FIRST)
+				 step1 == EEOP_OUTER_VAR)
 		{
-			state->evalfunc = ExecJustOuterVarFirst;
+			state->evalfunc_private = ExecJustOuterVar;
 			return;
 		}
 		else if (step0 == EEOP_SCAN_FETCHSOME &&
-				 step1 == EEOP_SCAN_VAR_FIRST)
+				 step1 == EEOP_SCAN_VAR)
 		{
-			state->evalfunc = ExecJustScanVarFirst;
+			state->evalfunc_private = ExecJustScanVar;
 			return;
 		}
 		else if (step0 == EEOP_INNER_FETCHSOME &&
 				 step1 == EEOP_ASSIGN_INNER_VAR)
 		{
-			state->evalfunc = ExecJustAssignInnerVar;
+			state->evalfunc_private = ExecJustAssignInnerVar;
 			return;
 		}
 		else if (step0 == EEOP_OUTER_FETCHSOME &&
 				 step1 == EEOP_ASSIGN_OUTER_VAR)
 		{
-			state->evalfunc = ExecJustAssignOuterVar;
+			state->evalfunc_private = ExecJustAssignOuterVar;
 			return;
 		}
 		else if (step0 == EEOP_SCAN_FETCHSOME &&
 				 step1 == EEOP_ASSIGN_SCAN_VAR)
 		{
-			state->evalfunc = ExecJustAssignScanVar;
+			state->evalfunc_private = ExecJustAssignScanVar;
 			return;
 		}
 	}
 	else if (state->steps_len == 2 &&
 			 state->steps[0].opcode == EEOP_CONST)
 	{
-		state->evalfunc = ExecJustConst;
+		state->evalfunc_private = ExecJustConst;
 		return;
 	}
 
@@ -258,7 +256,7 @@ ExecReadyInterpretedExpr(ExprState *state)
 	}
 #endif							/* EEO_USE_COMPUTED_GOTO */
 
-	state->evalfunc = ExecInterpExpr;
+	state->evalfunc_private = ExecInterpExpr;
 }
 
 
@@ -289,11 +287,8 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull)
 		&&CASE_EEOP_INNER_FETCHSOME,
 		&&CASE_EEOP_OUTER_FETCHSOME,
 		&&CASE_EEOP_SCAN_FETCHSOME,
-		&&CASE_EEOP_INNER_VAR_FIRST,
 		&&CASE_EEOP_INNER_VAR,
-		&&CASE_EEOP_OUTER_VAR_FIRST,
 		&&CASE_EEOP_OUTER_VAR,
-		&&CASE_EEOP_SCAN_VAR_FIRST,
 		&&CASE_EEOP_SCAN_VAR,
 		&&CASE_EEOP_INNER_SYSVAR,
 		&&CASE_EEOP_OUTER_SYSVAR,
@@ -415,22 +410,6 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull)
 			EEO_NEXT();
 		}
 
-		EEO_CASE(EEOP_INNER_VAR_FIRST)
-		{
-			int			attnum = op->d.var.attnum;
-
-			/*
-			 * First time through, check whether attribute matches Var.  Might
-			 * not be ok anymore, due to schema changes.
-			 */
-			CheckVarSlotCompatibility(innerslot, attnum + 1, op->d.var.vartype);
-
-			/* Skip that check on subsequent evaluations */
-			op->opcode = EEO_OPCODE(EEOP_INNER_VAR);
-
-			/* FALL THROUGH to EEOP_INNER_VAR */
-		}
-
 		EEO_CASE(EEOP_INNER_VAR)
 		{
 			int			attnum = op->d.var.attnum;
@@ -448,18 +427,6 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull)
 			EEO_NEXT();
 		}
 
-		EEO_CASE(EEOP_OUTER_VAR_FIRST)
-		{
-			int			attnum = op->d.var.attnum;
-
-			/* See EEOP_INNER_VAR_FIRST comments */
-
-			CheckVarSlotCompatibility(outerslot, attnum + 1, op->d.var.vartype);
-			op->opcode = EEO_OPCODE(EEOP_OUTER_VAR);
-
-			/* FALL THROUGH to EEOP_OUTER_VAR */
-		}
-
 		EEO_CASE(EEOP_OUTER_VAR)
 		{
 			int			attnum = op->d.var.attnum;
@@ -473,18 +440,6 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull)
 			EEO_NEXT();
 		}
 
-		EEO_CASE(EEOP_SCAN_VAR_FIRST)
-		{
-			int			attnum = op->d.var.attnum;
-
-			/* See EEOP_INNER_VAR_FIRST comments */
-
-			CheckVarSlotCompatibility(scanslot, attnum + 1, op->d.var.vartype);
-			op->opcode = EEO_OPCODE(EEOP_SCAN_VAR);
-
-			/* FALL THROUGH to EEOP_SCAN_VAR */
-		}
-
 		EEO_CASE(EEOP_SCAN_VAR)
 		{
 			int			attnum = op->d.var.attnum;
@@ -1524,7 +1479,7 @@ out:
  * expression.  This should succeed unless there have been schema changes
  * since the expression tree has been created.
  */
-static void
+void
 CheckVarSlotCompatibility(TupleTableSlot *slot, int attnum, Oid vartype)
 {
 	/*
@@ -1572,6 +1527,61 @@ CheckVarSlotCompatibility(TupleTableSlot *slot, int attnum, Oid vartype)
 	}
 }
 
+Datum
+ExecInterpExprStillValid(ExprState *state, ExprContext *econtext, bool *isNull)
+{
+	CheckExprStillValid(state, econtext, isNull);
+
+	state->evalfunc = state->evalfunc_private;
+
+	return state->evalfunc(state, econtext, isNull);
+}
+
+void
+CheckExprStillValid(ExprState *state, ExprContext *econtext, bool *isNull)
+{
+	int i = 0;
+	TupleTableSlot *innerslot;
+	TupleTableSlot *outerslot;
+	TupleTableSlot *scanslot;
+
+	innerslot = econtext->ecxt_innertuple;
+	outerslot = econtext->ecxt_outertuple;
+	scanslot = econtext->ecxt_scantuple;
+
+	for (i = 0; i < state->steps_len;i++)
+	{
+		ExprEvalStep   *op = &state->steps[i];
+
+		switch (ExecEvalStepOp(state, op))
+		{
+			case EEOP_INNER_VAR:
+				{
+					int			attnum = op->d.var.attnum;
+					CheckVarSlotCompatibility(innerslot, attnum + 1, op->d.var.vartype);
+					break;
+				}
+
+		case EEOP_OUTER_VAR:
+				{
+					int			attnum = op->d.var.attnum;
+					CheckVarSlotCompatibility(outerslot, attnum + 1, op->d.var.vartype);
+					break;
+				}
+
+		case EEOP_SCAN_VAR:
+				{
+					int			attnum = op->d.var.attnum;
+					CheckVarSlotCompatibility(scanslot, attnum + 1, op->d.var.vartype);
+					break;
+				}
+		default:
+			break;
+		}
+	}
+}
+
+
 /*
  * get_cached_rowtype: utility function to lookup a rowtype tupdesc
  *
@@ -1631,28 +1641,6 @@ ShutdownTupleDescRef(Datum arg)
  * Fast-path functions, for very simple expressions
  */
 
-/* Simple reference to inner Var, first time through */
-static Datum
-ExecJustInnerVarFirst(ExprState *state, ExprContext *econtext, bool *isnull)
-{
-	ExprEvalStep *op = &state->steps[1];
-	int			attnum = op->d.var.attnum + 1;
-	TupleTableSlot *slot = econtext->ecxt_innertuple;
-
-	/* See ExecInterpExpr()'s comments for EEOP_INNER_VAR_FIRST */
-
-	CheckVarSlotCompatibility(slot, attnum, op->d.var.vartype);
-	op->opcode = EEOP_INNER_VAR;	/* just for cleanliness */
-	state->evalfunc = ExecJustInnerVar;
-
-	/*
-	 * Since we use slot_getattr(), we don't need to implement the FETCHSOME
-	 * step explicitly, and we also needn't Assert that the attnum is in range
-	 * --- slot_getattr() will take care of any problems.
-	 */
-	return slot_getattr(slot, attnum, isnull);
-}
-
 /* Simple reference to inner Var */
 static Datum
 ExecJustInnerVar(ExprState *state, ExprContext *econtext, bool *isnull)
@@ -1661,23 +1649,11 @@ ExecJustInnerVar(ExprState *state, ExprContext *econtext, bool *isnull)
 	int			attnum = op->d.var.attnum + 1;
 	TupleTableSlot *slot = econtext->ecxt_innertuple;
 
-	/* See comments in ExecJustInnerVarFirst */
-	return slot_getattr(slot, attnum, isnull);
-}
-
-/* Simple reference to outer Var, first time through */
-static Datum
-ExecJustOuterVarFirst(ExprState *state, ExprContext *econtext, bool *isnull)
-{
-	ExprEvalStep *op = &state->steps[1];
-	int			attnum = op->d.var.attnum + 1;
-	TupleTableSlot *slot = econtext->ecxt_outertuple;
-
-	CheckVarSlotCompatibility(slot, attnum, op->d.var.vartype);
-	op->opcode = EEOP_OUTER_VAR;	/* just for cleanliness */
-	state->evalfunc = ExecJustOuterVar;
-
-	/* See comments in ExecJustInnerVarFirst */
+	/*
+	 * Since we use slot_getattr(), we don't need to implement the FETCHSOME
+	 * step explicitly, and we also needn't Assert that the attnum is in range
+	 * --- slot_getattr() will take care of any problems.
+	 */
 	return slot_getattr(slot, attnum, isnull);
 }
 
@@ -1689,23 +1665,7 @@ ExecJustOuterVar(ExprState *state, ExprContext *econtext, bool *isnull)
 	int			attnum = op->d.var.attnum + 1;
 	TupleTableSlot *slot = econtext->ecxt_outertuple;
 
-	/* See comments in ExecJustInnerVarFirst */
-	return slot_getattr(slot, attnum, isnull);
-}
-
-/* Simple reference to scan Var, first time through */
-static Datum
-ExecJustScanVarFirst(ExprState *state, ExprContext *econtext, bool *isnull)
-{
-	ExprEvalStep *op = &state->steps[1];
-	int			attnum = op->d.var.attnum + 1;
-	TupleTableSlot *slot = econtext->ecxt_scantuple;
-
-	CheckVarSlotCompatibility(slot, attnum, op->d.var.vartype);
-	op->opcode = EEOP_SCAN_VAR; /* just for cleanliness */
-	state->evalfunc = ExecJustScanVar;
-
-	/* See comments in ExecJustInnerVarFirst */
+	/* See comments in ExecJustInnerVar */
 	return slot_getattr(slot, attnum, isnull);
 }
 
@@ -1717,7 +1677,7 @@ ExecJustScanVar(ExprState *state, ExprContext *econtext, bool *isnull)
 	int			attnum = op->d.var.attnum + 1;
 	TupleTableSlot *slot = econtext->ecxt_scantuple;
 
-	/* See comments in ExecJustInnerVarFirst */
+	/* See comments in ExecJustInnerVar */
 	return slot_getattr(slot, attnum, isnull);
 }
 
diff --git a/src/include/executor/execExpr.h b/src/include/executor/execExpr.h
index 8ee0496e01..0fbc112890 100644
--- a/src/include/executor/execExpr.h
+++ b/src/include/executor/execExpr.h
@@ -45,12 +45,8 @@ typedef enum ExprEvalOp
 	EEOP_SCAN_FETCHSOME,
 
 	/* compute non-system Var value */
-	/* "FIRST" variants are used only the first time through */
-	EEOP_INNER_VAR_FIRST,
 	EEOP_INNER_VAR,
-	EEOP_OUTER_VAR_FIRST,
 	EEOP_OUTER_VAR,
-	EEOP_SCAN_VAR_FIRST,
 	EEOP_SCAN_VAR,
 
 	/* compute system Var value */
@@ -62,7 +58,6 @@ typedef enum ExprEvalOp
 	EEOP_WHOLEROW,
 
 	/* compute non-system Var value, assign it into ExprState's resultslot */
-	/* (these are not used if _FIRST checks would be needed) */
 	EEOP_ASSIGN_INNER_VAR,
 	EEOP_ASSIGN_OUTER_VAR,
 	EEOP_ASSIGN_SCAN_VAR,
@@ -604,6 +599,10 @@ extern void ExecReadyInterpretedExpr(ExprState *state);
 
 extern ExprEvalOp ExecEvalStepOp(ExprState *state, ExprEvalStep *op);
 
+extern void CheckVarSlotCompatibility(TupleTableSlot *slot, int attnum, Oid vartype);
+extern Datum ExecInterpExprStillValid(ExprState *state, ExprContext *econtext, bool *isNull);
+extern void CheckExprStillValid(ExprState *state, ExprContext *econtext, bool *isNull);
+
 /*
  * Non fast-path execution functions. These are externs instead of statics in
  * execExprInterp.c, because that allows them to be used by other methods of
diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h
index 0dc9fa8d79..8ae8179ee7 100644
--- a/src/include/nodes/execnodes.h
+++ b/src/include/nodes/execnodes.h
@@ -94,6 +94,8 @@ typedef struct ExprState
 
 	Datum	   *innermost_domainval;
 	bool	   *innermost_domainnull;
+
+	void	   *evalfunc_private;
 } ExprState;
 
 
-- 
2.14.1.2.g4274c698f4.dirty

0006-WIP-deduplicate-int-float-overflow-handling-code.patchtext/x-diff; charset=us-asciiDownload
From f3d02385d7914e540c6eaf0ee506d0161d265380 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Thu, 31 Aug 2017 13:25:28 -0700
Subject: [PATCH 06/16] WIP: deduplicate int/float overflow handling code.

Author:
Reviewed-By:
Discussion: https://postgr.es/m/
Backpatch:
---
 src/backend/utils/adt/float.c |  26 +++++++---
 src/backend/utils/adt/int8.c  | 113 +++++++++++++-----------------------------
 2 files changed, 54 insertions(+), 85 deletions(-)

diff --git a/src/backend/utils/adt/float.c b/src/backend/utils/adt/float.c
index 18b3b949ac..78c06b6c41 100644
--- a/src/backend/utils/adt/float.c
+++ b/src/backend/utils/adt/float.c
@@ -47,20 +47,31 @@ static const uint32 nan[2] = {0xffffffff, 0x7fffffff};
 #define MAXFLOATWIDTH	64
 #define MAXDOUBLEWIDTH	128
 
+static void
+floaterr(bool is_overflow)
+{
+	if (is_overflow)
+		ereport(ERROR,											\
+				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),	\
+		  errmsg("value out of range: overflow")));				\
+	else
+		ereport(ERROR,											\
+				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),	\
+		 errmsg("value out of range: underflow")));				\
+}
+
+#undef isinf
+#define isinf __builtin_isinf
+
 /*
  * check to see if a float4/8 val has underflowed or overflowed
  */
 #define CHECKFLOATVAL(val, inf_is_valid, zero_is_valid)			\
 do {															\
 	if (isinf(val) && !(inf_is_valid))							\
-		ereport(ERROR,											\
-				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),	\
-		  errmsg("value out of range: overflow")));				\
-																\
+		floaterr(true);											\
 	if ((val) == 0.0 && !(zero_is_valid))						\
-		ereport(ERROR,											\
-				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),	\
-		 errmsg("value out of range: underflow")));				\
+		floaterr(false);										\
 } while(0)
 
 
@@ -903,6 +914,7 @@ float8mul(PG_FUNCTION_ARGS)
 
 	CHECKFLOATVAL(result, isinf(arg1) || isinf(arg2),
 				  arg1 == 0 || arg2 == 0);
+
 	PG_RETURN_FLOAT8(result);
 }
 
diff --git a/src/backend/utils/adt/int8.c b/src/backend/utils/adt/int8.c
index e8354dee44..8b95a7c479 100644
--- a/src/backend/utils/adt/int8.c
+++ b/src/backend/utils/adt/int8.c
@@ -45,6 +45,14 @@ typedef struct
  * Formatting and conversion routines.
  *---------------------------------------------------------*/
 
+static void
+overflowerr(void)
+{
+	ereport(ERROR,
+			(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+			 errmsg("bigint out of range")));
+}
+
 /*
  * scanint8 --- try to parse a string into an int8.
  *
@@ -495,9 +503,7 @@ int8um(PG_FUNCTION_ARGS)
 	result = -arg;
 	/* overflow check (needed for INT64_MIN) */
 	if (arg != 0 && SAMESIGN(result, arg))
-		ereport(ERROR,
-				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
-				 errmsg("bigint out of range")));
+		overflowerr();
 	PG_RETURN_INT64(result);
 }
 
@@ -524,9 +530,7 @@ int8pl(PG_FUNCTION_ARGS)
 	 * better be that sign too.
 	 */
 	if (SAMESIGN(arg1, arg2) && !SAMESIGN(result, arg1))
-		ereport(ERROR,
-				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
-				 errmsg("bigint out of range")));
+		overflowerr();
 	PG_RETURN_INT64(result);
 }
 
@@ -545,9 +549,8 @@ int8mi(PG_FUNCTION_ARGS)
 	 * result should be of the same sign as the first input.
 	 */
 	if (!SAMESIGN(arg1, arg2) && !SAMESIGN(result, arg1))
-		ereport(ERROR,
-				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
-				 errmsg("bigint out of range")));
+		overflowerr();
+
 	PG_RETURN_INT64(result);
 }
 
@@ -576,9 +579,7 @@ int8mul(PG_FUNCTION_ARGS)
 		if (arg2 != 0 &&
 			((arg2 == -1 && arg1 < 0 && result < 0) ||
 			 result / arg2 != arg1))
-			ereport(ERROR,
-					(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
-					 errmsg("bigint out of range")));
+			overflowerr();
 	}
 	PG_RETURN_INT64(result);
 }
@@ -610,9 +611,7 @@ int8div(PG_FUNCTION_ARGS)
 		result = -arg1;
 		/* overflow check (needed for INT64_MIN) */
 		if (arg1 != 0 && SAMESIGN(result, arg1))
-			ereport(ERROR,
-					(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
-					 errmsg("bigint out of range")));
+			overflowerr();
 		PG_RETURN_INT64(result);
 	}
 
@@ -635,9 +634,7 @@ int8abs(PG_FUNCTION_ARGS)
 	result = (arg1 < 0) ? -arg1 : arg1;
 	/* overflow check (needed for INT64_MIN) */
 	if (result < 0)
-		ereport(ERROR,
-				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
-				 errmsg("bigint out of range")));
+		overflowerr();
 	PG_RETURN_INT64(result);
 }
 
@@ -692,9 +689,7 @@ int8inc(PG_FUNCTION_ARGS)
 		result = *arg + 1;
 		/* Overflow check */
 		if (result < 0 && *arg > 0)
-			ereport(ERROR,
-					(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
-					 errmsg("bigint out of range")));
+			overflowerr();
 
 		*arg = result;
 		PG_RETURN_POINTER(arg);
@@ -709,9 +704,7 @@ int8inc(PG_FUNCTION_ARGS)
 		result = arg + 1;
 		/* Overflow check */
 		if (result < 0 && arg > 0)
-			ereport(ERROR,
-					(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
-					 errmsg("bigint out of range")));
+			overflowerr();
 
 		PG_RETURN_INT64(result);
 	}
@@ -736,9 +729,7 @@ int8dec(PG_FUNCTION_ARGS)
 		result = *arg - 1;
 		/* Overflow check */
 		if (result > 0 && *arg < 0)
-			ereport(ERROR,
-					(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
-					 errmsg("bigint out of range")));
+			overflowerr();
 
 		*arg = result;
 		PG_RETURN_POINTER(arg);
@@ -753,9 +744,7 @@ int8dec(PG_FUNCTION_ARGS)
 		result = arg - 1;
 		/* Overflow check */
 		if (result > 0 && arg < 0)
-			ereport(ERROR,
-					(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
-					 errmsg("bigint out of range")));
+			overflowerr();
 
 		PG_RETURN_INT64(result);
 	}
@@ -829,9 +818,7 @@ int84pl(PG_FUNCTION_ARGS)
 	 * better be that sign too.
 	 */
 	if (SAMESIGN(arg1, arg2) && !SAMESIGN(result, arg1))
-		ereport(ERROR,
-				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
-				 errmsg("bigint out of range")));
+		overflowerr();
 	PG_RETURN_INT64(result);
 }
 
@@ -850,9 +837,7 @@ int84mi(PG_FUNCTION_ARGS)
 	 * result should be of the same sign as the first input.
 	 */
 	if (!SAMESIGN(arg1, arg2) && !SAMESIGN(result, arg1))
-		ereport(ERROR,
-				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
-				 errmsg("bigint out of range")));
+		overflowerr();
 	PG_RETURN_INT64(result);
 }
 
@@ -877,9 +862,7 @@ int84mul(PG_FUNCTION_ARGS)
 	 */
 	if (arg1 != (int64) ((int32) arg1) &&
 		result / arg1 != arg2)
-		ereport(ERROR,
-				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
-				 errmsg("bigint out of range")));
+		overflowerr();
 	PG_RETURN_INT64(result);
 }
 
@@ -910,9 +893,7 @@ int84div(PG_FUNCTION_ARGS)
 		result = -arg1;
 		/* overflow check (needed for INT64_MIN) */
 		if (arg1 != 0 && SAMESIGN(result, arg1))
-			ereport(ERROR,
-					(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
-					 errmsg("bigint out of range")));
+			overflowerr();
 		PG_RETURN_INT64(result);
 	}
 
@@ -938,9 +919,7 @@ int48pl(PG_FUNCTION_ARGS)
 	 * better be that sign too.
 	 */
 	if (SAMESIGN(arg1, arg2) && !SAMESIGN(result, arg1))
-		ereport(ERROR,
-				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
-				 errmsg("bigint out of range")));
+		overflowerr();
 	PG_RETURN_INT64(result);
 }
 
@@ -959,9 +938,7 @@ int48mi(PG_FUNCTION_ARGS)
 	 * result should be of the same sign as the first input.
 	 */
 	if (!SAMESIGN(arg1, arg2) && !SAMESIGN(result, arg1))
-		ereport(ERROR,
-				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
-				 errmsg("bigint out of range")));
+		overflowerr();
 	PG_RETURN_INT64(result);
 }
 
@@ -986,9 +963,7 @@ int48mul(PG_FUNCTION_ARGS)
 	 */
 	if (arg2 != (int64) ((int32) arg2) &&
 		result / arg2 != arg1)
-		ereport(ERROR,
-				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
-				 errmsg("bigint out of range")));
+		overflowerr();
 	PG_RETURN_INT64(result);
 }
 
@@ -1026,9 +1001,7 @@ int82pl(PG_FUNCTION_ARGS)
 	 * better be that sign too.
 	 */
 	if (SAMESIGN(arg1, arg2) && !SAMESIGN(result, arg1))
-		ereport(ERROR,
-				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
-				 errmsg("bigint out of range")));
+		overflowerr();
 	PG_RETURN_INT64(result);
 }
 
@@ -1047,9 +1020,7 @@ int82mi(PG_FUNCTION_ARGS)
 	 * result should be of the same sign as the first input.
 	 */
 	if (!SAMESIGN(arg1, arg2) && !SAMESIGN(result, arg1))
-		ereport(ERROR,
-				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
-				 errmsg("bigint out of range")));
+		overflowerr();
 	PG_RETURN_INT64(result);
 }
 
@@ -1074,9 +1045,7 @@ int82mul(PG_FUNCTION_ARGS)
 	 */
 	if (arg1 != (int64) ((int32) arg1) &&
 		result / arg1 != arg2)
-		ereport(ERROR,
-				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
-				 errmsg("bigint out of range")));
+		overflowerr();
 	PG_RETURN_INT64(result);
 }
 
@@ -1107,9 +1076,7 @@ int82div(PG_FUNCTION_ARGS)
 		result = -arg1;
 		/* overflow check (needed for INT64_MIN) */
 		if (arg1 != 0 && SAMESIGN(result, arg1))
-			ereport(ERROR,
-					(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
-					 errmsg("bigint out of range")));
+			overflowerr();
 		PG_RETURN_INT64(result);
 	}
 
@@ -1135,9 +1102,7 @@ int28pl(PG_FUNCTION_ARGS)
 	 * better be that sign too.
 	 */
 	if (SAMESIGN(arg1, arg2) && !SAMESIGN(result, arg1))
-		ereport(ERROR,
-				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
-				 errmsg("bigint out of range")));
+		overflowerr();
 	PG_RETURN_INT64(result);
 }
 
@@ -1156,9 +1121,7 @@ int28mi(PG_FUNCTION_ARGS)
 	 * result should be of the same sign as the first input.
 	 */
 	if (!SAMESIGN(arg1, arg2) && !SAMESIGN(result, arg1))
-		ereport(ERROR,
-				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
-				 errmsg("bigint out of range")));
+		overflowerr();
 	PG_RETURN_INT64(result);
 }
 
@@ -1183,9 +1146,7 @@ int28mul(PG_FUNCTION_ARGS)
 	 */
 	if (arg2 != (int64) ((int32) arg2) &&
 		result / arg2 != arg1)
-		ereport(ERROR,
-				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
-				 errmsg("bigint out of range")));
+		overflowerr();
 	PG_RETURN_INT64(result);
 }
 
@@ -1356,9 +1317,7 @@ dtoi8(PG_FUNCTION_ARGS)
 	result = (int64) arg;
 
 	if ((float8) result != arg)
-		ereport(ERROR,
-				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
-				 errmsg("bigint out of range")));
+		overflowerr();
 
 	PG_RETURN_INT64(result);
 }
@@ -1395,9 +1354,7 @@ ftoi8(PG_FUNCTION_ARGS)
 	result = (int64) darg;
 
 	if ((float8) result != darg)
-		ereport(ERROR,
-				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
-				 errmsg("bigint out of range")));
+		overflowerr();
 
 	PG_RETURN_INT64(result);
 }
-- 
2.14.1.2.g4274c698f4.dirty

0007-Pass-through-PlanState-parent-to-expression-instanti.patchtext/x-diff; charset=us-asciiDownload
From f0f4766679abcd55fbb117abfc97ccebf0522c80 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Thu, 31 Aug 2017 13:27:28 -0700
Subject: [PATCH 07/16] Pass through PlanState parent to expression
 instantiation.

---
 src/backend/executor/execExpr.c       | 21 +++++++++++++++------
 src/backend/executor/execExprInterp.c |  2 +-
 2 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/src/backend/executor/execExpr.c b/src/backend/executor/execExpr.c
index 81549ee915..b5bde3fa80 100644
--- a/src/backend/executor/execExpr.c
+++ b/src/backend/executor/execExpr.c
@@ -54,7 +54,7 @@ typedef struct LastAttnumInfo
 	AttrNumber	last_scan;
 } LastAttnumInfo;
 
-static void ExecReadyExpr(ExprState *state);
+static void ExecReadyExpr(ExprState *state, PlanState *parent);
 static void ExecInitExprRec(Expr *node, PlanState *parent, ExprState *state,
 				Datum *resv, bool *resnull);
 static void ExprEvalPushStep(ExprState *es, const ExprEvalStep *s);
@@ -123,6 +123,9 @@ ExecInitExpr(Expr *node, PlanState *parent)
 	state = makeNode(ExprState);
 	state->expr = node;
 
+	scratch.resvalue = NULL;
+	scratch.resnull = NULL;
+
 	/* Insert EEOP_*_FETCHSOME steps as needed */
 	ExecInitExprSlots(state, (Node *) node);
 
@@ -133,7 +136,7 @@ ExecInitExpr(Expr *node, PlanState *parent)
 	scratch.opcode = EEOP_DONE;
 	ExprEvalPushStep(state, &scratch);
 
-	ExecReadyExpr(state);
+	ExecReadyExpr(state, parent);
 
 	return state;
 }
@@ -225,7 +228,7 @@ ExecInitQual(List *qual, PlanState *parent)
 	scratch.opcode = EEOP_DONE;
 	ExprEvalPushStep(state, &scratch);
 
-	ExecReadyExpr(state);
+	ExecReadyExpr(state, parent);
 
 	return state;
 }
@@ -316,6 +319,9 @@ ExecBuildProjectionInfo(List *targetList,
 	state->expr = (Expr *) targetList;
 	state->resultslot = slot;
 
+	scratch.resvalue = NULL;
+	scratch.resnull = NULL;
+
 	/* Insert EEOP_*_FETCHSOME steps as needed */
 	ExecInitExprSlots(state, (Node *) targetList);
 
@@ -417,7 +423,7 @@ ExecBuildProjectionInfo(List *targetList,
 	scratch.opcode = EEOP_DONE;
 	ExprEvalPushStep(state, &scratch);
 
-	ExecReadyExpr(state);
+	ExecReadyExpr(state, parent);
 
 	return projInfo;
 }
@@ -571,9 +577,9 @@ ExecCheck(ExprState *state, ExprContext *econtext)
  * ExecReadyInterpretedExpr().
  */
 static void
-ExecReadyExpr(ExprState *state)
+ExecReadyExpr(ExprState *state, PlanState *parent)
 {
-	ExecReadyInterpretedExpr(state);
+	ExecReadyInterpretedExpr(state, parent);
 }
 
 /*
@@ -2173,6 +2179,9 @@ ExecInitExprSlots(ExprState *state, Node *node)
 	LastAttnumInfo info = {0, 0, 0};
 	ExprEvalStep scratch;
 
+	scratch.resvalue = NULL;
+	scratch.resnull = NULL;
+
 	/*
 	 * Figure out which attributes we're going to need.
 	 */
diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c
index 50e3f8b176..df453b2ab4 100644
--- a/src/backend/executor/execExprInterp.c
+++ b/src/backend/executor/execExprInterp.c
@@ -151,7 +151,7 @@ static Datum ExecJustAssignScanVar(ExprState *state, ExprContext *econtext, bool
  * Prepare ExprState for interpreted execution.
  */
 void
-ExecReadyInterpretedExpr(ExprState *state)
+ExecReadyInterpretedExpr(ExprState *state, PlanState *parent)
 {
 	/* Ensure one-time interpreter setup has been done */
 	ExecInitInterpreter();
-- 
2.14.1.2.g4274c698f4.dirty

0008-WIP-JIT-compile-expression.patchtext/x-diff; charset=us-asciiDownload
From a75729ca7b46d7e2cdaa97bf4269d459e36fe655 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Thu, 31 Aug 2017 14:26:02 -0700
Subject: [PATCH 08/16] WIP: JIT compile expression.

---
 src/backend/executor/Makefile          |    2 +-
 src/backend/executor/execExpr.c        |    5 +
 src/backend/executor/execExprCompile.c | 2403 ++++++++++++++++++++++++++++++++
 src/backend/utils/fmgr/fmgr.c          |    2 +-
 src/backend/utils/misc/guc.c           |   11 +
 src/include/executor/execExpr.h        |    3 +-
 src/include/executor/executor.h        |    4 +
 src/include/lib/llvmjit.h              |    5 +-
 src/include/utils/fmgrtab.h            |    2 +
 9 files changed, 2431 insertions(+), 6 deletions(-)
 create mode 100644 src/backend/executor/execExprCompile.c

diff --git a/src/backend/executor/Makefile b/src/backend/executor/Makefile
index 083b20f3fe..277c2e8bf0 100644
--- a/src/backend/executor/Makefile
+++ b/src/backend/executor/Makefile
@@ -12,7 +12,7 @@ subdir = src/backend/executor
 top_builddir = ../../..
 include $(top_builddir)/src/Makefile.global
 
-OBJS = execAmi.o execCurrent.o execExpr.o execExprInterp.o \
+OBJS = execAmi.o execCurrent.o execExpr.o execExprCompile.o execExprInterp.o \
        execGrouping.o execIndexing.o execJunk.o \
        execMain.o execParallel.o execProcnode.o \
        execReplication.o execScan.o execSRF.o execTuples.o \
diff --git a/src/backend/executor/execExpr.c b/src/backend/executor/execExpr.c
index b5bde3fa80..e6ffe6e062 100644
--- a/src/backend/executor/execExpr.c
+++ b/src/backend/executor/execExpr.c
@@ -579,6 +579,11 @@ ExecCheck(ExprState *state, ExprContext *econtext)
 static void
 ExecReadyExpr(ExprState *state, PlanState *parent)
 {
+#ifdef USE_LLVM
+	if (ExecReadyCompiledExpr(state, parent))
+		return;
+#endif
+
 	ExecReadyInterpretedExpr(state, parent);
 }
 
diff --git a/src/backend/executor/execExprCompile.c b/src/backend/executor/execExprCompile.c
new file mode 100644
index 0000000000..d41405b648
--- /dev/null
+++ b/src/backend/executor/execExprCompile.c
@@ -0,0 +1,2403 @@
+/*-------------------------------------------------------------------------
+ *
+ * execCompileExpr.c
+ *	  LLVM compilation based expression evaluation.
+ *
+ * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ *	  src/backend/executor/execCompileExpr.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres.h"
+
+#ifdef USE_LLVM
+
+#include "access/htup_details.h"
+#include "access/nbtree.h"
+#include "access/tupconvert.h"
+#include "catalog/objectaccess.h"
+#include "catalog/pg_type.h"
+#include "executor/execdebug.h"
+#include "executor/nodeSubplan.h"
+#include "executor/execExpr.h"
+#include "funcapi.h"
+#include "lib/llvmjit.h"
+#include "miscadmin.h"
+#include "nodes/makefuncs.h"
+#include "nodes/nodeFuncs.h"
+#include "optimizer/planner.h"
+#include "parser/parse_coerce.h"
+#include "parser/parsetree.h"
+#include "pgstat.h"
+#include "utils/acl.h"
+#include "utils/builtins.h"
+#include "utils/date.h"
+#include "utils/fmgrtab.h"
+#include "utils/lsyscache.h"
+#include "utils/memutils.h"
+#include "utils/timestamp.h"
+#include "utils/typcache.h"
+#include "utils/xml.h"
+
+
+typedef struct CompiledExprState
+{
+	LLVMJitContext *context;
+	const char *funcname;
+} CompiledExprState;
+
+
+bool jit_expressions = false;
+
+
+static LLVMValueRef
+create_slot_getsomeattrs(LLVMModuleRef mod)
+{
+	LLVMTypeRef sig;
+	LLVMValueRef fn;
+	LLVMTypeRef param_types[2];
+	const char *nm = "slot_getsomeattrs";
+
+	fn = LLVMGetNamedFunction(mod, nm);
+	if (fn)
+		return fn;
+
+	param_types[0] = LLVMPointerType(StructTupleTableSlot, 0);
+	param_types[1] = LLVMInt32Type();
+
+	sig = LLVMFunctionType(LLVMInt64Type(), param_types, lengthof(param_types), 0);
+	fn = LLVMAddFunction(mod, nm, sig);
+
+	return fn;
+}
+
+
+static LLVMValueRef
+create_heap_getsysattr(LLVMModuleRef mod)
+{
+	LLVMTypeRef sig;
+	LLVMValueRef fn;
+	LLVMTypeRef param_types[4];
+	const char *nm = "heap_getsysattr";
+
+	fn = LLVMGetNamedFunction(mod, nm);
+	if (fn)
+		return fn;
+
+	/* heap_getsysattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull) */
+	param_types[0] = LLVMPointerType(StructHeapTupleData, 0);
+	param_types[1] = LLVMInt32Type();
+	param_types[2] = LLVMPointerType(StructtupleDesc, 0);
+	param_types[3] = LLVMPointerType(LLVMInt8Type(), 0);
+
+	sig = LLVMFunctionType(LLVMInt64Type(), param_types, lengthof(param_types), 0);
+	fn = LLVMAddFunction(mod, nm, sig);
+
+	return fn;
+}
+
+static LLVMValueRef
+create_EvalXFunc(LLVMModuleRef mod, const char *funcname)
+{
+	LLVMTypeRef sig;
+	LLVMValueRef fn;
+	LLVMTypeRef param_types[3];
+
+	fn = LLVMGetNamedFunction(mod, funcname);
+	if (fn)
+		return fn;
+
+	param_types[0] = LLVMPointerType(StructExprState, 0);
+	param_types[1] = LLVMPointerType(TypeSizeT, 0);
+	param_types[2] = LLVMPointerType(StructExprContext, 0);
+
+	sig = LLVMFunctionType(LLVMVoidType(), param_types, lengthof(param_types), 0);
+	fn = LLVMAddFunction(mod, funcname, sig);
+
+	return fn;
+}
+
+static LLVMValueRef
+create_MakeExpandedObjectReadOnly(LLVMModuleRef mod)
+{
+	LLVMTypeRef sig;
+	LLVMValueRef fn;
+	LLVMTypeRef param_types[1];
+	const char *nm = "MakeExpandedObjectReadOnlyInternal";
+
+	fn = LLVMGetNamedFunction(mod, nm);
+	if (fn)
+		return fn;
+
+	param_types[0] = TypeSizeT;
+
+	sig = LLVMFunctionType(TypeSizeT, param_types, lengthof(param_types), 0);
+	fn = LLVMAddFunction(mod, nm, sig);
+
+	return fn;
+}
+
+static LLVMValueRef
+create_EvalArrayRefSubscript(LLVMModuleRef mod)
+{
+	LLVMTypeRef sig;
+	LLVMValueRef fn;
+	LLVMTypeRef param_types[3];
+	const char *nm = "ExecEvalArrayRefSubscript";
+
+	fn = LLVMGetNamedFunction(mod, nm);
+	if (fn)
+		return fn;
+
+	param_types[0] = LLVMPointerType(StructExprState, 0);
+	param_types[1] = LLVMPointerType(TypeSizeT, 0);
+	param_types[2] = LLVMPointerType(StructExprContext, 0);
+
+	sig = LLVMFunctionType(LLVMInt8Type(), param_types, lengthof(param_types), 0);
+	fn = LLVMAddFunction(mod, nm, sig);
+
+	return fn;
+}
+
+static LLVMValueRef
+get_LifetimeEnd(LLVMModuleRef mod)
+{
+	LLVMTypeRef sig;
+	LLVMValueRef fn;
+	LLVMTypeRef param_types[2];
+	const char *nm = "llvm.lifetime.end.p0i8";
+
+	fn = LLVMGetNamedFunction(mod, nm);
+	if (fn)
+		return fn;
+
+	param_types[0] = LLVMInt64Type();
+	param_types[1] = LLVMPointerType(LLVMInt8Type(), 0);
+
+	sig = LLVMFunctionType(LLVMVoidType(), param_types, lengthof(param_types), 0);
+	fn = LLVMAddFunction(mod, nm, sig);
+
+	LLVMSetFunctionCallConv(fn, LLVMCCallConv);
+
+	Assert(LLVMGetIntrinsicID(fn));
+
+	return fn;
+}
+
+static LLVMValueRef
+BuildFunctionCall(LLVMJitContext *context, LLVMBuilderRef builder,
+				  LLVMModuleRef mod, FunctionCallInfo fcinfo,
+				  LLVMValueRef *v_fcinfo_isnull)
+{
+	bool forceinline = false;
+	LLVMValueRef v_fn_addr;
+	LLVMValueRef v_fcinfo_isnullp;
+	LLVMValueRef v_retval;
+	LLVMValueRef v_fcinfo;
+	const FmgrBuiltin *builtin;
+
+	builtin = fmgr_isbuiltin(fcinfo->flinfo->fn_oid);
+
+	if (builtin && LLVMGetNamedFunction(mod, builtin->funcName))
+	{
+		v_fn_addr = LLVMGetNamedFunction(mod, builtin->funcName);
+
+		forceinline = true;
+
+	}
+	else if (builtin)
+	{
+		LLVMAddFunction(mod, builtin->funcName, TypePGFunction);
+		v_fn_addr = LLVMGetNamedFunction(mod, builtin->funcName);
+		Assert(v_fn_addr);
+	}
+	else
+	{
+		v_fn_addr = LLVMBuildIntToPtr(
+			builder,
+			LLVMConstInt(TypeSizeT, (intptr_t) fcinfo->flinfo->fn_addr, false),
+			LLVMPointerType(TypePGFunction, 0),
+			"v_fn_addr");
+	}
+
+	v_fcinfo = LLVMBuildIntToPtr(
+		builder,
+		LLVMConstInt(TypeSizeT, (intptr_t) fcinfo, false),
+		LLVMPointerType(StructFunctionCallInfoData, 0),
+		"v_fcinfo");
+
+	v_fcinfo_isnullp = LLVMBuildIntToPtr(
+		builder,
+		LLVMConstInt(TypeSizeT, (intptr_t) &fcinfo->isnull, false),
+		LLVMPointerType(LLVMInt8Type(), 0),
+		"v_fcinfo_isnull");
+	LLVMBuildStore(builder, LLVMConstInt(LLVMInt8Type(), 0, false),
+				   v_fcinfo_isnullp);
+
+	v_retval = LLVMBuildCall(builder, v_fn_addr, &v_fcinfo, 1, "funccall");
+
+	if (forceinline)
+	{
+		int id = LLVMGetEnumAttributeKindForName("alwaysinline", sizeof("alwaysinline") - 1);
+		LLVMAttributeRef attr;
+
+		attr = LLVMCreateEnumAttribute(LLVMGetGlobalContext(),
+									   id, 0);
+		LLVMAddCallSiteAttribute(v_retval, LLVMAttributeFunctionIndex, attr);
+	}
+
+	if (v_fcinfo_isnull)
+		*v_fcinfo_isnull = LLVMBuildLoad(builder, v_fcinfo_isnullp, "");
+
+	/*
+	 * Add lifetime-end annotation, signalling that writes to memory don't
+	 * have to be retained (important for inlining potential).
+	 */
+	{
+		LLVMValueRef v_lifetime = get_LifetimeEnd(mod);
+		LLVMValueRef params[2];
+
+		params[0] = LLVMConstInt(LLVMInt64Type(), sizeof(FunctionCallInfoData), false);
+		params[1] = LLVMBuildBitCast(
+			builder, v_fcinfo,
+			LLVMPointerType(LLVMInt8Type(), 0),
+			"");
+		LLVMBuildCall(builder, v_lifetime, params, lengthof(params), "");
+	}
+
+	return v_retval;
+}
+
+static Datum
+ExecRunCompiledExpr(ExprState *state, ExprContext *econtext, bool *isNull)
+{
+	CompiledExprState *cstate = state->evalfunc_private;
+	ExprStateEvalFunc func;
+
+	CheckExprStillValid(state, econtext, isNull);
+
+	func = (ExprStateEvalFunc) llvm_get_function(cstate->context,
+												 cstate->funcname);
+	if (!func)
+		elog(ERROR, "failed to jit");
+
+	state->evalfunc = func;
+
+	return func(state, econtext, isNull);
+}
+
+bool
+ExecReadyCompiledExpr(ExprState *state, PlanState *parent)
+{
+	ExprEvalStep   *op;
+	int i = 0;
+	char *funcname;
+
+	LLVMJitContext *context = NULL;
+
+	LLVMBuilderRef builder;
+	LLVMModuleRef mod;
+	LLVMTypeRef eval_sig;
+	LLVMValueRef eval_fn;
+	LLVMBasicBlockRef entry;
+	LLVMBasicBlockRef *opblocks;
+
+	/* referenced functions */
+	LLVMValueRef l_heap_getsysattr = NULL;
+
+	/* state itself */
+	LLVMValueRef v_state;
+	LLVMValueRef v_econtext;
+
+	/* returnvalue */
+	LLVMValueRef v_isnullp;
+
+	/* tmp vars in state */
+	LLVMValueRef v_tmpvaluep;
+	LLVMValueRef v_tmpisnullp;
+
+	/* slots */
+	LLVMValueRef v_innerslot;
+	LLVMValueRef v_outerslot;
+	LLVMValueRef v_scanslot;
+	LLVMValueRef v_resultslot;
+
+	/* nulls/values of slots */
+	LLVMValueRef v_innervalues;
+	LLVMValueRef v_innernulls;
+	LLVMValueRef v_outervalues;
+	LLVMValueRef v_outernulls;
+	LLVMValueRef v_scanvalues;
+	LLVMValueRef v_scannulls;
+	LLVMValueRef v_resultvalues;
+	LLVMValueRef v_resultnulls;
+
+	/* stuff in econtext */
+	LLVMValueRef v_aggvalues;
+	LLVMValueRef v_aggnulls;
+
+	/* only do JITing if enabled */
+	if (!jit_expressions || !parent)
+		return false;
+
+	llvm_initialize();
+
+	if (parent && parent->state->es_jit)
+	{
+		context = parent->state->es_jit;
+	}
+	else
+	{
+		context = MemoryContextAllocZero(TopMemoryContext,
+										 sizeof(LLVMJitContext));
+
+		if (parent)
+		{
+			parent->state->es_jit = context;
+		}
+
+	}
+
+	mod = context->module;
+	if (!mod)
+	{
+		context->compiled = false;
+		mod = context->module = LLVMModuleCreateWithName("evalexpr");
+		LLVMSetTarget(mod, llvm_triple);
+	}
+
+	op = state->steps;
+	funcname = psprintf("evalexpr%d", context->counter);
+	context->counter++;
+
+	builder = LLVMCreateBuilder();
+
+	/* Create the signature and function */
+	{
+		LLVMTypeRef param_types[] = {
+			LLVMPointerType(StructExprState, 0), /* state */
+			LLVMPointerType(StructExprContext, 0), /* econtext */
+			LLVMPointerType(LLVMInt8Type(), 0)}; /* isnull */
+		eval_sig = LLVMFunctionType(TypeSizeT, param_types, lengthof(param_types), 0);
+	}
+	eval_fn = LLVMAddFunction(mod, funcname, eval_sig);
+	LLVMSetLinkage(eval_fn, LLVMExternalLinkage);
+	LLVMSetVisibility(eval_fn, LLVMDefaultVisibility);
+
+	entry = LLVMAppendBasicBlock(eval_fn, "entry");
+
+	/* build state */
+	v_state = LLVMGetParam(eval_fn, 0);
+	v_econtext = LLVMGetParam(eval_fn, 1);
+	v_isnullp = LLVMGetParam(eval_fn, 2);
+
+	LLVMPositionBuilderAtEnd(builder, entry);
+
+	v_tmpvaluep = LLVMBuildStructGEP(builder, v_state, 3, "v.state.resvalue");
+	v_tmpisnullp = LLVMBuildStructGEP(builder, v_state, 2, "v.state.resnull");
+
+	/* build global slots */
+	v_scanslot = LLVMBuildLoad(builder, LLVMBuildStructGEP(builder, v_econtext, 1, ""), "v_scanslot");
+	v_innerslot = LLVMBuildLoad(builder, LLVMBuildStructGEP(builder, v_econtext, 2, ""), "v_innerslot");
+	v_outerslot = LLVMBuildLoad(builder, LLVMBuildStructGEP(builder, v_econtext, 3, ""), "v_outerslot");
+	v_resultslot = LLVMBuildLoad(builder, LLVMBuildStructGEP(builder, v_state, 4, ""), "v_resultslot");
+
+	/* build global values/isnull pointers */
+	v_scanvalues = LLVMBuildLoad(builder, LLVMBuildStructGEP(builder, v_scanslot, 10, ""), "v_scanvalues");
+	v_scannulls = LLVMBuildLoad(builder, LLVMBuildStructGEP(builder, v_scanslot, 11, ""), "v_scannulls");
+	v_innervalues = LLVMBuildLoad(builder, LLVMBuildStructGEP(builder, v_innerslot, 10, ""), "v_innervalues");
+	v_innernulls = LLVMBuildLoad(builder, LLVMBuildStructGEP(builder, v_innerslot, 11, ""), "v_innernulls");
+	v_outervalues = LLVMBuildLoad(builder, LLVMBuildStructGEP(builder, v_outerslot, 10, ""), "v_outervalues");
+	v_outernulls = LLVMBuildLoad(builder, LLVMBuildStructGEP(builder, v_outerslot, 11, ""), "v_outernulls");
+	v_resultvalues = LLVMBuildLoad(builder, LLVMBuildStructGEP(builder, v_resultslot, 10, ""), "v_resultvalues");
+	v_resultnulls = LLVMBuildLoad(builder, LLVMBuildStructGEP(builder, v_resultslot, 11, ""), "v_resultnulls");
+
+	/* aggvalues/aggnulls */
+	v_aggvalues = LLVMBuildLoad(builder, LLVMBuildStructGEP(builder, v_econtext, 8, ""), "v.econtext.aggvalues");
+	v_aggnulls = LLVMBuildLoad(builder, LLVMBuildStructGEP(builder, v_econtext, 9, ""), "v.econtext.aggnulls");
+
+	/* allocate blocks for each op upfront, so we can do jumps easily */
+	opblocks = palloc(sizeof(LLVMBasicBlockRef) * state->steps_len);
+	for (i = 0; i < state->steps_len; i++)
+	{
+		char *blockname = psprintf("block.op.%d.start", i);
+		opblocks[i] = LLVMAppendBasicBlock(eval_fn, blockname);
+		pfree(blockname);
+	}
+
+	/* jump from entry to first block */
+	LLVMBuildBr(builder, opblocks[0]);
+
+	for (i = 0; i < state->steps_len; i++)
+	{
+		LLVMValueRef v_resvaluep; /* FIXME */
+		LLVMValueRef v_resnullp;
+
+		LLVMPositionBuilderAtEnd(builder, opblocks[i]);
+
+		op = &state->steps[i];
+
+		v_resvaluep = LLVMBuildIntToPtr(
+			builder,
+			LLVMConstInt(TypeSizeT, (intptr_t) op->resvalue, false),
+			LLVMPointerType(TypeSizeT, 0),
+			"v_resvaluep");
+		v_resnullp = LLVMBuildIntToPtr(
+			builder,
+			LLVMConstInt(TypeSizeT, (intptr_t) op->resnull, false),
+			LLVMPointerType(LLVMInt8Type(), 0),
+			"v_resnullp");
+
+		switch ((ExprEvalOp) op->opcode)
+		{
+			case EEOP_DONE:
+				{
+					LLVMValueRef v_tmpisnull, v_tmpvalue;
+
+					v_tmpvalue = LLVMBuildLoad(builder, v_tmpvaluep, "");
+					v_tmpisnull = LLVMBuildLoad(builder, v_tmpisnullp, "");
+
+					LLVMBuildStore(builder, v_tmpisnull, v_isnullp);
+
+
+					{
+						LLVMValueRef v_lifetime;
+						LLVMValueRef v_steps;
+						LLVMValueRef params[2];
+
+						v_lifetime = get_LifetimeEnd(mod);
+
+						v_steps = LLVMBuildIntToPtr(
+							builder,
+							LLVMConstInt(TypeSizeT, (uintptr_t) state->steps, false),
+							LLVMPointerType(TypeSizeT, 0), "");
+
+						params[0] = LLVMConstInt(LLVMInt64Type(),
+												 sizeof(state->steps[0]) * state->steps_len,
+												 false);
+						params[1] = LLVMBuildBitCast(
+							builder, v_steps,
+							LLVMPointerType(LLVMInt8Type(), 0),
+							"");
+
+						LLVMBuildCall(builder, v_lifetime, params, lengthof(params), "");
+
+						params[0] = LLVMConstInt(LLVMInt64Type(), sizeof(*state), false);
+						params[1] = LLVMBuildBitCast(
+							builder, v_state,
+							LLVMPointerType(LLVMInt8Type(), 0),
+							"");
+
+						LLVMBuildCall(builder, v_lifetime, params, lengthof(params), "");
+					}
+
+
+					LLVMBuildRet(builder, v_tmpvalue);
+					break;
+				}
+			case EEOP_INNER_FETCHSOME:
+			case EEOP_OUTER_FETCHSOME:
+			case EEOP_SCAN_FETCHSOME:
+				{
+					LLVMValueRef v_slot;
+					LLVMBasicBlockRef b_fetch = LLVMInsertBasicBlock(opblocks[i + 1], "");
+					LLVMValueRef v_nvalid;
+
+					if (op->opcode == EEOP_INNER_FETCHSOME)
+					{
+
+						v_slot = v_innerslot;
+
+					}
+					else if (op->opcode == EEOP_OUTER_FETCHSOME)
+					{
+						v_slot = v_outerslot;
+					}
+					else
+					{
+						v_slot = v_scanslot;
+					}
+
+					/*
+					 * Check if all required attributes are available, or
+					 * whether deforming is required.
+					 */
+					v_nvalid = LLVMBuildLoad(
+						builder,
+						LLVMBuildStructGEP(builder, v_slot, 9, ""), "");
+					LLVMBuildCondBr(
+						builder,
+						LLVMBuildICmp(builder, LLVMIntUGE,
+									  v_nvalid,
+									  LLVMConstInt(LLVMInt32Type(), op->d.fetch.last_var, false),
+									  ""),
+						opblocks[i + 1], b_fetch);
+
+					LLVMPositionBuilderAtEnd(builder, b_fetch);
+					{
+						LLVMValueRef params[2];
+
+						params[0] = v_slot;
+						params[1] = LLVMConstInt(LLVMInt32Type(), op->d.fetch.last_var, false);
+
+						LLVMBuildCall(builder, create_slot_getsomeattrs(mod), params, lengthof(params), "");
+					}
+
+					LLVMBuildBr(builder, opblocks[i + 1]);
+					break;
+				}
+
+		case EEOP_INNER_VAR:
+				{
+					LLVMValueRef value, isnull;
+					LLVMValueRef v_attnum;
+
+					v_attnum = LLVMConstInt(LLVMInt32Type(), op->d.var.attnum, false);
+					value = LLVMBuildLoad(builder, LLVMBuildGEP(builder, v_innervalues, &v_attnum, 1, ""), "");
+					isnull = LLVMBuildLoad(builder, LLVMBuildGEP(builder, v_innernulls, &v_attnum, 1, ""), "");
+					LLVMBuildStore(builder, value, v_resvaluep);
+					LLVMBuildStore(builder, isnull, v_resnullp);
+
+					LLVMBuildBr(builder, opblocks[i + 1]);
+					break;
+				}
+
+			case EEOP_OUTER_VAR:
+				{
+					LLVMValueRef value, isnull;
+					LLVMValueRef v_attnum;
+
+					v_attnum = LLVMConstInt(LLVMInt32Type(), op->d.var.attnum, false);
+					value = LLVMBuildLoad(builder, LLVMBuildGEP(builder, v_outervalues, &v_attnum, 1, ""), "");
+					isnull = LLVMBuildLoad(builder, LLVMBuildGEP(builder, v_outernulls, &v_attnum, 1, ""), "");
+					LLVMBuildStore(builder, value, v_resvaluep);
+					LLVMBuildStore(builder, isnull, v_resnullp);
+
+					LLVMBuildBr(builder, opblocks[i + 1]);
+					break;
+				}
+
+			case EEOP_SCAN_VAR:
+				{
+					LLVMValueRef value, isnull;
+					LLVMValueRef v_attnum;
+
+					v_attnum = LLVMConstInt(LLVMInt32Type(), op->d.var.attnum, false);
+					value = LLVMBuildLoad(builder, LLVMBuildGEP(builder, v_scanvalues, &v_attnum, 1, ""), "");
+					isnull = LLVMBuildLoad(builder, LLVMBuildGEP(builder, v_scannulls, &v_attnum, 1, ""), "");
+					LLVMBuildStore(builder, value, v_resvaluep);
+					LLVMBuildStore(builder, isnull, v_resnullp);
+
+					LLVMBuildBr(builder, opblocks[i + 1]);
+					break;
+				}
+
+			case EEOP_ASSIGN_INNER_VAR:
+				{
+					LLVMValueRef v_value, v_isnull;
+					LLVMValueRef v_rvaluep, v_risnullp;
+					LLVMValueRef v_attnum, v_resultnum;
+
+					v_attnum = LLVMConstInt(LLVMInt32Type(), op->d.assign_var.attnum, false);
+					v_resultnum = LLVMConstInt(LLVMInt32Type(), op->d.assign_var.resultnum, false);
+					v_rvaluep = LLVMBuildGEP(builder, v_resultvalues, &v_resultnum, 1, "");
+					v_risnullp = LLVMBuildGEP(builder, v_resultnulls, &v_resultnum, 1, "");
+
+					v_value = LLVMBuildLoad(builder, LLVMBuildGEP(builder, v_innervalues, &v_attnum, 1, ""), "");
+					v_isnull = LLVMBuildLoad(builder, LLVMBuildGEP(builder, v_innernulls, &v_attnum, 1, ""), "");
+
+					LLVMBuildStore(builder, v_value, v_rvaluep);
+					LLVMBuildStore(builder, v_isnull, v_risnullp);
+
+					LLVMBuildBr(builder, opblocks[i + 1]);
+					break;
+
+				}
+
+			case EEOP_ASSIGN_OUTER_VAR:
+				{
+					LLVMValueRef v_value, v_isnull;
+					LLVMValueRef v_rvaluep, v_risnullp;
+					LLVMValueRef v_attnum, v_resultnum;
+
+					v_attnum = LLVMConstInt(LLVMInt32Type(), op->d.assign_var.attnum, false);
+					v_resultnum = LLVMConstInt(LLVMInt32Type(), op->d.assign_var.resultnum, false);
+					v_rvaluep = LLVMBuildGEP(builder, v_resultvalues, &v_resultnum, 1, "");
+					v_risnullp = LLVMBuildGEP(builder, v_resultnulls, &v_resultnum, 1, "");
+
+					v_value = LLVMBuildLoad(builder, LLVMBuildGEP(builder, v_outervalues, &v_attnum, 1, ""), "");
+					v_isnull = LLVMBuildLoad(builder, LLVMBuildGEP(builder, v_outernulls, &v_attnum, 1, ""), "");
+
+					LLVMBuildStore(builder, v_value, v_rvaluep);
+					LLVMBuildStore(builder, v_isnull, v_risnullp);
+
+					LLVMBuildBr(builder, opblocks[i + 1]);
+					break;
+				}
+
+			case EEOP_ASSIGN_SCAN_VAR:
+				{
+					LLVMValueRef v_value, v_isnull;
+					LLVMValueRef v_rvaluep, v_risnullp;
+					LLVMValueRef v_attnum, v_resultnum;
+
+					v_attnum = LLVMConstInt(LLVMInt32Type(), op->d.assign_var.attnum, false);
+					v_resultnum = LLVMConstInt(LLVMInt32Type(), op->d.assign_var.resultnum, false);
+					v_rvaluep = LLVMBuildGEP(builder, v_resultvalues, &v_resultnum, 1, "");
+					v_risnullp = LLVMBuildGEP(builder, v_resultnulls, &v_resultnum, 1, "");
+
+					v_value = LLVMBuildLoad(builder, LLVMBuildGEP(builder, v_scanvalues, &v_attnum, 1, ""), "");
+					v_isnull = LLVMBuildLoad(builder, LLVMBuildGEP(builder, v_scannulls, &v_attnum, 1, ""), "");
+
+					LLVMBuildStore(builder, v_value, v_rvaluep);
+					LLVMBuildStore(builder, v_isnull, v_risnullp);
+
+					LLVMBuildBr(builder, opblocks[i + 1]);
+					break;
+				}
+
+			case EEOP_ASSIGN_TMP:
+				{
+					LLVMValueRef v_value, v_isnull;
+					LLVMValueRef v_rvaluep, v_risnullp;
+					LLVMValueRef v_resultnum;
+					size_t resultnum = op->d.assign_tmp.resultnum;
+
+					v_resultnum = LLVMConstInt(LLVMInt32Type(), resultnum, false);
+					v_value = LLVMBuildLoad(builder, v_tmpvaluep, "");
+					v_isnull = LLVMBuildLoad(builder, v_tmpisnullp, "");
+					v_rvaluep = LLVMBuildGEP(builder, v_resultvalues, &v_resultnum, 1, "");
+					v_risnullp = LLVMBuildGEP(builder, v_resultnulls, &v_resultnum, 1, "");
+
+					LLVMBuildStore(builder, v_value, v_rvaluep);
+					LLVMBuildStore(builder, v_isnull, v_risnullp);
+
+					LLVMBuildBr(builder, opblocks[i + 1]);
+					break;
+				}
+
+			case EEOP_ASSIGN_TMP_MAKE_RO:
+				{
+					LLVMBasicBlockRef b_notnull;
+					LLVMValueRef v_params[1];
+					LLVMValueRef v_ret;
+					LLVMValueRef v_value, v_isnull;
+					LLVMValueRef v_rvaluep, v_risnullp;
+					LLVMValueRef v_resultnum;
+					size_t resultnum = op->d.assign_tmp.resultnum;
+
+					b_notnull = LLVMInsertBasicBlock(opblocks[i + 1], "assign_tmp.notnull");
+
+					v_resultnum = LLVMConstInt(LLVMInt32Type(), resultnum, false);
+					v_value = LLVMBuildLoad(builder, v_tmpvaluep, "");
+					v_isnull = LLVMBuildLoad(builder, v_tmpisnullp, "");
+					v_rvaluep = LLVMBuildGEP(builder, v_resultvalues, &v_resultnum, 1, "");
+					v_risnullp = LLVMBuildGEP(builder, v_resultnulls, &v_resultnum, 1, "");
+
+					LLVMBuildStore(builder, v_isnull, v_risnullp);
+
+					/* check if value is NULL */
+					LLVMBuildCondBr(
+						builder,
+						LLVMBuildICmp(builder, LLVMIntEQ, v_isnull,
+									  LLVMConstInt(LLVMInt8Type(), 0, false), ""),
+						b_notnull, opblocks[i + 1]);
+
+					/* if value is not null, convert to RO datum */
+					LLVMPositionBuilderAtEnd(builder, b_notnull);
+
+					v_params[0] = v_value;
+					v_ret = LLVMBuildCall(builder, create_MakeExpandedObjectReadOnly(mod),
+										  v_params, lengthof(v_params), "");
+
+					LLVMBuildStore(builder, v_ret, v_rvaluep);
+
+					LLVMBuildBr(builder, opblocks[i + 1]);
+
+					break;
+				}
+
+			case EEOP_INNER_SYSVAR:
+				{
+					int attnum = op->d.var.attnum;
+					LLVMValueRef v_attnum;
+					LLVMValueRef v_tuple;
+					LLVMValueRef v_tupleDescriptor;
+					LLVMValueRef v_params[4];
+					LLVMValueRef v_syscol;
+
+					Assert(op->d.var.attnum < 0);
+
+					if (!l_heap_getsysattr)
+						l_heap_getsysattr = create_heap_getsysattr(mod);
+
+					v_tuple = LLVMBuildLoad(
+						builder,
+						LLVMBuildStructGEP(builder, v_innerslot, 5, "v.innertuple"),
+						"");
+					v_tupleDescriptor = LLVMBuildLoad(
+						builder,
+						LLVMBuildStructGEP(builder, v_innerslot, 6, "v.innertupledesc"),
+						"");
+
+					v_attnum = LLVMConstInt(LLVMInt32Type(), attnum, 0);
+
+					v_params[0] = v_tuple;
+					v_params[1] = v_attnum;
+					v_params[2] = v_tupleDescriptor;
+					v_params[3] = v_resnullp;
+					v_syscol = LLVMBuildCall(builder, l_heap_getsysattr, v_params, lengthof(v_params), "");
+					LLVMBuildStore(builder, v_syscol, v_resvaluep);
+
+					LLVMBuildBr(builder, opblocks[i + 1]);
+
+					break;
+				}
+
+			case EEOP_OUTER_SYSVAR:
+				{
+					int attnum = op->d.var.attnum;
+					LLVMValueRef v_attnum;
+					LLVMValueRef v_tuple;
+					LLVMValueRef v_tupleDescriptor;
+					LLVMValueRef v_params[4];
+					LLVMValueRef v_syscol;
+
+					Assert(op->d.var.attnum < 0);
+
+					if (!l_heap_getsysattr)
+						l_heap_getsysattr = create_heap_getsysattr(mod);
+
+					v_tuple = LLVMBuildLoad(
+						builder,
+						LLVMBuildStructGEP(builder, v_outerslot, 5, "v.outertuple"),
+						"");
+					v_tupleDescriptor = LLVMBuildLoad(
+						builder,
+						LLVMBuildStructGEP(builder, v_outerslot, 6, "v.outertupledesc"),
+						"");
+
+					v_attnum = LLVMConstInt(LLVMInt32Type(), attnum, 0);
+
+					v_params[0] = v_tuple;
+					v_params[1] = v_attnum;
+					v_params[2] = v_tupleDescriptor;
+					v_params[3] = v_resnullp;
+					v_syscol = LLVMBuildCall(builder, l_heap_getsysattr, v_params, lengthof(v_params), "");
+					LLVMBuildStore(builder, v_syscol, v_resvaluep);
+
+					LLVMBuildBr(builder, opblocks[i + 1]);
+				}
+
+			case EEOP_SCAN_SYSVAR:
+				{
+					int attnum = op->d.var.attnum;
+					LLVMValueRef v_attnum;
+					LLVMValueRef v_tuple;
+					LLVMValueRef v_tupleDescriptor;
+					LLVMValueRef v_params[4];
+					LLVMValueRef v_syscol;
+
+					Assert(op->d.var.attnum < 0);
+
+					if (!l_heap_getsysattr)
+						l_heap_getsysattr = create_heap_getsysattr(mod);
+
+					v_tuple = LLVMBuildLoad(
+						builder,
+						LLVMBuildStructGEP(builder, v_scanslot, 5, "v.scantuple"),
+						"");
+					v_tupleDescriptor = LLVMBuildLoad(
+						builder,
+						LLVMBuildStructGEP(builder, v_scanslot, 6, "v.scantupledesc"),
+						"");
+
+					v_attnum = LLVMConstInt(LLVMInt32Type(), attnum, 0);
+
+					v_params[0] = v_tuple;
+					v_params[1] = v_attnum;
+					v_params[2] = v_tupleDescriptor;
+					v_params[3] = v_resnullp;
+					v_syscol = LLVMBuildCall(builder, l_heap_getsysattr, v_params, lengthof(v_params), "");
+					LLVMBuildStore(builder, v_syscol, v_resvaluep);
+
+					LLVMBuildBr(builder, opblocks[i + 1]);
+
+					break;
+				}
+
+			case EEOP_CONST:
+				{
+					LLVMValueRef v_constvalue, v_constnull;
+
+					v_constvalue = LLVMConstInt(TypeSizeT, op->d.constval.value, false);
+					v_constnull = LLVMConstInt(LLVMInt8Type(), op->d.constval.isnull, false);
+
+					LLVMBuildStore(builder, v_constvalue, v_resvaluep);
+					LLVMBuildStore(builder, v_constnull, v_resnullp);
+
+					LLVMBuildBr(builder, opblocks[i + 1]);
+					break;
+				}
+
+			case EEOP_FUNCEXPR_STRICT:
+				{
+					FunctionCallInfo fcinfo = op->d.func.fcinfo_data;
+					LLVMBasicBlockRef b_nonull = LLVMInsertBasicBlock(opblocks[i + 1], "no-null-args");
+					int argno;
+					LLVMValueRef v_argnullp;
+					LLVMBasicBlockRef *b_checkargnulls;
+
+					/* should make sure they're optimized beforehand */
+					if (op->d.func.nargs == 0)
+						elog(ERROR, "argumentless strict functions are pointless");
+
+					v_argnullp = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(TypeSizeT, (uintptr_t) fcinfo->argnull, false),
+						LLVMPointerType(LLVMInt8Type(), 0),
+						"v_argnullp");
+
+					/* set resnull to true, if the function is actually called, it'll be reset */
+					LLVMBuildStore(builder, LLVMConstInt(LLVMInt8Type(), 1, false), v_resnullp);
+
+					/* create blocks for checking args */
+					b_checkargnulls = palloc(sizeof(LLVMBasicBlockRef *) * op->d.func.nargs);
+					for (argno = 0; argno < op->d.func.nargs;argno++)
+					{
+						b_checkargnulls[argno] = LLVMInsertBasicBlock(b_nonull, "check-null-arg");
+					}
+
+					LLVMBuildBr(builder, b_checkargnulls[0]);
+
+					/* strict function, check for NULL args */
+					for (argno = 0; argno < op->d.func.nargs;argno++)
+					{
+						LLVMValueRef v_argno = LLVMConstInt(LLVMInt32Type(), argno, false);
+						LLVMValueRef v_argisnull;
+						LLVMBasicBlockRef b_argnotnull;
+
+						LLVMPositionBuilderAtEnd(builder, b_checkargnulls[argno]);
+
+						if (argno + 1 == op->d.func.nargs)
+							b_argnotnull = b_nonull;
+						else
+							b_argnotnull = b_checkargnulls[argno + 1];
+
+						v_argisnull = LLVMBuildLoad(builder, LLVMBuildGEP(builder, v_argnullp, &v_argno, 1, ""), "");
+
+						LLVMBuildCondBr(
+							builder,
+							LLVMBuildICmp(builder, LLVMIntEQ, v_argisnull,
+										  LLVMConstInt(LLVMInt8Type(), 1, false), ""),
+							opblocks[i + 1],
+							b_argnotnull);
+					}
+
+					LLVMPositionBuilderAtEnd(builder, b_nonull);
+				}
+				/* explicit fallthrough */
+			case EEOP_FUNCEXPR:
+				{
+					FunctionCallInfo fcinfo = op->d.func.fcinfo_data;
+					LLVMValueRef v_fcinfo_isnull;
+					LLVMValueRef v_retval;
+
+					v_retval = BuildFunctionCall(context, builder, mod, fcinfo, &v_fcinfo_isnull);
+					LLVMBuildStore(builder, v_retval, v_resvaluep);
+					LLVMBuildStore(builder, v_fcinfo_isnull, v_resnullp);
+
+					LLVMBuildBr(builder, opblocks[i + 1]);
+					break;
+				}
+
+			case EEOP_AGGREF:
+				{
+					AggrefExprState *aggref = op->d.aggref.astate;
+					LLVMValueRef v_aggnop;
+					LLVMValueRef v_aggno;
+					LLVMValueRef value, isnull;
+
+					/*
+					 * At this point aggref->aggno has necessarily been set
+					 * yet. So load it from memory each time round. Yes,
+					 * that's really ugly. XXX
+					 */
+					v_aggnop = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(LLVMInt64Type(), (intptr_t) &aggref->aggno, false),
+						LLVMPointerType(LLVMInt32Type(), 0),
+						"aggnop");
+					v_aggno = LLVMBuildLoad(builder, v_aggnop, "");
+					value = LLVMBuildLoad(builder, LLVMBuildGEP(builder, v_aggvalues, &v_aggno, 1, ""), "aggvalue");
+					isnull = LLVMBuildLoad(builder, LLVMBuildGEP(builder, v_aggnulls, &v_aggno, 1, ""), "aggnull");
+
+					LLVMBuildStore(builder, value, v_resvaluep);
+					LLVMBuildStore(builder, isnull, v_resnullp);
+
+					LLVMBuildBr(builder, opblocks[i + 1]);
+					break;
+				}
+			case EEOP_WINDOW_FUNC:
+				{
+					WindowFuncExprState *wfunc = op->d.window_func.wfstate;
+					LLVMValueRef v_aggnop;// = LLVMConstInt(LLVMInt32Type(), wfunc->wfuncno, false);
+					LLVMValueRef v_aggno;
+					LLVMValueRef value, isnull;
+
+					/*
+					 * At this point wfuncref->wfuncno has necessarily been set
+					 * yet. So load it from memory each time round. Yes,
+					 * that's really ugly. XXX
+					 */
+					v_aggnop = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(LLVMInt64Type(), (intptr_t) &wfunc->wfuncno, false),
+						LLVMPointerType(LLVMInt32Type(), 0),
+						"aggnop");
+
+					v_aggno = LLVMBuildLoad(builder, v_aggnop, "");
+					value = LLVMBuildLoad(builder, LLVMBuildGEP(builder, v_aggvalues, &v_aggno, 1, ""), "windowvalue");
+					isnull = LLVMBuildLoad(builder, LLVMBuildGEP(builder, v_aggnulls, &v_aggno, 1, ""), "windownull");
+
+					LLVMBuildStore(builder, value, v_resvaluep);
+					LLVMBuildStore(builder, isnull, v_resnullp);
+
+					LLVMBuildBr(builder, opblocks[i + 1]);
+					break;
+				}
+
+			case EEOP_BOOL_AND_STEP_FIRST:
+				{
+					LLVMValueRef v_boolanynullp;
+
+					v_boolanynullp = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(LLVMInt64Type(), (intptr_t) op->d.boolexpr.anynull, false),
+						LLVMPointerType(LLVMInt8Type(), 0),
+						"boolanynull");
+					LLVMBuildStore(builder, LLVMConstInt(LLVMInt8Type(), 0, false), v_boolanynullp);
+
+					/* intentionally fall through */
+				}
+
+			case EEOP_BOOL_AND_STEP_LAST: /* FIXME */
+			case EEOP_BOOL_AND_STEP:
+				{
+					LLVMValueRef v_boolvaluep, v_boolvalue;
+					LLVMValueRef v_boolnullp, v_boolnull;
+					LLVMValueRef v_boolanynullp, v_boolanynull;
+					LLVMBasicBlockRef boolisnullblock;
+					LLVMBasicBlockRef boolcheckfalseblock;
+					LLVMBasicBlockRef boolisfalseblock;
+					LLVMBasicBlockRef boolcontblock;
+					LLVMBasicBlockRef boolisanynullblock;
+					char *blockname;
+
+					blockname = psprintf("block.op.%d.boolisnull", i);
+					boolisnullblock = LLVMInsertBasicBlock(opblocks[i + 1], blockname);
+					pfree(blockname);
+
+					blockname = psprintf("block.op.%d.boolcheckfalse", i);
+					boolcheckfalseblock = LLVMInsertBasicBlock(opblocks[i + 1], blockname);
+					pfree(blockname);
+
+					blockname = psprintf("block.op.%d.boolisfalse", i);
+					boolisfalseblock = LLVMInsertBasicBlock(opblocks[i + 1], blockname);
+					pfree(blockname);
+
+					blockname = psprintf("block.op.%d.boolisanynullblock", i);
+					boolisanynullblock = LLVMInsertBasicBlock(opblocks[i + 1], blockname);
+					pfree(blockname);
+
+					blockname = psprintf("block.op.%d.boolcontblock", i);
+					boolcontblock = LLVMInsertBasicBlock(opblocks[i + 1], blockname);
+					pfree(blockname);
+
+					v_boolvaluep = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(LLVMInt64Type(), (intptr_t) op->resvalue, false),
+						LLVMPointerType(TypeSizeT, 0),
+						"boolvaluep");
+
+					v_boolnullp = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(LLVMInt64Type(), (intptr_t) op->resnull, false),
+						LLVMPointerType(LLVMInt8Type(), 0),
+						"boolnullp");
+
+					v_boolanynullp = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(LLVMInt64Type(), (intptr_t) op->d.boolexpr.anynull, false),
+						LLVMPointerType(LLVMInt8Type(), 0),
+						"anynull");
+
+					v_boolnull = LLVMBuildLoad(builder, v_boolnullp, "");
+					v_boolvalue = LLVMBuildLoad(builder, v_boolvaluep, "");
+
+					/* set resnull to boolnull */
+					LLVMBuildStore(builder, v_boolnull, v_resnullp);
+					/* set revalue to boolvalue */
+					LLVMBuildStore(builder, v_boolvalue, v_resvaluep);
+
+					LLVMBuildCondBr(
+						builder,
+						LLVMBuildICmp(builder, LLVMIntEQ, v_boolnull,
+									  LLVMConstInt(LLVMInt8Type(), 1, false), ""),
+						boolisnullblock,
+						boolcheckfalseblock);
+
+					/* build block that checks that sets anynull */
+					LLVMPositionBuilderAtEnd(builder, boolisnullblock);
+					/* set boolanynull to true */
+					LLVMBuildStore(builder, LLVMConstInt(LLVMInt8Type(), 1, false), v_boolanynullp);
+					/* set resnull to true */
+					LLVMBuildStore(builder, LLVMConstInt(LLVMInt8Type(), 1, false), v_resnullp);
+					/* reset resvalue (cleanliness) */
+					LLVMBuildStore(builder, LLVMConstInt(TypeSizeT, 0, false), v_resvaluep);
+					/* and jump to next block */
+					LLVMBuildBr(builder, boolcontblock);
+
+					/* build block checking for false, which can jumps out at false */
+					LLVMPositionBuilderAtEnd(builder, boolcheckfalseblock);
+					LLVMBuildCondBr(
+						builder,
+						LLVMBuildICmp(builder, LLVMIntEQ, v_boolvalue,
+									  LLVMConstInt(LLVMInt64Type(), 0, false), ""),
+						boolisfalseblock,
+						boolcontblock);
+
+					/* Build block handling FALSE. Value is false, so short circuit. */
+					LLVMPositionBuilderAtEnd(builder, boolisfalseblock);
+					/* set resnull to false */
+					LLVMBuildStore(builder, LLVMConstInt(LLVMInt8Type(), 0, false), v_resnullp);
+					/* reset resvalue to false */
+					LLVMBuildStore(builder, LLVMConstInt(TypeSizeT, 0, false), v_resvaluep);
+					/* and jump to the end of the AND expression */
+					LLVMBuildBr(builder, opblocks[op->d.boolexpr.jumpdone]);
+
+					/* build block that continues if bool is TRUE */
+					LLVMPositionBuilderAtEnd(builder, boolcontblock);
+
+					v_boolanynull = LLVMBuildLoad(builder, v_boolanynullp, "");
+
+					/* set value to NULL if any previous values were NULL */
+					LLVMBuildCondBr(
+						builder,
+						LLVMBuildICmp(builder, LLVMIntEQ, v_boolanynull,
+									  LLVMConstInt(LLVMInt8Type(), 0, false), ""),
+						opblocks[i + 1], boolisanynullblock);
+
+					LLVMPositionBuilderAtEnd(builder, boolisanynullblock);
+					/* set resnull to true */
+					LLVMBuildStore(builder, LLVMConstInt(LLVMInt8Type(), 1, true), v_resnullp);
+					/* reset resvalue */
+					LLVMBuildStore(builder, LLVMConstInt(TypeSizeT, 0, false), v_resvaluep);
+
+					LLVMBuildBr(builder, opblocks[i + 1]);
+					break;
+				}
+			case EEOP_BOOL_OR_STEP_FIRST:
+				{
+					LLVMValueRef v_boolanynullp;
+
+					v_boolanynullp = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(LLVMInt64Type(), (intptr_t) op->d.boolexpr.anynull, false),
+						LLVMPointerType(LLVMInt8Type(), 0),
+						"boolanynull");
+					LLVMBuildStore(builder, LLVMConstInt(LLVMInt8Type(), 0, false), v_boolanynullp);
+
+					/* intentionally fall through */
+				}
+
+			case EEOP_BOOL_OR_STEP_LAST: /* FIXME */
+			case EEOP_BOOL_OR_STEP:
+				{
+					LLVMValueRef v_boolvaluep, v_boolvalue;
+					LLVMValueRef v_boolnullp, v_boolnull;
+					LLVMValueRef v_boolanynullp, v_boolanynull;
+					LLVMBasicBlockRef boolisnullblock;
+					LLVMBasicBlockRef boolchecktrueblock;
+					LLVMBasicBlockRef boolistrueblock;
+					LLVMBasicBlockRef boolcontblock;
+					LLVMBasicBlockRef boolisanynullblock;
+					char *blockname;
+
+					blockname = psprintf("block.op.%d.boolisnull", i);
+					boolisnullblock = LLVMInsertBasicBlock(opblocks[i + 1], blockname);
+					pfree(blockname);
+
+					blockname = psprintf("block.op.%d.boolchecktrue", i);
+					boolchecktrueblock = LLVMInsertBasicBlock(opblocks[i + 1], blockname);
+					pfree(blockname);
+
+					blockname = psprintf("block.op.%d.boolistrue", i);
+					boolistrueblock = LLVMInsertBasicBlock(opblocks[i + 1], blockname);
+					pfree(blockname);
+
+					blockname = psprintf("block.op.%d.boolisanynullblock", i);
+					boolisanynullblock = LLVMInsertBasicBlock(opblocks[i + 1], blockname);
+					pfree(blockname);
+
+					blockname = psprintf("block.op.%d.boolcontblock", i);
+					boolcontblock = LLVMInsertBasicBlock(opblocks[i + 1], blockname);
+					pfree(blockname);
+
+					v_boolvaluep = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(LLVMInt64Type(), (intptr_t) op->resvalue, false),
+						LLVMPointerType(TypeSizeT, 0),
+						"boolvaluep");
+
+					v_boolnullp = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(LLVMInt64Type(), (intptr_t) op->resnull, false),
+						LLVMPointerType(LLVMInt8Type(), 0),
+						"boolnullp");
+
+					v_boolanynullp = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(LLVMInt64Type(), (intptr_t) op->d.boolexpr.anynull, false),
+						LLVMPointerType(LLVMInt8Type(), 0),
+						"anynull");
+
+					v_boolnull = LLVMBuildLoad(builder, v_boolnullp, "");
+					v_boolvalue = LLVMBuildLoad(builder, v_boolvaluep, "");
+
+					/* set resnull to boolnull */
+					LLVMBuildStore(builder, v_boolnull, v_resnullp);
+					/* set revalue to boolvalue */
+					LLVMBuildStore(builder, v_boolvalue, v_resvaluep);
+
+					LLVMBuildCondBr(
+						builder,
+						LLVMBuildICmp(builder, LLVMIntEQ, v_boolnull,
+									  LLVMConstInt(LLVMInt8Type(), 1, false), ""),
+						boolisnullblock,
+						boolchecktrueblock);
+
+					/* build block that checks that sets anynull */
+					LLVMPositionBuilderAtEnd(builder, boolisnullblock);
+					/* set boolanynull to true */
+					LLVMBuildStore(builder, LLVMConstInt(LLVMInt8Type(), 1, false), v_boolanynullp);
+					/* set resnull to true */
+					LLVMBuildStore(builder, LLVMConstInt(LLVMInt8Type(), 1, false), v_resnullp);
+					/* reset resvalue (cleanliness) */
+					LLVMBuildStore(builder, LLVMConstInt(TypeSizeT, 0, false), v_resvaluep);
+					/* and jump to next block */
+					LLVMBuildBr(builder, boolcontblock);
+
+					/* build block checking for false, which can jumps out at false */
+					LLVMPositionBuilderAtEnd(builder, boolchecktrueblock);
+					LLVMBuildCondBr(
+						builder,
+						LLVMBuildICmp(builder, LLVMIntEQ, v_boolvalue,
+									  LLVMConstInt(LLVMInt64Type(), 1, false), ""),
+						boolistrueblock,
+						boolcontblock);
+
+					/* Build block handling TRUE. Value is true, so short circuit. */
+					LLVMPositionBuilderAtEnd(builder, boolistrueblock);
+					/* set resnull to false */
+					LLVMBuildStore(builder, LLVMConstInt(LLVMInt8Type(), 0, false), v_resnullp);
+					/* reset resvalue to true */
+					LLVMBuildStore(builder, LLVMConstInt(TypeSizeT, 1, false), v_resvaluep);
+					/* and jump to the end of the OR expression */
+					LLVMBuildBr(builder, opblocks[op->d.boolexpr.jumpdone]);
+
+					/* build block that continues if bool is FALSE */
+					LLVMPositionBuilderAtEnd(builder, boolcontblock);
+
+					v_boolanynull = LLVMBuildLoad(builder, v_boolanynullp, "");
+
+					/* set value to NULL if any previous values were NULL */
+					LLVMBuildCondBr(
+						builder,
+						LLVMBuildICmp(builder, LLVMIntEQ, v_boolanynull,
+									  LLVMConstInt(LLVMInt8Type(), 0, false), ""),
+						opblocks[i + 1], boolisanynullblock);
+
+					LLVMPositionBuilderAtEnd(builder, boolisanynullblock);
+					/* set resnull to true */
+					LLVMBuildStore(builder, LLVMConstInt(LLVMInt8Type(), 1, true), v_resnullp);
+					/* reset resvalue */
+					LLVMBuildStore(builder, LLVMConstInt(TypeSizeT, 0, false), v_resvaluep);
+
+					LLVMBuildBr(builder, opblocks[i + 1]);
+					break;
+				}
+
+			case EEOP_BOOL_NOT_STEP:
+				{
+					LLVMValueRef v_boolvaluep, v_boolvalue;
+					LLVMValueRef v_boolnullp, v_boolnull;
+					LLVMValueRef v_negbool;
+
+					v_boolvaluep = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(LLVMInt64Type(), (intptr_t) op->resvalue, false),
+						LLVMPointerType(TypeSizeT, 0),
+						"boolvaluep");
+
+					v_boolnullp = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(LLVMInt64Type(), (intptr_t) op->resnull, false),
+						LLVMPointerType(LLVMInt8Type(), 0),
+						"boolnullp");
+
+					v_boolnull = LLVMBuildLoad(builder, v_boolnullp, "");
+					v_boolvalue = LLVMBuildLoad(builder, v_boolvaluep, "");
+
+					v_negbool = LLVMBuildZExt(
+						builder,
+						LLVMBuildICmp(builder, LLVMIntEQ, v_boolvalue,
+									  LLVMConstInt(TypeSizeT, 0, false), ""),
+						TypeSizeT, "");
+					/* set resnull to boolnull */
+					LLVMBuildStore(builder, v_boolnull, v_resnullp);
+						/* set revalue to !boolvalue */
+					LLVMBuildStore(builder, v_negbool, v_resvaluep);
+
+					LLVMBuildBr(builder, opblocks[i + 1]);
+					break;
+				}
+
+			case EEOP_QUAL:
+				{
+					LLVMValueRef v_resnull;
+					LLVMValueRef v_resvalue;
+					LLVMValueRef v_nullorfalse;
+					LLVMBasicBlockRef qualfailblock;
+					char *blockname;
+
+					blockname = psprintf("block.op.%d.qualfail", i);
+					qualfailblock = LLVMInsertBasicBlock(opblocks[i + 1], blockname);
+					pfree(blockname);
+
+					v_resvalue = LLVMBuildLoad(builder, v_resvaluep, "");
+					v_resnull = LLVMBuildLoad(builder, v_resnullp, "");
+
+					v_nullorfalse = LLVMBuildOr(
+						builder,
+						LLVMBuildICmp(
+							builder, LLVMIntEQ, v_resnull,
+							LLVMConstInt(LLVMInt8Type(), 1, false), ""),
+						LLVMBuildICmp(
+							builder, LLVMIntEQ, v_resvalue,
+							LLVMConstInt(TypeSizeT, 0, false), ""),
+						"");
+
+					LLVMBuildCondBr(
+						builder,
+						v_nullorfalse,
+						qualfailblock,
+						opblocks[i + 1]);
+
+					/* build block handling NULL or false */
+					LLVMPositionBuilderAtEnd(builder, qualfailblock);
+					/* set resnull to false */
+					LLVMBuildStore(builder, LLVMConstInt(LLVMInt8Type(), 0, false), v_resnullp);
+					/* set resvalue to false */
+					LLVMBuildStore(builder, LLVMConstInt(TypeSizeT, 0, false), v_resvaluep);
+					/* and jump out */
+					LLVMBuildBr(builder, opblocks[op->d.qualexpr.jumpdone]);
+
+					break;
+				}
+
+			case EEOP_JUMP:
+				{
+					LLVMBuildBr(builder, opblocks[op->d.jump.jumpdone]);
+
+					break;
+				}
+
+			case EEOP_JUMP_IF_NULL:
+				{
+					LLVMValueRef v_resnull;
+
+					/* Transfer control if current result is null */
+
+					v_resnull = LLVMBuildLoad(builder, v_resnullp, "");
+
+					LLVMBuildCondBr(
+						builder,
+						LLVMBuildICmp(
+							builder, LLVMIntEQ, v_resnull,
+							LLVMConstInt(LLVMInt8Type(), 1, false), ""),
+						opblocks[op->d.jump.jumpdone],
+						opblocks[i + 1]);
+					break;
+				}
+
+			case EEOP_JUMP_IF_NOT_NULL:
+				{
+					LLVMValueRef v_resnull;
+
+					/* Transfer control if current result is non-null */
+
+					v_resnull = LLVMBuildLoad(builder, v_resnullp, "");
+
+					LLVMBuildCondBr(
+						builder,
+						LLVMBuildICmp(
+							builder, LLVMIntEQ, v_resnull,
+							LLVMConstInt(LLVMInt8Type(), 0, false), ""),
+						opblocks[op->d.jump.jumpdone],
+						opblocks[i + 1]);
+					break;
+				}
+
+
+			case EEOP_JUMP_IF_NOT_TRUE:
+				{
+					LLVMValueRef v_resnull;
+					LLVMValueRef v_resvalue;
+					LLVMValueRef v_nullorfalse;
+
+					/* Transfer control if current result is null or false */
+
+					v_resvalue = LLVMBuildLoad(builder, v_resvaluep, "");
+					v_resnull = LLVMBuildLoad(builder, v_resnullp, "");
+
+					v_nullorfalse = LLVMBuildOr(
+						builder,
+						LLVMBuildICmp(
+							builder, LLVMIntEQ, v_resnull,
+							LLVMConstInt(LLVMInt8Type(), 1, false), ""),
+						LLVMBuildICmp(
+							builder, LLVMIntEQ, v_resvalue,
+							LLVMConstInt(TypeSizeT, 0, false), ""),
+						"");
+
+					LLVMBuildCondBr(
+						builder,
+						v_nullorfalse,
+						opblocks[op->d.jump.jumpdone],
+						opblocks[i + 1]);
+					break;
+				}
+
+			case EEOP_PARAM_EXEC:
+			case EEOP_PARAM_EXTERN:
+			case EEOP_SQLVALUEFUNCTION:
+			case EEOP_CURRENTOFEXPR:
+			case EEOP_NEXTVALUEEXPR:
+			case EEOP_ARRAYEXPR:
+			case EEOP_ARRAYCOERCE:
+			case EEOP_ROW:
+			case EEOP_MINMAX:
+			case EEOP_FIELDSELECT:
+			case EEOP_FIELDSTORE_DEFORM:
+			case EEOP_FIELDSTORE_FORM:
+			case EEOP_ARRAYREF_ASSIGN:
+			case EEOP_ARRAYREF_FETCH:
+			case EEOP_ARRAYREF_OLD:
+			case EEOP_CONVERT_ROWTYPE:
+			case EEOP_SCALARARRAYOP:
+			case EEOP_DOMAIN_NOTNULL:
+			case EEOP_DOMAIN_CHECK:
+			case EEOP_XMLEXPR:
+			case EEOP_GROUPING_FUNC:
+			case EEOP_SUBPLAN:
+			case EEOP_ALTERNATIVE_SUBPLAN:
+			case EEOP_NULLTEST_ROWISNULL:
+			case EEOP_NULLTEST_ROWISNOTNULL:
+			case EEOP_WHOLEROW:
+				{
+					LLVMValueRef v_params[3];
+					const char *funcname;
+
+					if (op->opcode == EEOP_PARAM_EXEC)
+						funcname = "ExecEvalParamExec";
+					else if (op->opcode == EEOP_PARAM_EXTERN)
+						funcname = "ExecEvalParamExtern";
+					else if (op->opcode == EEOP_SQLVALUEFUNCTION)
+						funcname = "ExecEvalSQLValueFunction";
+					else if (op->opcode == EEOP_CURRENTOFEXPR)
+						funcname = "ExecEvalCurrentOfExpr";
+					else if (op->opcode == EEOP_NEXTVALUEEXPR)
+						funcname = "ExecEvalNextValueExpr";
+					else if (op->opcode == EEOP_ARRAYEXPR)
+						funcname = "ExecEvalArrayExpr";
+					else if (op->opcode == EEOP_ARRAYCOERCE)
+						funcname = "ExecEvalArrayCoerce";
+					else if (op->opcode == EEOP_ROW)
+						funcname = "ExecEvalRow";
+					else if (op->opcode == EEOP_MINMAX)
+						funcname = "ExecEvalMinMax";
+					else if (op->opcode == EEOP_FIELDSELECT)
+						funcname = "ExecEvalFieldSelect";
+					else if (op->opcode == EEOP_FIELDSTORE_DEFORM)
+						funcname = "ExecEvalFieldStoreDeForm";
+					else if (op->opcode == EEOP_FIELDSTORE_FORM)
+						funcname = "ExecEvalFieldStoreForm";
+					else if (op->opcode == EEOP_ARRAYREF_FETCH)
+						funcname = "ExecEvalArrayRefFetch";
+					else if (op->opcode == EEOP_ARRAYREF_ASSIGN)
+						funcname = "ExecEvalArrayRefAssign";
+					else if (op->opcode == EEOP_ARRAYREF_OLD)
+						funcname = "ExecEvalArrayRefOld";
+					else if (op->opcode == EEOP_NULLTEST_ROWISNULL)
+						funcname = "ExecEvalRowNull";
+					else if (op->opcode == EEOP_NULLTEST_ROWISNOTNULL)
+						funcname = "ExecEvalRowNotNull";
+					else if (op->opcode == EEOP_CONVERT_ROWTYPE)
+						funcname = "ExecEvalConvertRowtype";
+					else if (op->opcode == EEOP_SCALARARRAYOP)
+						funcname = "ExecEvalScalarArrayOp";
+					else if (op->opcode == EEOP_DOMAIN_NOTNULL)
+						funcname = "ExecEvalConstraintNotNull";
+					else if (op->opcode == EEOP_DOMAIN_CHECK)
+						funcname = "ExecEvalConstraintCheck";
+					else if (op->opcode == EEOP_XMLEXPR)
+						funcname = "ExecEvalXmlExpr";
+					else if (op->opcode == EEOP_GROUPING_FUNC)
+						funcname = "ExecEvalGroupingFunc";
+					else if (op->opcode == EEOP_SUBPLAN)
+						funcname = "ExecEvalSubPlan";
+					else if (op->opcode == EEOP_ALTERNATIVE_SUBPLAN)
+						funcname = "ExecEvalAlternativeSubPlan";
+					else if (op->opcode == EEOP_WHOLEROW)
+						funcname = "ExecEvalWholeRowVar";
+					else
+					{
+						Assert(false);
+						funcname = NULL; /* prevent compiler warning */
+					}
+
+					v_params[0] = v_state;
+					v_params[1] = LLVMBuildIntToPtr(builder,
+													LLVMConstInt(TypeSizeT, (uintptr_t) op, false),
+													LLVMPointerType(TypeSizeT, 0),
+													"");
+					v_params[2] = v_econtext;
+					LLVMBuildCall(builder,
+								  create_EvalXFunc(mod, funcname),
+								  v_params, lengthof(v_params), "");
+					LLVMBuildBr(builder, opblocks[i + 1]);
+					break;
+				}
+
+			case EEOP_ARRAYREF_SUBSCRIPT:
+				{
+					LLVMValueRef v_params[3];
+					LLVMValueRef v_ret;
+
+					v_params[0] = v_state;
+					v_params[1] = LLVMBuildIntToPtr(builder,
+													LLVMConstInt(TypeSizeT, (uintptr_t) op, false),
+													LLVMPointerType(TypeSizeT, 0),
+													"");
+					v_params[2] = v_econtext;
+					v_ret = LLVMBuildCall(builder, create_EvalArrayRefSubscript(mod),
+										  v_params, lengthof(v_params), "");
+
+					LLVMBuildCondBr(builder,
+									LLVMBuildICmp(builder, LLVMIntEQ, v_ret,
+												  LLVMConstInt(LLVMInt8Type(), 1, false), ""),
+									opblocks[i + 1],
+									opblocks[op->d.arrayref_subscript.jumpdone]);
+					break;
+				}
+
+			case EEOP_CASE_TESTVAL:
+				{
+					LLVMBasicBlockRef b_avail, b_notavail;
+					LLVMValueRef v_casevaluep, v_casevalue;
+					LLVMValueRef v_casenullp, v_casenull;
+
+					b_avail = LLVMInsertBasicBlock(opblocks[i + 1], "");
+					b_notavail = LLVMInsertBasicBlock(opblocks[i + 1], "");
+
+					v_casevaluep = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(TypeSizeT, (uintptr_t) op->d.casetest.value, false),
+						LLVMPointerType(TypeSizeT, 0),
+						"");
+					v_casenullp = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(TypeSizeT, (uintptr_t) op->d.casetest.isnull, false),
+						LLVMPointerType(LLVMInt8Type(), 0),
+						"");
+
+					LLVMBuildCondBr(
+						builder,
+						LLVMBuildICmp(builder, LLVMIntEQ,
+									  LLVMBuildPtrToInt(builder, v_casevaluep, TypeSizeT, ""),
+									  LLVMConstInt(TypeSizeT, 0, false), ""),
+						b_notavail, b_avail);
+
+					/* if casetest != NULL */
+					LLVMPositionBuilderAtEnd(builder, b_avail);
+					v_casevalue = LLVMBuildLoad(builder, v_casevaluep, "");
+					v_casenull = LLVMBuildLoad(builder, v_casenullp, "");
+					LLVMBuildStore(builder, v_casevalue, v_resvaluep);
+					LLVMBuildStore(builder, v_casenull, v_resnullp);
+					LLVMBuildBr(builder, opblocks[i + 1]);
+
+					/* if casetest == NULL */
+					LLVMPositionBuilderAtEnd(builder, b_notavail);
+					v_casevalue = LLVMBuildLoad(
+						builder,
+						LLVMBuildStructGEP(builder, v_econtext, 10, ""), "");
+					v_casenull = LLVMBuildLoad(
+						builder,
+						LLVMBuildStructGEP(builder, v_econtext, 11, ""), "");
+					LLVMBuildStore(builder, v_casevalue, v_resvaluep);
+					LLVMBuildStore(builder, v_casenull, v_resnullp);
+					LLVMBuildBr(builder, opblocks[i + 1]);
+
+					break;
+				}
+
+			case EEOP_DOMAIN_TESTVAL:
+				{
+					LLVMBasicBlockRef b_avail, b_notavail;
+					LLVMValueRef v_casevaluep, v_casevalue;
+					LLVMValueRef v_casenullp, v_casenull;
+
+					b_avail = LLVMInsertBasicBlock(opblocks[i + 1], "");
+					b_notavail = LLVMInsertBasicBlock(opblocks[i + 1], "");
+
+					v_casevaluep = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(TypeSizeT, (uintptr_t) op->d.casetest.value, false),
+						LLVMPointerType(TypeSizeT, 0),
+						"");
+					v_casenullp = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(TypeSizeT, (uintptr_t) op->d.casetest.isnull, false),
+						LLVMPointerType(LLVMInt8Type(), 0),
+						"");
+
+					LLVMBuildCondBr(
+						builder,
+						LLVMBuildICmp(builder, LLVMIntEQ,
+									  LLVMBuildPtrToInt(builder, v_casevaluep, TypeSizeT, ""),
+									  LLVMConstInt(TypeSizeT, 0, false), ""),
+						b_notavail, b_avail);
+
+					/* if casetest != NULL */
+					LLVMPositionBuilderAtEnd(builder, b_avail);
+					v_casevalue = LLVMBuildLoad(builder, v_casevaluep, "");
+					v_casenull = LLVMBuildLoad(builder, v_casenullp, "");
+					LLVMBuildStore(builder, v_casevalue, v_resvaluep);
+					LLVMBuildStore(builder, v_casenull, v_resnullp);
+					LLVMBuildBr(builder, opblocks[i + 1]);
+
+					/* if casetest == NULL */
+					LLVMPositionBuilderAtEnd(builder, b_notavail);
+					v_casevalue = LLVMBuildLoad(
+						builder,
+						LLVMBuildStructGEP(builder, v_econtext, 12, ""), "");
+					v_casenull = LLVMBuildLoad(
+						builder,
+						LLVMBuildStructGEP(builder, v_econtext, 13, ""), "");
+					LLVMBuildStore(builder, v_casevalue, v_resvaluep);
+					LLVMBuildStore(builder, v_casenull, v_resnullp);
+					LLVMBuildBr(builder, opblocks[i + 1]);
+
+					break;
+				}
+
+			case EEOP_NULLTEST_ISNULL:
+				{
+					LLVMValueRef v_resnull = LLVMBuildLoad(builder, v_resnullp, "");
+					LLVMValueRef v_resvalue;
+
+					v_resvalue = LLVMBuildSelect(
+						builder,
+						LLVMBuildICmp(builder, LLVMIntEQ, v_resnull,
+									  LLVMConstInt(LLVMInt8Type(), 1, false), ""),
+						LLVMConstInt(TypeSizeT, 1, false),
+						LLVMConstInt(TypeSizeT, 0, false),
+						"");
+					LLVMBuildStore(
+						builder,
+						v_resvalue,
+						v_resvaluep);
+					LLVMBuildStore(
+						builder,
+						LLVMConstInt(LLVMInt8Type(), 0, false),
+						v_resnullp);
+					LLVMBuildBr(builder, opblocks[i + 1]);
+
+					break;
+				}
+
+			case EEOP_NULLTEST_ISNOTNULL:
+				{
+					LLVMValueRef v_resnull = LLVMBuildLoad(builder, v_resnullp, "");
+					LLVMValueRef v_resvalue;
+
+					v_resvalue = LLVMBuildSelect(
+						builder,
+						LLVMBuildICmp(builder, LLVMIntEQ, v_resnull,
+									  LLVMConstInt(LLVMInt8Type(), 1, false), ""),
+						LLVMConstInt(TypeSizeT, 0, false),
+						LLVMConstInt(TypeSizeT, 1, false),
+						"");
+					LLVMBuildStore(
+						builder,
+						v_resvalue,
+						v_resvaluep);
+					LLVMBuildStore(
+						builder,
+						LLVMConstInt(LLVMInt8Type(), 0, false),
+						v_resnullp);
+					LLVMBuildBr(builder, opblocks[i + 1]);
+
+					break;
+				}
+
+			case EEOP_BOOLTEST_IS_TRUE:
+			case EEOP_BOOLTEST_IS_NOT_FALSE:
+			case EEOP_BOOLTEST_IS_FALSE:
+			case EEOP_BOOLTEST_IS_NOT_TRUE:
+				{
+					LLVMBasicBlockRef b_isnull, b_notnull;
+					LLVMValueRef v_resnull = LLVMBuildLoad(builder, v_resnullp, "");
+
+					b_isnull = LLVMInsertBasicBlock(opblocks[i + 1], "boolest.isnull");
+					b_notnull = LLVMInsertBasicBlock(opblocks[i + 1], "booltest.isnotnull");
+
+					/* check if value is NULL */
+					LLVMBuildCondBr(
+						builder,
+						LLVMBuildICmp(builder, LLVMIntEQ, v_resnull,
+									  LLVMConstInt(LLVMInt8Type(), 1, false), ""),
+						b_isnull, b_notnull);
+
+					/* if value is NULL, return false */
+					LLVMPositionBuilderAtEnd(builder, b_isnull);
+
+					/* result is not null */
+					LLVMBuildStore(
+						builder,
+						LLVMConstInt(LLVMInt8Type(), 0, false),
+						v_resnullp);
+
+					if (op->opcode == EEOP_BOOLTEST_IS_TRUE
+						|| op->opcode == EEOP_BOOLTEST_IS_FALSE)
+					{
+						LLVMBuildStore(
+							builder,
+							LLVMConstInt(TypeSizeT, 0, false),
+							v_resvaluep);
+					}
+					else
+					{
+						LLVMBuildStore(
+							builder,
+							LLVMConstInt(TypeSizeT, 1, true),
+							v_resvaluep);
+					}
+
+					LLVMBuildBr(builder, opblocks[i + 1]);
+
+					LLVMPositionBuilderAtEnd(builder, b_notnull);
+
+					/* FIXME: don't think this is correct */
+
+					if (op->opcode == EEOP_BOOLTEST_IS_TRUE ||
+						op->opcode == EEOP_BOOLTEST_IS_NOT_FALSE)
+					{
+						/* if value is not null NULL, return value (already set) */
+					}
+					else
+					{
+						LLVMValueRef v_value = LLVMBuildLoad(
+							builder, v_resvaluep, "");
+
+						v_value = LLVMBuildZExt(
+							builder,
+							LLVMBuildICmp(builder, LLVMIntEQ, v_value,
+										  LLVMConstInt(TypeSizeT, 0, false), ""),
+							TypeSizeT, "");
+						LLVMBuildStore(
+							builder,
+							v_value,
+							v_resvaluep);
+					}
+					LLVMBuildBr(builder, opblocks[i + 1]);
+					break;
+				}
+
+			case EEOP_NULLIF:
+				{
+					FunctionCallInfo fcinfo = op->d.func.fcinfo_data;
+					LLVMValueRef v_fcinfo_isnull;
+
+					LLVMValueRef v_argnullp;
+					LLVMValueRef v_argnull0;
+					LLVMValueRef v_argnull1;
+					LLVMValueRef v_anyargisnull;
+					LLVMValueRef v_argp;
+					LLVMValueRef v_arg0;
+					LLVMValueRef v_argno;
+					LLVMBasicBlockRef b_hasnull =
+						LLVMInsertBasicBlock(opblocks[i + 1], "null-args");
+					LLVMBasicBlockRef b_nonull =
+						LLVMInsertBasicBlock(opblocks[i + 1], "no-null-args");
+					LLVMBasicBlockRef b_argsequal =
+						LLVMInsertBasicBlock(opblocks[i + 1], "argsequal");
+					LLVMValueRef v_retval;
+					LLVMValueRef v_argsequal;
+
+					v_argnullp = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(TypeSizeT, (uintptr_t) fcinfo->argnull, false),
+						LLVMPointerType(LLVMInt8Type(), 0),
+						"v_argnullp");
+
+					v_argp = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(TypeSizeT, (uintptr_t) fcinfo->arg, false),
+						LLVMPointerType(TypeSizeT, 0),
+						"v_arg");
+
+					/* if either argument is NULL they can't be equal */
+					v_argno = LLVMConstInt(LLVMInt32Type(), 0, false);
+					v_argnull0 = LLVMBuildLoad(
+						builder,
+						LLVMBuildGEP(builder, v_argnullp, &v_argno, 1, "")
+						, "");
+					v_argno = LLVMConstInt(LLVMInt32Type(), 1, false);
+					v_argnull1 = LLVMBuildLoad(
+						builder,
+						LLVMBuildGEP(builder, v_argnullp, &v_argno, 1, "")
+						, "");
+
+					v_anyargisnull = LLVMBuildOr(
+						builder,
+						LLVMBuildICmp(
+							builder, LLVMIntEQ, v_argnull0,
+							LLVMConstInt(LLVMInt8Type(), 1, false), ""),
+						LLVMBuildICmp(
+							builder, LLVMIntEQ, v_argnull1,
+							LLVMConstInt(LLVMInt8Type(), 1, false), ""),
+						"");
+
+					LLVMBuildCondBr(
+						builder,
+						v_anyargisnull,
+						b_hasnull,
+						b_nonull);
+
+					/* one (or both) of the arguments are null, return arg[0] */
+					LLVMPositionBuilderAtEnd(builder, b_hasnull);
+					v_argno = LLVMConstInt(LLVMInt32Type(), 0, false);
+					v_arg0 = LLVMBuildLoad(
+						builder,
+						LLVMBuildGEP(builder, v_argp, &v_argno, 1, "")
+						, "");
+					LLVMBuildStore(
+						builder,
+						v_argnull0,
+						v_resnullp);
+					LLVMBuildStore(
+						builder,
+						v_arg0,
+						v_resvaluep);
+					LLVMBuildBr(builder, opblocks[i + 1]);
+
+					/* build block to invoke function and check result */
+					LLVMPositionBuilderAtEnd(builder, b_nonull);
+
+					v_retval = BuildFunctionCall(context, builder, mod, fcinfo, &v_fcinfo_isnull);
+
+					/* if result not null, and arguments are equal return null, */
+					v_argsequal = LLVMBuildAnd(
+						builder,
+						LLVMBuildICmp(
+							builder, LLVMIntEQ, v_fcinfo_isnull,
+							LLVMConstInt(LLVMInt8Type(), 0, false), ""),
+						LLVMBuildICmp(
+							builder, LLVMIntEQ, v_retval,
+							LLVMConstInt(TypeSizeT, 1, false), ""),
+						"");
+					LLVMBuildCondBr(
+						builder,
+						v_argsequal,
+						b_argsequal,
+						b_hasnull);
+
+					/* build block setting result to NULL, if args are equal */
+					LLVMPositionBuilderAtEnd(builder, b_argsequal);
+					LLVMBuildStore(
+						builder,
+						LLVMConstInt(LLVMInt8Type(), 1, false),
+						v_resnullp);
+					LLVMBuildStore(
+						builder,
+						LLVMConstInt(TypeSizeT, 0, false),
+						v_resvaluep);
+					LLVMBuildStore(builder, v_retval, v_resvaluep);
+					LLVMBuildBr(builder, opblocks[i + 1]);
+
+					break;
+				}
+
+			case EEOP_IOCOERCE:
+				{
+					FunctionCallInfo fcinfo_out, fcinfo_in;
+					LLVMValueRef v_fcinfo_out, v_fcinfo_in;
+					LLVMValueRef v_fn_addr_out, v_fn_addr_in;
+					LLVMValueRef v_fcinfo_in_isnullp;
+					LLVMValueRef v_in_argp, v_out_argp;
+					LLVMValueRef v_in_argnullp, v_out_argnullp;
+					LLVMValueRef v_retval;
+					LLVMValueRef v_resvalue;
+					LLVMValueRef v_resnull;
+
+					LLVMValueRef v_output_skip;
+					LLVMValueRef v_output;
+
+					LLVMValueRef v_argno;
+
+					LLVMBasicBlockRef b_skipoutput =
+						LLVMInsertBasicBlock(opblocks[i + 1], "skipoutputnull");
+					LLVMBasicBlockRef b_calloutput =
+						LLVMInsertBasicBlock(opblocks[i + 1], "calloutput");
+					LLVMBasicBlockRef b_input =
+						LLVMInsertBasicBlock(opblocks[i + 1], "input");
+					LLVMBasicBlockRef b_inputcall =
+						LLVMInsertBasicBlock(opblocks[i + 1], "inputcall");
+
+					fcinfo_out = op->d.iocoerce.fcinfo_data_out;
+					fcinfo_in = op->d.iocoerce.fcinfo_data_in;
+
+					v_fcinfo_out = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(TypeSizeT, (intptr_t) fcinfo_out, false),
+						LLVMPointerType(StructFunctionCallInfoData, 0),
+						"v_fcinfo");
+
+					v_fcinfo_in = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(TypeSizeT, (intptr_t) fcinfo_in, false),
+						LLVMPointerType(StructFunctionCallInfoData, 0),
+						"v_fcinfo");
+
+					v_fn_addr_out = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(TypeSizeT, (intptr_t) fcinfo_out->flinfo->fn_addr, false),
+						LLVMPointerType(TypePGFunction, 0),
+						"v_fn_addr");
+
+					v_fn_addr_in = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(TypeSizeT, (intptr_t) fcinfo_in->flinfo->fn_addr, false),
+						LLVMPointerType(TypePGFunction, 0),
+						"v_fn_addr");
+
+					v_fcinfo_in_isnullp = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(TypeSizeT, (intptr_t) &fcinfo_in->isnull, false),
+						LLVMPointerType(LLVMInt8Type(), 0),
+						"v_fcinfo_isnull");
+
+					v_out_argnullp = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(TypeSizeT, (uintptr_t) fcinfo_out->argnull, false),
+						LLVMPointerType(LLVMInt8Type(), 0),
+						"v_out_argnullp");
+
+					v_in_argnullp = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(TypeSizeT, (uintptr_t) fcinfo_in->argnull, false),
+						LLVMPointerType(LLVMInt8Type(), 0),
+						"v_in_argnullp");
+
+					v_out_argp = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(TypeSizeT, (uintptr_t) fcinfo_out->arg, false),
+						LLVMPointerType(TypeSizeT, 0),
+						"v_out_arg");
+
+					v_in_argp = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(TypeSizeT, (uintptr_t) fcinfo_in->arg, false),
+						LLVMPointerType(TypeSizeT, 0),
+						"v_in_arg");
+
+					/*
+					 * If input is NULL, don't call output functions, as
+					 * they're not called on NULL.
+					 */
+					v_resnull = LLVMBuildLoad(builder, v_resnullp, "");
+					LLVMBuildCondBr(
+						builder,
+						LLVMBuildICmp(
+							builder, LLVMIntEQ, v_resnull,
+							LLVMConstInt(LLVMInt8Type(), 1, false), ""),
+						b_skipoutput,
+						b_calloutput);
+
+					LLVMPositionBuilderAtEnd(builder, b_skipoutput);
+					v_output_skip = LLVMConstInt(TypeSizeT, 0, false);
+					LLVMBuildBr(builder, b_input);
+
+					LLVMPositionBuilderAtEnd(builder, b_calloutput);
+					v_resvalue = LLVMBuildLoad(builder, v_resvaluep, "");
+					/* set arg[0] */
+					v_argno = LLVMConstInt(LLVMInt32Type(), 0, false);
+					LLVMBuildStore(
+						builder,
+						v_resvalue,
+						LLVMBuildGEP(builder, v_out_argp, &v_argno, 1, ""));
+					LLVMBuildStore(
+						builder,
+						LLVMConstInt(LLVMInt8Type(), 0, false),
+						LLVMBuildGEP(builder, v_out_argnullp, &v_argno, 1, ""));
+					/* and call output function (can never return NULL) */
+					v_output = LLVMBuildCall(
+						builder, v_fn_addr_out, &v_fcinfo_out, 1, "funccall_coerce_out");
+					LLVMBuildBr(builder, b_input);
+
+					/* build block handling input function call */
+					LLVMPositionBuilderAtEnd(builder, b_input);
+					{
+						LLVMValueRef incoming_values[] =
+							{v_output_skip, v_output};
+						LLVMBasicBlockRef incoming_blocks[] =
+							{b_skipoutput, b_calloutput};
+						v_output = LLVMBuildPhi(builder, TypeSizeT, "output");
+						LLVMAddIncoming(v_output,
+										incoming_values, incoming_blocks,
+										lengthof(incoming_blocks));
+
+					}
+
+					/* if input function is strict, skip if input string is NULL */
+					if (op->d.iocoerce.finfo_in->fn_strict)
+					{
+						LLVMBuildCondBr(
+							builder,
+							LLVMBuildICmp(
+								builder, LLVMIntEQ, v_output,
+								LLVMConstInt(TypeSizeT, 0, false), ""),
+							opblocks[i + 1],
+							b_inputcall);
+					}
+					else
+					{
+						LLVMBuildBr(builder, b_inputcall);
+					}
+
+					LLVMPositionBuilderAtEnd(builder, b_inputcall);
+					/* set arguments */
+					/* arg0: output */
+					v_argno = LLVMConstInt(LLVMInt32Type(), 0, false);
+					LLVMBuildStore(
+						builder,
+						v_output,
+						LLVMBuildGEP(builder, v_in_argp, &v_argno, 1, ""));
+					LLVMBuildStore(
+						builder,
+						v_resnull,
+						LLVMBuildGEP(builder, v_in_argnullp, &v_argno, 1, ""));
+
+					/* arg1: ioparam: preset in execExpr.c */
+					/* arg2: typmod: preset in execExpr.c  */
+
+					/* reset fcinfo_in->isnull */
+					LLVMBuildStore(
+						builder, LLVMConstInt(LLVMInt8Type(), 0, false),
+						v_fcinfo_in_isnullp);
+					/* and call function */
+					v_retval = LLVMBuildCall(
+						builder, v_fn_addr_in, &v_fcinfo_in, 1,
+						"funccall_iocoerce_in");
+
+					LLVMBuildStore(builder, v_retval, v_resvaluep);
+					LLVMBuildBr(builder, opblocks[i + 1]);
+
+					break;
+				}
+
+			case EEOP_DISTINCT:
+				{
+					FunctionCallInfo fcinfo = op->d.func.fcinfo_data;
+
+					LLVMValueRef v_fcinfo_isnull;
+
+					LLVMValueRef v_argnullp;
+					LLVMValueRef v_argnull0, v_argisnull0;
+					LLVMValueRef v_argnull1, v_argisnull1;
+
+					LLVMValueRef v_anyargisnull;
+					LLVMValueRef v_bothargisnull;
+
+					LLVMValueRef v_argno;
+					LLVMValueRef v_result;
+
+					LLVMBasicBlockRef b_noargnull =
+						LLVMInsertBasicBlock(opblocks[i + 1], "nonull");
+					LLVMBasicBlockRef b_checkbothargnull =
+						LLVMInsertBasicBlock(opblocks[i + 1], "checkbothargnull");
+					LLVMBasicBlockRef b_bothargnull =
+						LLVMInsertBasicBlock(opblocks[i + 1], "bothargnull");
+					LLVMBasicBlockRef b_anyargnull =
+						LLVMInsertBasicBlock(opblocks[i + 1], "anyargnull");
+
+					v_argnullp = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(TypeSizeT, (uintptr_t) fcinfo->argnull, false),
+						LLVMPointerType(LLVMInt8Type(), 0),
+						"v_argnullp");
+
+					/* load argnull[0|1] for both arguments */
+					v_argno = LLVMConstInt(LLVMInt32Type(), 0, false);
+					v_argnull0 = LLVMBuildLoad(
+						builder,
+						LLVMBuildGEP(builder, v_argnullp, &v_argno, 1, "")
+						, "");
+					v_argisnull0 = LLVMBuildICmp(
+						builder, LLVMIntEQ, v_argnull0,
+						LLVMConstInt(LLVMInt8Type(), 1, false), "");
+
+					v_argno = LLVMConstInt(LLVMInt32Type(), 1, false);
+					v_argnull1 = LLVMBuildLoad(
+						builder,
+						LLVMBuildGEP(builder, v_argnullp, &v_argno, 1, "")
+						, "");
+					v_argisnull1 = LLVMBuildICmp(
+						builder, LLVMIntEQ, v_argnull1,
+						LLVMConstInt(LLVMInt8Type(), 1, false), "");
+
+					v_anyargisnull = LLVMBuildOr(
+						builder, v_argisnull0, v_argisnull1, "");
+					v_bothargisnull = LLVMBuildAnd(
+						builder, v_argisnull0, v_argisnull1, "");
+
+					/*
+					 * Check function arguments for NULLness: If either is
+					 * NULL, we check if both args are NULL. Otherwise call
+					 * comparator.
+					 */
+					LLVMBuildCondBr(
+						builder,
+						v_anyargisnull,
+						b_checkbothargnull,
+						b_noargnull);
+
+					/*
+					 * build block checking if any arg is null
+					 */
+					LLVMPositionBuilderAtEnd(builder, b_checkbothargnull);
+					LLVMBuildCondBr(
+						builder,
+						v_bothargisnull,
+						b_bothargnull,
+						b_anyargnull);
+
+
+					/* Both NULL? Then is not distinct... */
+					LLVMPositionBuilderAtEnd(builder, b_bothargnull);
+					LLVMBuildStore(
+						builder,
+						LLVMConstInt(LLVMInt8Type(), 0, false),
+						v_resnullp);
+					LLVMBuildStore(
+						builder,
+						LLVMConstInt(TypeSizeT, 0, false),
+						v_resvaluep);
+					LLVMBuildBr(builder, opblocks[i + 1]);
+
+					/* Only one is NULL? Then is distinct... */
+					LLVMPositionBuilderAtEnd(builder, b_anyargnull);
+					LLVMBuildStore(
+						builder,
+						LLVMConstInt(LLVMInt8Type(), 0, false),
+						v_resnullp);
+					LLVMBuildStore(
+						builder,
+						LLVMConstInt(TypeSizeT, 1, false),
+						v_resvaluep);
+					LLVMBuildBr(builder, opblocks[i + 1]);
+
+					/* neither argument is null: compare */
+					LLVMPositionBuilderAtEnd(builder, b_noargnull);
+
+					v_result = BuildFunctionCall(context, builder, mod, fcinfo, &v_fcinfo_isnull);
+
+					/* Must invert result of "=" */
+					v_result = LLVMBuildZExt(
+						builder,
+						LLVMBuildICmp(builder, LLVMIntEQ, v_result,
+									  LLVMConstInt(TypeSizeT, 0, false), ""),
+						TypeSizeT, "");
+
+					LLVMBuildStore(
+						builder,
+						v_fcinfo_isnull,
+						v_resnullp);
+					LLVMBuildStore(
+						builder,
+						v_result,
+						v_resvaluep);
+					LLVMBuildBr(builder, opblocks[i + 1]);
+
+					break;
+				}
+
+			case EEOP_ROWCOMPARE_STEP:
+				{
+					FunctionCallInfo fcinfo = op->d.rowcompare_step.fcinfo_data;
+					LLVMValueRef v_fcinfo_isnull;
+
+					LLVMBasicBlockRef b_null =
+						LLVMInsertBasicBlock(opblocks[i + 1], "row-null");
+					LLVMBasicBlockRef b_compare =
+						LLVMInsertBasicBlock(opblocks[i + 1], "row-compare");
+					LLVMBasicBlockRef b_compare_result =
+						LLVMInsertBasicBlock(opblocks[i + 1], "row-compare-result");
+
+					LLVMValueRef v_retval;
+
+					/* if function is strict, and either arg is null, we're done */
+					if (op->d.rowcompare_step.finfo->fn_strict)
+					{
+						LLVMValueRef v_argnullp;
+						LLVMValueRef v_argnull0;
+						LLVMValueRef v_argnull1;
+						LLVMValueRef v_argno;
+						LLVMValueRef v_anyargisnull;
+
+						v_argnullp = LLVMBuildIntToPtr(
+							builder,
+							LLVMConstInt(TypeSizeT, (uintptr_t) fcinfo->argnull, false),
+							LLVMPointerType(LLVMInt8Type(), 0),
+							"v_argnullp");
+
+						v_argno = LLVMConstInt(LLVMInt32Type(), 0, false);
+						v_argnull0 = LLVMBuildLoad(
+							builder,
+							LLVMBuildGEP(builder, v_argnullp, &v_argno, 1, "")
+							, "");
+						v_argno = LLVMConstInt(LLVMInt32Type(), 1, false);
+						v_argnull1 = LLVMBuildLoad(
+							builder,
+							LLVMBuildGEP(builder, v_argnullp, &v_argno, 1, "")
+							, "");
+
+						v_anyargisnull = LLVMBuildOr(
+							builder,
+							LLVMBuildICmp(
+								builder, LLVMIntEQ, v_argnull0,
+								LLVMConstInt(LLVMInt8Type(), 1, false), ""),
+							LLVMBuildICmp(
+								builder, LLVMIntEQ, v_argnull1,
+							LLVMConstInt(LLVMInt8Type(), 1, false), ""),
+							"");
+
+						LLVMBuildCondBr(
+							builder,
+							v_anyargisnull,
+							b_null,
+							b_compare);
+					}
+					else
+					{
+						LLVMBuildBr(builder, b_compare);
+					}
+
+					/* build block invoking comparison function */
+					LLVMPositionBuilderAtEnd(builder, b_compare);
+
+					/* call function */
+					v_retval = BuildFunctionCall(context, builder, mod, fcinfo, &v_fcinfo_isnull);
+					LLVMBuildStore(builder, v_retval, v_resvaluep);
+
+					/* if result of function is NULL, force NULL result */
+					LLVMBuildCondBr(
+						builder,
+						LLVMBuildICmp(
+							builder, LLVMIntEQ, v_fcinfo_isnull,
+							LLVMConstInt(LLVMInt8Type(), 0, false), ""),
+						b_compare_result,
+						b_null);
+
+					/* build block analying the !NULL comparator result */
+					LLVMPositionBuilderAtEnd(builder, b_compare_result);
+
+					/* if results equal, compare next, otherwise done */
+					LLVMBuildCondBr(
+						builder,
+						LLVMBuildICmp(
+							builder, LLVMIntEQ, v_retval,
+							LLVMConstInt(TypeSizeT, 0, false), ""),
+						opblocks[i + 1],
+						opblocks[op->d.rowcompare_step.jumpdone]);
+
+					/* build block handling NULL input or NULL comparator result */
+					LLVMPositionBuilderAtEnd(builder, b_null);
+					LLVMBuildStore(
+						builder,
+						LLVMConstInt(LLVMInt8Type(), 1, false),
+						v_resnullp);
+					LLVMBuildBr(
+						builder,
+						opblocks[op->d.rowcompare_step.jumpnull]);
+
+					break;
+				}
+
+			case EEOP_ROWCOMPARE_FINAL:
+				{
+					RowCompareType rctype = op->d.rowcompare_final.rctype;
+
+					LLVMValueRef v_cmpresult;
+					LLVMValueRef v_result;
+					LLVMIntPredicate predicate;
+
+					/*
+					 * Btree comparators return 32 bit results, need to be
+					 * careful about sign (used as a 64 bit value it's
+					 * otherwise wrong).
+					 */
+					v_cmpresult = LLVMBuildTrunc(
+						builder,
+						LLVMBuildLoad(builder, v_resvaluep, ""),
+						LLVMInt32Type(), "");
+
+					switch (rctype)
+					{
+						/* EQ and NE cases aren't allowed here */
+						case ROWCOMPARE_LT:
+							predicate = LLVMIntSLT;
+							break;
+						case ROWCOMPARE_LE:
+							predicate = LLVMIntSLE;
+							break;
+						case ROWCOMPARE_GT:
+							predicate = LLVMIntSGT;
+							break;
+						case ROWCOMPARE_GE:
+							predicate = LLVMIntSGE;
+							break;
+						default:
+							Assert(false);
+							predicate = 0; /* prevent compiler warning */
+							break;
+					}
+
+					v_result = LLVMBuildZExt(
+						builder,
+						LLVMBuildICmp(
+							builder,
+							predicate,
+							v_cmpresult,
+							LLVMConstInt(LLVMInt32Type(), 0, false), ""),
+						TypeSizeT, "");
+
+					LLVMBuildStore(
+						builder,
+						LLVMConstInt(LLVMInt8Type(), 0, false),
+						v_resnullp);
+					LLVMBuildStore(
+						builder,
+						v_result,
+						v_resvaluep);
+
+					LLVMBuildBr(builder, opblocks[i + 1]);
+
+					break;
+				}
+
+			case EEOP_MAKE_READONLY:
+				{
+					LLVMBasicBlockRef b_notnull;
+					LLVMValueRef v_params[1];
+					LLVMValueRef v_ret;
+					LLVMValueRef v_nullp;
+					LLVMValueRef v_valuep;
+					LLVMValueRef v_null;
+					LLVMValueRef v_value;
+
+					b_notnull = LLVMInsertBasicBlock(opblocks[i + 1], "readonly.notnull");
+
+					v_nullp = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(TypeSizeT, (uintptr_t) op->d.make_readonly.isnull, false),
+						LLVMPointerType(LLVMInt8Type(), 0),
+						"");
+
+					v_null = LLVMBuildLoad(builder, v_nullp, "");
+
+					/* store null isnull value in result */
+					LLVMBuildStore(
+						builder,
+						v_null,
+						v_resnullp);
+
+					/* check if value is NULL */
+					LLVMBuildCondBr(
+						builder,
+						LLVMBuildICmp(builder, LLVMIntEQ, v_null,
+									  LLVMConstInt(LLVMInt8Type(), 1, false), ""),
+						opblocks[i + 1], b_notnull);
+
+					/* if value is not null, convert to RO datum */
+					LLVMPositionBuilderAtEnd(builder, b_notnull);
+
+					v_valuep = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(TypeSizeT, (uintptr_t) op->d.make_readonly.value, false),
+						LLVMPointerType(TypeSizeT, 0),
+						"");
+
+					v_value = LLVMBuildLoad(builder, v_valuep, "");
+
+					v_params[0] = v_value;
+					v_ret = LLVMBuildCall(builder, create_MakeExpandedObjectReadOnly(mod),
+										  v_params, lengthof(v_params), "");
+					LLVMBuildStore(
+						builder,
+						v_ret,
+						v_resvaluep);
+
+					LLVMBuildBr(builder, opblocks[i + 1]);
+					break;
+				}
+
+			case EEOP_FUNCEXPR_FUSAGE:
+			case EEOP_FUNCEXPR_STRICT_FUSAGE:
+
+				elog(ERROR, "unimplemented in jit: %zu", op->opcode);
+
+			case EEOP_LAST:
+				Assert(false);
+				break;
+		}
+	}
+
+	/*
+	 * Don't immediately emit function, instead do so the first time the
+	 * expression is actually evaluated. That allows to emit a lot of
+	 * functions together, avoiding a lot of repeated llvm and memory
+	 * remapping overhead.
+	 */
+	state->evalfunc = ExecRunCompiledExpr;
+
+	{
+		CompiledExprState *cstate = palloc0(sizeof(CompiledExprState));
+		cstate->context = context;
+		cstate->funcname = funcname;
+		state->evalfunc_private = cstate;
+	}
+
+	LLVMDisposeBuilder(builder);
+
+	return true;
+}
+
+#endif
diff --git a/src/backend/utils/fmgr/fmgr.c b/src/backend/utils/fmgr/fmgr.c
index a7b07827e0..fb5cfedb5d 100644
--- a/src/backend/utils/fmgr/fmgr.c
+++ b/src/backend/utils/fmgr/fmgr.c
@@ -67,7 +67,7 @@ static Datum fmgr_security_definer(PG_FUNCTION_ARGS);
  * or name, but search by Oid is much faster.
  */
 
-static const FmgrBuiltin *
+const FmgrBuiltin *
 fmgr_isbuiltin(Oid id)
 {
 	int			low = 0;
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 2edc0b33c5..9a80ecedc2 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -1020,6 +1020,17 @@ static struct config_bool ConfigureNamesBool[] =
 		NULL, NULL, NULL
 	},
 
+	{
+		{"jit_expressions", PGC_USERSET, DEVELOPER_OPTIONS,
+			gettext_noop("just-in-time compile expression evaluation"),
+			NULL,
+			GUC_NOT_IN_SAMPLE
+		},
+		&jit_expressions,
+		false,
+		NULL, NULL, NULL
+	},
+
 #endif
 
 	{
diff --git a/src/include/executor/execExpr.h b/src/include/executor/execExpr.h
index 0fbc112890..3919ac5598 100644
--- a/src/include/executor/execExpr.h
+++ b/src/include/executor/execExpr.h
@@ -595,7 +595,8 @@ typedef struct ArrayRefState
 } ArrayRefState;
 
 
-extern void ExecReadyInterpretedExpr(ExprState *state);
+extern void ExecReadyInterpretedExpr(ExprState *state, PlanState *parent);
+extern bool ExecReadyCompiledExpr(ExprState *state, PlanState *parent);
 
 extern ExprEvalOp ExecEvalStepOp(ExprState *state, ExprEvalStep *op);
 
diff --git a/src/include/executor/executor.h b/src/include/executor/executor.h
index f0601cb870..4de4bf4035 100644
--- a/src/include/executor/executor.h
+++ b/src/include/executor/executor.h
@@ -88,6 +88,10 @@ extern PGDLLIMPORT ExecutorEnd_hook_type ExecutorEnd_hook;
 typedef bool (*ExecutorCheckPerms_hook_type) (List *, bool);
 extern PGDLLIMPORT ExecutorCheckPerms_hook_type ExecutorCheckPerms_hook;
 
+/* GUC variables for JITing */
+#ifdef USE_LLVM
+extern bool jit_expressions;
+#endif
 
 /*
  * prototypes from functions in execAmi.c
diff --git a/src/include/lib/llvmjit.h b/src/include/lib/llvmjit.h
index 82b0b91c93..9711d398ca 100644
--- a/src/include/lib/llvmjit.h
+++ b/src/include/lib/llvmjit.h
@@ -72,9 +72,8 @@ extern void llvm_shutdown_orc_perf_support(LLVMOrcJITStackRef llvm_orc);
 
 #else
 
-typedef struct LLVMJitContext
-{
-} LLVMJitContext;
+struct LLVMJitContext;
+typedef struct LLVMJitContext LLVMJitContext;
 
 #endif /* USE_LLVM */
 
diff --git a/src/include/utils/fmgrtab.h b/src/include/utils/fmgrtab.h
index 6130ef8f9c..0a29198db0 100644
--- a/src/include/utils/fmgrtab.h
+++ b/src/include/utils/fmgrtab.h
@@ -36,4 +36,6 @@ extern const FmgrBuiltin fmgr_builtins[];
 
 extern const int fmgr_nbuiltins;	/* number of entries in table */
 
+extern const FmgrBuiltin *fmgr_isbuiltin(Oid id);
+
 #endif							/* FMGRTAB_H */
-- 
2.14.1.2.g4274c698f4.dirty

0009-Simplify-aggregate-code-a-bit.patchtext/x-diff; charset=us-asciiDownload
From 31f06781bf6a53de34c20fbaaed0d81367e0e7f4 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Thu, 3 Aug 2017 15:23:40 -0700
Subject: [PATCH 09/16] Simplify aggregate code a bit.

---
 src/backend/executor/nodeAgg.c | 94 ++++++++++++++++++++----------------------
 src/include/nodes/execnodes.h  |  6 ++-
 2 files changed, 48 insertions(+), 52 deletions(-)

diff --git a/src/backend/executor/nodeAgg.c b/src/backend/executor/nodeAgg.c
index 1783f38f14..7e521459d6 100644
--- a/src/backend/executor/nodeAgg.c
+++ b/src/backend/executor/nodeAgg.c
@@ -522,13 +522,13 @@ static void select_current_set(AggState *aggstate, int setno, bool is_hash);
 static void initialize_phase(AggState *aggstate, int newphase);
 static TupleTableSlot *fetch_input_tuple(AggState *aggstate);
 static void initialize_aggregates(AggState *aggstate,
-					  AggStatePerGroup pergroup,
-					  int numReset);
+					  AggStatePerGroup *pergroups,
+					  bool isHash, int numReset);
 static void advance_transition_function(AggState *aggstate,
 							AggStatePerTrans pertrans,
 							AggStatePerGroup pergroupstate);
-static void advance_aggregates(AggState *aggstate, AggStatePerGroup pergroup,
-				   AggStatePerGroup *pergroups);
+static void advance_aggregates(AggState *aggstate, AggStatePerGroup *sort_pergroups,
+				   AggStatePerGroup *hash_pergroups);
 static void advance_combine_function(AggState *aggstate,
 						 AggStatePerTrans pertrans,
 						 AggStatePerGroup pergroupstate);
@@ -782,15 +782,14 @@ initialize_aggregate(AggState *aggstate, AggStatePerTrans pertrans,
  * If there are multiple grouping sets, we initialize only the first numReset
  * of them (the grouping sets are ordered so that the most specific one, which
  * is reset most often, is first). As a convenience, if numReset is 0, we
- * reinitialize all sets. numReset is -1 to initialize a hashtable entry, in
- * which case the caller must have used select_current_set appropriately.
+ * reinitialize all sets.
  *
  * When called, CurrentMemoryContext should be the per-query context.
  */
 static void
 initialize_aggregates(AggState *aggstate,
-					  AggStatePerGroup pergroup,
-					  int numReset)
+					  AggStatePerGroup *pergroups,
+					  bool isHash, int numReset)
 {
 	int			transno;
 	int			numGroupingSets = Max(aggstate->phase->numsets, 1);
@@ -801,31 +800,19 @@ initialize_aggregates(AggState *aggstate,
 	if (numReset == 0)
 		numReset = numGroupingSets;
 
-	for (transno = 0; transno < numTrans; transno++)
+	for (setno = 0; setno < numReset; setno++)
 	{
-		AggStatePerTrans pertrans = &transstates[transno];
+		AggStatePerGroup pergroup = pergroups[setno];
 
-		if (numReset < 0)
+		select_current_set(aggstate, setno, isHash);
+
+		for (transno = 0; transno < numTrans; transno++)
 		{
-			AggStatePerGroup pergroupstate;
-
-			pergroupstate = &pergroup[transno];
+			AggStatePerTrans pertrans = &transstates[transno];
+			AggStatePerGroup pergroupstate = &pergroup[transno];
 
 			initialize_aggregate(aggstate, pertrans, pergroupstate);
 		}
-		else
-		{
-			for (setno = 0; setno < numReset; setno++)
-			{
-				AggStatePerGroup pergroupstate;
-
-				pergroupstate = &pergroup[transno + (setno * numTrans)];
-
-				select_current_set(aggstate, setno, false);
-
-				initialize_aggregate(aggstate, pertrans, pergroupstate);
-			}
-		}
 	}
 }
 
@@ -965,7 +952,7 @@ advance_transition_function(AggState *aggstate,
  * When called, CurrentMemoryContext should be the per-query context.
  */
 static void
-advance_aggregates(AggState *aggstate, AggStatePerGroup pergroup, AggStatePerGroup *pergroups)
+advance_aggregates(AggState *aggstate, AggStatePerGroup *sort_pergroups, AggStatePerGroup *hash_pergroups)
 {
 	int			transno;
 	int			setno = 0;
@@ -1002,7 +989,7 @@ advance_aggregates(AggState *aggstate, AggStatePerGroup pergroup, AggStatePerGro
 		{
 			/* DISTINCT and/or ORDER BY case */
 			Assert(slot->tts_nvalid >= (pertrans->numInputs + inputoff));
-			Assert(!pergroups);
+			Assert(!hash_pergroups);
 
 			/*
 			 * If the transfn is strict, we want to check for nullity before
@@ -1063,9 +1050,9 @@ advance_aggregates(AggState *aggstate, AggStatePerGroup pergroup, AggStatePerGro
 				fcinfo->argnull[i + 1] = slot->tts_isnull[i + inputoff];
 			}
 
-			if (pergroup)
+			if (sort_pergroups)
 			{
-				/* advance transition states for ordered grouping */
+				/* advance transition states for ordered grouping  */
 
 				for (setno = 0; setno < numGroupingSets; setno++)
 				{
@@ -1073,13 +1060,13 @@ advance_aggregates(AggState *aggstate, AggStatePerGroup pergroup, AggStatePerGro
 
 					select_current_set(aggstate, setno, false);
 
-					pergroupstate = &pergroup[transno + (setno * numTrans)];
+					pergroupstate = &sort_pergroups[setno][transno];
 
 					advance_transition_function(aggstate, pertrans, pergroupstate);
 				}
 			}
 
-			if (pergroups)
+			if (hash_pergroups)
 			{
 				/* advance transition states for hashed grouping */
 
@@ -1089,7 +1076,7 @@ advance_aggregates(AggState *aggstate, AggStatePerGroup pergroup, AggStatePerGro
 
 					select_current_set(aggstate, setno, true);
 
-					pergroupstate = &pergroups[setno][transno];
+					pergroupstate = &hash_pergroups[setno][transno];
 
 					advance_transition_function(aggstate, pertrans, pergroupstate);
 				}
@@ -2061,8 +2048,8 @@ lookup_hash_entry(AggState *aggstate)
 			MemoryContextAlloc(perhash->hashtable->tablecxt,
 							   sizeof(AggStatePerGroupData) * aggstate->numtrans);
 		/* initialize aggregates for new tuple group */
-		initialize_aggregates(aggstate, (AggStatePerGroup) entry->additional,
-							  -1);
+		initialize_aggregates(aggstate, (AggStatePerGroup*) &entry->additional,
+							  true, 1);
 	}
 
 	return entry;
@@ -2146,7 +2133,7 @@ agg_retrieve_direct(AggState *aggstate)
 	ExprContext *econtext;
 	ExprContext *tmpcontext;
 	AggStatePerAgg peragg;
-	AggStatePerGroup pergroup;
+	AggStatePerGroup *pergroups;
 	AggStatePerGroup *hash_pergroups = NULL;
 	TupleTableSlot *outerslot;
 	TupleTableSlot *firstSlot;
@@ -2169,7 +2156,7 @@ agg_retrieve_direct(AggState *aggstate)
 	tmpcontext = aggstate->tmpcontext;
 
 	peragg = aggstate->peragg;
-	pergroup = aggstate->pergroup;
+	pergroups = aggstate->pergroups;
 	firstSlot = aggstate->ss.ss_ScanTupleSlot;
 
 	/*
@@ -2371,7 +2358,7 @@ agg_retrieve_direct(AggState *aggstate)
 			/*
 			 * Initialize working state for a new input tuple group.
 			 */
-			initialize_aggregates(aggstate, pergroup, numReset);
+			initialize_aggregates(aggstate, pergroups, false, numReset);
 
 			if (aggstate->grp_firstTuple != NULL)
 			{
@@ -2408,9 +2395,9 @@ agg_retrieve_direct(AggState *aggstate)
 						hash_pergroups = NULL;
 
 					if (DO_AGGSPLIT_COMBINE(aggstate->aggsplit))
-						combine_aggregates(aggstate, pergroup);
+						combine_aggregates(aggstate, pergroups[0]);
 					else
-						advance_aggregates(aggstate, pergroup, hash_pergroups);
+						advance_aggregates(aggstate, pergroups, hash_pergroups);
 
 					/* Reset per-input-tuple context after each tuple */
 					ResetExprContext(tmpcontext);
@@ -2474,7 +2461,7 @@ agg_retrieve_direct(AggState *aggstate)
 
 		finalize_aggregates(aggstate,
 							peragg,
-							pergroup + (currentSet * aggstate->numtrans));
+							pergroups[currentSet]);
 
 		/*
 		 * If there's no row to project right now, we must continue rather
@@ -2715,7 +2702,7 @@ ExecInitAgg(Agg *node, EState *estate, int eflags)
 	aggstate->curpertrans = NULL;
 	aggstate->input_done = false;
 	aggstate->agg_done = false;
-	aggstate->pergroup = NULL;
+	aggstate->pergroups = NULL;
 	aggstate->grp_firstTuple = NULL;
 	aggstate->sort_in = NULL;
 	aggstate->sort_out = NULL;
@@ -3019,13 +3006,17 @@ ExecInitAgg(Agg *node, EState *estate, int eflags)
 
 	if (node->aggstrategy != AGG_HASHED)
 	{
-		AggStatePerGroup pergroup;
+		AggStatePerGroup *pergroups =
+			(AggStatePerGroup*) palloc0(sizeof(AggStatePerGroup)
+										* numGroupingSets);
 
-		pergroup = (AggStatePerGroup) palloc0(sizeof(AggStatePerGroupData)
-											  * numaggs
-											  * numGroupingSets);
+		for (i = 0; i < numGroupingSets; i++)
+		{
+			pergroups[i] = (AggStatePerGroup) palloc0(sizeof(AggStatePerGroupData)
+													 * numaggs);
+		}
 
-		aggstate->pergroup = pergroup;
+		aggstate->pergroups = pergroups;
 	}
 
 	/*
@@ -3988,8 +3979,11 @@ ExecReScanAgg(AggState *node)
 		/*
 		 * Reset the per-group state (in particular, mark transvalues null)
 		 */
-		MemSet(node->pergroup, 0,
-			   sizeof(AggStatePerGroupData) * node->numaggs * numGroupingSets);
+		for (setno = 0; setno < numGroupingSets; setno++)
+		{
+			MemSet(node->pergroups[setno], 0,
+				   sizeof(AggStatePerGroupData) * node->numaggs);
+		}
 
 		/* reset to phase 1 */
 		initialize_phase(node, 1);
diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h
index 8ae8179ee7..bc5874f1ee 100644
--- a/src/include/nodes/execnodes.h
+++ b/src/include/nodes/execnodes.h
@@ -1823,13 +1823,15 @@ typedef struct AggState
 	Tuplesortstate *sort_out;	/* input is copied here for next phase */
 	TupleTableSlot *sort_slot;	/* slot for sort results */
 	/* these fields are used in AGG_PLAIN and AGG_SORTED modes: */
-	AggStatePerGroup pergroup;	/* per-Aggref-per-group working state */
+	AggStatePerGroup *pergroups;	/* grouping set indexed array of per-group
+									 * pointers */
 	HeapTuple	grp_firstTuple; /* copy of first tuple of current group */
 	/* these fields are used in AGG_HASHED and AGG_MIXED modes: */
 	bool		table_filled;	/* hash table filled yet? */
 	int			num_hashes;
 	AggStatePerHash perhash;
-	AggStatePerGroup *hash_pergroup;	/* array of per-group pointers */
+	AggStatePerGroup *hash_pergroup;	/* grouping set indexed array of
+										 * per-group pointers */
 	/* support for evaluation of agg inputs */
 	TupleTableSlot *evalslot;	/* slot for agg inputs */
 	ProjectionInfo *evalproj;	/* projection machinery */
-- 
2.14.1.2.g4274c698f4.dirty

0010-More-efficient-AggState-pertrans-iteration.patchtext/x-diff; charset=us-asciiDownload
From 86ab48144bda740ba2b3781894abf9cfa939eb43 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 13 Mar 2017 20:22:10 -0700
Subject: [PATCH 10/16] More efficient AggState->pertrans iteration.

Turns out AggStatePerTrans is so large that multiplications are needed
to access elements of AggState->pertrans on x86.

Author: Andres Freund
---
 src/backend/executor/nodeAgg.c | 27 +++++++++++++++------------
 1 file changed, 15 insertions(+), 12 deletions(-)

diff --git a/src/backend/executor/nodeAgg.c b/src/backend/executor/nodeAgg.c
index 7e521459d6..291f15fd94 100644
--- a/src/backend/executor/nodeAgg.c
+++ b/src/backend/executor/nodeAgg.c
@@ -960,14 +960,15 @@ advance_aggregates(AggState *aggstate, AggStatePerGroup *sort_pergroups, AggStat
 	int			numHashes = aggstate->num_hashes;
 	int			numTrans = aggstate->numtrans;
 	TupleTableSlot *slot = aggstate->evalslot;
+	AggStatePerTrans pertrans;
 
 	/* compute input for all aggregates */
 	if (aggstate->evalproj)
 		aggstate->evalslot = ExecProject(aggstate->evalproj);
 
-	for (transno = 0; transno < numTrans; transno++)
+	for (transno = 0, pertrans = &aggstate->pertrans[0];
+		 transno < numTrans; transno++, pertrans++)
 	{
-		AggStatePerTrans pertrans = &aggstate->pertrans[transno];
 		ExprState  *filter = pertrans->aggfilter;
 		int			numTransInputs = pertrans->numTransInputs;
 		int			i;
@@ -1098,6 +1099,7 @@ combine_aggregates(AggState *aggstate, AggStatePerGroup pergroup)
 	int			transno;
 	int			numTrans = aggstate->numtrans;
 	TupleTableSlot *slot;
+	AggStatePerTrans pertrans;
 
 	/* combine not supported with grouping sets */
 	Assert(aggstate->phase->numsets <= 1);
@@ -1105,9 +1107,9 @@ combine_aggregates(AggState *aggstate, AggStatePerGroup pergroup)
 	/* compute input for all aggregates */
 	slot = ExecProject(aggstate->evalproj);
 
-	for (transno = 0; transno < numTrans; transno++)
+	for (transno = 0, pertrans = &aggstate->pertrans[0];
+		 transno < numTrans; transno++, pertrans++)
 	{
-		AggStatePerTrans pertrans = &aggstate->pertrans[transno];
 		AggStatePerGroup pergroupstate = &pergroup[transno];
 		FunctionCallInfo fcinfo = &pertrans->transfn_fcinfo;
 		int			inputoff = pertrans->inputoff;
@@ -2659,6 +2661,7 @@ ExecInitAgg(Agg *node, EState *estate, int eflags)
 	AggState   *aggstate;
 	AggStatePerAgg peraggs;
 	AggStatePerTrans pertransstates;
+	AggStatePerTrans pertrans;
 	Plan	   *outerPlan;
 	ExprContext *econtext;
 	int			numaggs,
@@ -3349,9 +3352,9 @@ ExecInitAgg(Agg *node, EState *estate, int eflags)
 	 */
 	combined_inputeval = NIL;
 	column_offset = 0;
-	for (transno = 0; transno < aggstate->numtrans; transno++)
+	for (transno = 0, pertrans = &pertransstates[0];
+		 transno < aggstate->numtrans; transno++, pertrans++)
 	{
-		AggStatePerTrans pertrans = &pertransstates[transno];
 		ListCell   *arg;
 
 		pertrans->inputoff = column_offset;
@@ -3842,6 +3845,7 @@ ExecEndAgg(AggState *node)
 	int			transno;
 	int			numGroupingSets = Max(node->maxsets, 1);
 	int			setno;
+	AggStatePerTrans pertrans;
 
 	/* Make sure we have closed any open tuplesorts */
 
@@ -3850,10 +3854,9 @@ ExecEndAgg(AggState *node)
 	if (node->sort_out)
 		tuplesort_end(node->sort_out);
 
-	for (transno = 0; transno < node->numtrans; transno++)
+	for (transno = 0, pertrans = &node->pertrans[0];
+		 transno < node->numtrans; transno++, pertrans++)
 	{
-		AggStatePerTrans pertrans = &node->pertrans[transno];
-
 		for (setno = 0; setno < numGroupingSets; setno++)
 		{
 			if (pertrans->sortstates[setno])
@@ -3890,6 +3893,7 @@ ExecReScanAgg(AggState *node)
 	int			transno;
 	int			numGroupingSets = Max(node->maxsets, 1);
 	int			setno;
+	AggStatePerTrans pertrans;
 
 	node->agg_done = false;
 
@@ -3921,12 +3925,11 @@ ExecReScanAgg(AggState *node)
 	}
 
 	/* Make sure we have closed any open tuplesorts */
-	for (transno = 0; transno < node->numtrans; transno++)
+	for (transno = 0, pertrans = &node->pertrans[0];
+		 transno < node->numtrans; transno++, pertrans++)
 	{
 		for (setno = 0; setno < numGroupingSets; setno++)
 		{
-			AggStatePerTrans pertrans = &node->pertrans[transno];
-
 			if (pertrans->sortstates[setno])
 			{
 				tuplesort_end(pertrans->sortstates[setno]);
-- 
2.14.1.2.g4274c698f4.dirty

0011-Avoid-dereferencing-tts_values-nulls-repeatedly.patchtext/x-diff; charset=us-asciiDownload
From 87d95e24295df49fd9b64da275385bc1c775ae2d Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Mon, 10 Jul 2017 15:07:32 -0700
Subject: [PATCH 11/16] Avoid dereferencing tts_values/nulls repeatedly.

Author:
Reviewed-By:
Discussion: https://postgr.es/m/
Backpatch:
---
 src/backend/executor/nodeAgg.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/src/backend/executor/nodeAgg.c b/src/backend/executor/nodeAgg.c
index 291f15fd94..a63c05cb68 100644
--- a/src/backend/executor/nodeAgg.c
+++ b/src/backend/executor/nodeAgg.c
@@ -960,6 +960,8 @@ advance_aggregates(AggState *aggstate, AggStatePerGroup *sort_pergroups, AggStat
 	int			numHashes = aggstate->num_hashes;
 	int			numTrans = aggstate->numtrans;
 	TupleTableSlot *slot = aggstate->evalslot;
+	Datum	   *values = slot->tts_values;
+	bool	   *nulls = slot->tts_isnull;
 	AggStatePerTrans pertrans;
 
 	/* compute input for all aggregates */
@@ -1015,8 +1017,7 @@ advance_aggregates(AggState *aggstate, AggStatePerGroup *sort_pergroups, AggStat
 				/* OK, put the tuple into the tuplesort object */
 				if (pertrans->numInputs == 1)
 					tuplesort_putdatum(pertrans->sortstates[setno],
-									   slot->tts_values[inputoff],
-									   slot->tts_isnull[inputoff]);
+									   values[inputoff], nulls[inputoff]);
 				else
 				{
 					/*
@@ -1025,10 +1026,10 @@ advance_aggregates(AggState *aggstate, AggStatePerGroup *sort_pergroups, AggStat
 					 */
 					ExecClearTuple(pertrans->sortslot);
 					memcpy(pertrans->sortslot->tts_values,
-						   &slot->tts_values[inputoff],
+						   &values[inputoff],
 						   pertrans->numInputs * sizeof(Datum));
 					memcpy(pertrans->sortslot->tts_isnull,
-						   &slot->tts_isnull[inputoff],
+						   &nulls[inputoff],
 						   pertrans->numInputs * sizeof(bool));
 					pertrans->sortslot->tts_nvalid = pertrans->numInputs;
 					ExecStoreVirtualTuple(pertrans->sortslot);
@@ -1047,8 +1048,8 @@ advance_aggregates(AggState *aggstate, AggStatePerGroup *sort_pergroups, AggStat
 
 			for (i = 0; i < numTransInputs; i++)
 			{
-				fcinfo->arg[i + 1] = slot->tts_values[i + inputoff];
-				fcinfo->argnull[i + 1] = slot->tts_isnull[i + inputoff];
+				fcinfo->arg[i + 1] = values[i + inputoff];
+				fcinfo->argnull[i + 1] = nulls[i + inputoff];
 			}
 
 			if (sort_pergroups)
-- 
2.14.1.2.g4274c698f4.dirty

0012-Centralize-slot-deforming-logic-a-bit.patchtext/x-diff; charset=us-asciiDownload
From 4db1d9b56b28ea81c542d2276c3b494a86eb75dc Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Fri, 4 Aug 2017 15:06:29 -0700
Subject: [PATCH 12/16] Centralize slot deforming logic a bit.

Author:
Reviewed-By:
Discussion: https://postgr.es/m/
Backpatch:
---
 src/backend/access/common/heaptuple.c | 148 +++++++++++-----------------------
 1 file changed, 47 insertions(+), 101 deletions(-)

diff --git a/src/backend/access/common/heaptuple.c b/src/backend/access/common/heaptuple.c
index 13ee528e26..f77ea477fb 100644
--- a/src/backend/access/common/heaptuple.c
+++ b/src/backend/access/common/heaptuple.c
@@ -1046,6 +1046,7 @@ slot_deform_tuple(TupleTableSlot *slot, int natts)
 	long		off;			/* offset in tuple data */
 	bits8	   *bp = tup->t_bits;	/* ptr to null bitmap in tuple */
 	bool		slow;			/* can we use/set attcacheoff? */
+	int			valnatts = natts;
 
 	/*
 	 * Check whether the first call for this tuple, and initialize or restore
@@ -1065,6 +1066,9 @@ slot_deform_tuple(TupleTableSlot *slot, int natts)
 		slow = slot->tts_slow;
 	}
 
+
+	natts = Min(natts, Min(HeapTupleHeaderGetNatts(tuple->t_data), slot->tts_tupleDescriptor->natts));
+
 	tp = (char *) tup + tup->t_hoff;
 
 	for (; attnum < natts; attnum++)
@@ -1118,10 +1122,16 @@ slot_deform_tuple(TupleTableSlot *slot, int natts)
 			slow = true;		/* can't use attcacheoff anymore */
 	}
 
+	for (; attnum < valnatts; attnum++)
+	{
+		values[attnum] = 0;
+		isnull[attnum] = 1;
+	}
+
 	/*
 	 * Save state for next execution
 	 */
-	slot->tts_nvalid = attnum;
+	slot->tts_nvalid = valnatts;
 	slot->tts_off = off;
 	slot->tts_slow = slow;
 }
@@ -1142,46 +1152,38 @@ Datum
 slot_getattr(TupleTableSlot *slot, int attnum, bool *isnull)
 {
 	HeapTuple	tuple = slot->tts_tuple;
-	TupleDesc	tupleDesc = slot->tts_tupleDescriptor;
-	HeapTupleHeader tup;
+	TupleDesc	tupleDesc PG_USED_FOR_ASSERTS_ONLY = slot->tts_tupleDescriptor;
 
 	/*
 	 * system attributes are handled by heap_getsysattr
 	 */
-	if (attnum <= 0)
+	if (unlikely(attnum <= 0))
 	{
-		if (tuple == NULL)		/* internal error */
-			elog(ERROR, "cannot extract system attribute from virtual tuple");
-		if (tuple == &(slot->tts_minhdr))	/* internal error */
-			elog(ERROR, "cannot extract system attribute from minimal tuple");
+
+		/* cannot extract system attribute from virtual tuple */
+		Assert(tuple);
+		/* "cannot extract system attribute from minimal tuple */
+		Assert(tuple != &(slot->tts_minhdr));
 		return heap_getsysattr(tuple, attnum, tupleDesc, isnull);
 	}
 
 	/*
 	 * fast path if desired attribute already cached
 	 */
-	if (attnum <= slot->tts_nvalid)
+	if (likely(attnum <= slot->tts_nvalid))
 	{
 		*isnull = slot->tts_isnull[attnum - 1];
 		return slot->tts_values[attnum - 1];
 	}
 
 	/*
-	 * return NULL if attnum is out of range according to the tupdesc
+	 * While tuples might possibly be wider than the slot, they should never
+	 * be accessed. We used to return NULL if so, but that a) isn't free b)
+	 * seems more likely to hide bugs than anything.
 	 */
-	if (attnum > tupleDesc->natts)
-	{
-		*isnull = true;
-		return (Datum) 0;
-	}
-
-	/*
-	 * otherwise we had better have a physical tuple (tts_nvalid should equal
-	 * natts in all virtual-tuple cases)
-	 */
-	if (tuple == NULL)			/* internal error */
-		elog(ERROR, "cannot extract attribute from empty tuple slot");
+	Assert(attnum <= tupleDesc->natts);
 
+#ifdef NOT_ANYMORE
 	/*
 	 * return NULL if attnum is out of range according to the tuple
 	 *
@@ -1195,26 +1197,13 @@ slot_getattr(TupleTableSlot *slot, int attnum, bool *isnull)
 		*isnull = true;
 		return (Datum) 0;
 	}
+#endif
 
 	/*
-	 * check if target attribute is null: no point in groveling through tuple
+	 * otherwise we had better have a physical tuple (tts_nvalid should equal
+	 * natts in all virtual-tuple cases)
 	 */
-	if (HeapTupleHasNulls(tuple) && att_isnull(attnum - 1, tup->t_bits))
-	{
-		*isnull = true;
-		return (Datum) 0;
-	}
-
-	/*
-	 * If the attribute's column has been dropped, we force a NULL result.
-	 * This case should not happen in normal use, but it could happen if we
-	 * are executing a plan cached before the column was dropped.
-	 */
-	if (TupleDescAttr(tupleDesc, attnum - 1)->attisdropped)
-	{
-		*isnull = true;
-		return (Datum) 0;
-	}
+	Assert(tuple != NULL);
 
 	/*
 	 * Extract the attribute, along with any preceding attributes.
@@ -1238,8 +1227,7 @@ void
 slot_getallattrs(TupleTableSlot *slot)
 {
 	int			tdesc_natts = slot->tts_tupleDescriptor->natts;
-	int			attnum;
-	HeapTuple	tuple;
+	HeapTuple	tuple PG_USED_FOR_ASSERTS_ONLY;
 
 	/* Quick out if we have 'em all already */
 	if (slot->tts_nvalid == tdesc_natts)
@@ -1250,27 +1238,10 @@ slot_getallattrs(TupleTableSlot *slot)
 	 * natts in all virtual-tuple cases)
 	 */
 	tuple = slot->tts_tuple;
-	if (tuple == NULL)			/* internal error */
-		elog(ERROR, "cannot extract attribute from empty tuple slot");
+	Assert(tuple != NULL);
 
-	/*
-	 * load up any slots available from physical tuple
-	 */
-	attnum = HeapTupleHeaderGetNatts(tuple->t_data);
-	attnum = Min(attnum, tdesc_natts);
-
-	slot_deform_tuple(slot, attnum);
-
-	/*
-	 * If tuple doesn't have all the atts indicated by tupleDesc, read the
-	 * rest as null
-	 */
-	for (; attnum < tdesc_natts; attnum++)
-	{
-		slot->tts_values[attnum] = (Datum) 0;
-		slot->tts_isnull[attnum] = true;
-	}
-	slot->tts_nvalid = tdesc_natts;
+	slot_deform_tuple(slot, tdesc_natts);
+	Assert(tdesc_natts <= slot->tts_nvalid);
 }
 
 /*
@@ -1281,43 +1252,22 @@ slot_getallattrs(TupleTableSlot *slot)
 void
 slot_getsomeattrs(TupleTableSlot *slot, int attnum)
 {
-	HeapTuple	tuple;
-	int			attno;
-
 	/* Quick out if we have 'em all already */
 	if (slot->tts_nvalid >= attnum)
 		return;
 
 	/* Check for caller error */
-	if (attnum <= 0 || attnum > slot->tts_tupleDescriptor->natts)
-		elog(ERROR, "invalid attribute number %d", attnum);
+	Assert(attnum > 0);
+	Assert(attnum <= slot->tts_tupleDescriptor->natts);
 
 	/*
 	 * otherwise we had better have a physical tuple (tts_nvalid should equal
 	 * natts in all virtual-tuple cases)
 	 */
-	tuple = slot->tts_tuple;
-	if (tuple == NULL)			/* internal error */
-		elog(ERROR, "cannot extract attribute from empty tuple slot");
+	Assert(slot->tts_tuple != NULL); /* internal error */
 
-	/*
-	 * load up any slots available from physical tuple
-	 */
-	attno = HeapTupleHeaderGetNatts(tuple->t_data);
-	attno = Min(attno, attnum);
-
-	slot_deform_tuple(slot, attno);
-
-	/*
-	 * If tuple doesn't have all the atts indicated by tupleDesc, read the
-	 * rest as null
-	 */
-	for (; attno < attnum; attno++)
-	{
-		slot->tts_values[attno] = (Datum) 0;
-		slot->tts_isnull[attno] = true;
-	}
-	slot->tts_nvalid = attnum;
+	slot_deform_tuple(slot, attnum);
+	Assert(attnum <= slot->tts_nvalid);
 }
 
 /*
@@ -1329,38 +1279,34 @@ bool
 slot_attisnull(TupleTableSlot *slot, int attnum)
 {
 	HeapTuple	tuple = slot->tts_tuple;
-	TupleDesc	tupleDesc = slot->tts_tupleDescriptor;
+	TupleDesc	tupleDesc PG_USED_FOR_ASSERTS_ONLY = slot->tts_tupleDescriptor;
 
 	/*
 	 * system attributes are handled by heap_attisnull
 	 */
-	if (attnum <= 0)
+	if (unlikely(attnum <= 0))
 	{
-		if (tuple == NULL)		/* internal error */
-			elog(ERROR, "cannot extract system attribute from virtual tuple");
-		if (tuple == &(slot->tts_minhdr))	/* internal error */
-			elog(ERROR, "cannot extract system attribute from minimal tuple");
+		/* cannot extract system attribute from virtual tuple */
+		Assert(tuple);
+		/* "cannot extract system attribute from minimal tuple */
+		Assert(tuple != &(slot->tts_minhdr));
 		return heap_attisnull(tuple, attnum);
 	}
 
 	/*
 	 * fast path if desired attribute already cached
 	 */
-	if (attnum <= slot->tts_nvalid)
+	if (likely(attnum <= slot->tts_nvalid))
 		return slot->tts_isnull[attnum - 1];
 
-	/*
-	 * return NULL if attnum is out of range according to the tupdesc
-	 */
-	if (attnum > tupleDesc->natts)
-		return true;
+	/* Check for caller error */
+	Assert(attnum <= tupleDesc->natts);
 
 	/*
 	 * otherwise we had better have a physical tuple (tts_nvalid should equal
 	 * natts in all virtual-tuple cases)
 	 */
-	if (tuple == NULL)			/* internal error */
-		elog(ERROR, "cannot extract attribute from empty tuple slot");
+	Assert(tuple != NULL);
 
 	/* and let the tuple tell it */
 	return heap_attisnull(tuple, attnum);
-- 
2.14.1.2.g4274c698f4.dirty

0013-WIP-Make-scan-desc-available-for-all-PlanStates.patchtext/x-diff; charset=us-asciiDownload
From 7fb3295812398f5a70f3b48f89d4b252b05755c4 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Thu, 31 Aug 2017 11:39:18 -0700
Subject: [PATCH 13/16] WIP: Make scan desc available for all PlanStates.

This is to allow JITing tuple deforming.
---
 src/backend/executor/execTuples.c | 1 +
 src/include/nodes/execnodes.h     | 3 +++
 2 files changed, 4 insertions(+)

diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c
index 8280b89f7f..78ec871f50 100644
--- a/src/backend/executor/execTuples.c
+++ b/src/backend/executor/execTuples.c
@@ -866,6 +866,7 @@ ExecInitScanTupleSlot(EState *estate, ScanState *scanstate, TupleDesc tupledesc)
 {
 	scanstate->ss_ScanTupleSlot = ExecAllocTableSlot(&estate->es_tupleTable,
 													 tupledesc);
+	scanstate->ps.scandesc = tupledesc;
 }
 
 /* ----------------
diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h
index bc5874f1ee..b0c4856392 100644
--- a/src/include/nodes/execnodes.h
+++ b/src/include/nodes/execnodes.h
@@ -869,6 +869,9 @@ typedef struct PlanState
 	ExprState  *qual;			/* boolean qual condition */
 	struct PlanState *lefttree; /* input plan tree(s) */
 	struct PlanState *righttree;
+
+	TupleDesc scandesc;
+
 	List	   *initPlan;		/* Init SubPlanState nodes (un-correlated expr
 								 * subselects) */
 	List	   *subPlan;		/* SubPlanState nodes in my expressions */
-- 
2.14.1.2.g4274c698f4.dirty

0014-WIP-JITed-tuple-deforming.patchtext/x-diff; charset=us-asciiDownload
From af483065afd0c21a33321332abaab3823d9d4285 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Thu, 31 Aug 2017 11:40:26 -0700
Subject: [PATCH 14/16] WIP: JITed tuple deforming.

---
 src/backend/access/common/heaptuple.c  | 660 +++++++++++++++++++++++++++++++++
 src/backend/executor/execExprCompile.c |  36 ++
 src/backend/executor/execTuples.c      |   5 +
 src/backend/lib/llvmjit.c              |   2 +-
 src/backend/utils/misc/guc.c           |  12 +
 src/include/executor/executor.h        |   1 +
 src/include/executor/tuptable.h        |   2 +-
 src/include/lib/llvmjit.h              |   6 +
 8 files changed, 722 insertions(+), 2 deletions(-)

diff --git a/src/backend/access/common/heaptuple.c b/src/backend/access/common/heaptuple.c
index f77ea477fb..0e552fb49a 100644
--- a/src/backend/access/common/heaptuple.c
+++ b/src/backend/access/common/heaptuple.c
@@ -60,7 +60,11 @@
 #include "access/sysattr.h"
 #include "access/tuptoaster.h"
 #include "executor/tuptable.h"
+#include "nodes/execnodes.h"
 #include "utils/expandeddatum.h"
+#include "utils/memutils.h"
+#include "utils/resowner.h"
+#include "lib/llvmjit.h"
 
 
 /* Does att's datatype allow packing into the 1-byte-header varlena format? */
@@ -70,6 +74,11 @@
 #define VARLENA_ATT_IS_PACKABLE(att) \
 	((att)->attstorage != 'p')
 
+#ifdef USE_LLVM
+bool jit_tuple_deforming = false;
+
+#endif /* USE_LLVM */
+
 
 /* ----------------------------------------------------------------
  *						misc support routines
@@ -1058,6 +1067,7 @@ slot_deform_tuple(TupleTableSlot *slot, int natts)
 		/* Start from the first attribute */
 		off = 0;
 		slow = false;
+		Assert(slot->tts_off == 0);
 	}
 	else
 	{
@@ -1476,3 +1486,653 @@ minimal_tuple_from_heap_tuple(HeapTuple htup)
 	result->t_len = len;
 	return result;
 }
+
+
+#ifdef USE_LLVM
+
+extern size_t varsize_any(void *p);
+
+size_t
+varsize_any(void *p)
+{
+	return VARSIZE_ANY(p);
+}
+
+/* build extern reference for varsize_any */
+static LLVMValueRef
+create_varsize_any(LLVMModuleRef mod)
+{
+	LLVMTypeRef *param_types = palloc(sizeof(LLVMTypeRef) * 1);
+	LLVMTypeRef sig;
+	LLVMValueRef fn;
+	const char *nm = "varsize_any";
+
+	fn = LLVMGetNamedFunction(mod, nm);
+	if (fn)
+		return fn;
+
+	param_types[0] = LLVMPointerType(LLVMInt8Type(), 0);
+	sig = LLVMFunctionType(LLVMInt64Type(), param_types, 1, 0);
+	fn = LLVMAddFunction(mod, nm, sig);
+
+	{
+		char argname[] = "readonly";
+		LLVMAttributeRef ref =
+			LLVMCreateStringAttribute(LLVMGetGlobalContext(), argname, strlen(argname), NULL, 0);
+		LLVMAddAttributeAtIndex(fn, LLVMAttributeFunctionIndex, ref);
+	}
+	{
+		char argname[] = "argmemonly";
+		LLVMAttributeRef ref =
+			LLVMCreateStringAttribute(LLVMGetGlobalContext(), argname, strlen(argname), NULL, 0);
+		LLVMAddAttributeAtIndex(fn, LLVMAttributeFunctionIndex, ref);
+	}
+
+	return fn;
+}
+
+/* build extern reference for strlen */
+static LLVMValueRef
+create_strlen(LLVMModuleRef mod)
+{
+	LLVMTypeRef *param_types = palloc(sizeof(LLVMTypeRef) * 1);
+	LLVMTypeRef sig;
+	LLVMValueRef fn;
+	const char *nm = "strlen";
+
+	fn = LLVMGetNamedFunction(mod, nm);
+	if (fn)
+		return fn;
+
+	param_types[0] = LLVMPointerType(LLVMInt8Type(), 0);
+	sig = LLVMFunctionType(TypeSizeT, param_types, 1, 0);
+	fn = LLVMAddFunction(mod, nm, sig);
+
+	return fn;
+}
+
+
+LLVMValueRef
+slot_compile_deform(LLVMJitContext *context, TupleDesc desc, int natts)
+{
+	static int deformcounter = 0;
+	char *funcname;
+
+	LLVMModuleRef mod;
+	LLVMBuilderRef builder;
+
+	LLVMTypeRef deform_sig;
+	LLVMValueRef deform_fn;
+
+	LLVMBasicBlockRef entry;
+	LLVMBasicBlockRef outblock;
+	LLVMBasicBlockRef deadblock;
+	LLVMBasicBlockRef *attcheckattnoblocks;
+	LLVMBasicBlockRef *attstartblocks;
+	LLVMBasicBlockRef *attisnullblocks;
+	LLVMBasicBlockRef *attcheckalignblocks;
+	LLVMBasicBlockRef *attalignblocks;
+	LLVMBasicBlockRef *attstoreblocks;
+	LLVMBasicBlockRef *attoutblocks;
+
+	LLVMValueRef l_varsize_any;
+	LLVMValueRef l_strlen;
+
+	LLVMValueRef v_tupdata_base;
+	LLVMValueRef v_off, v_off_inc, v_off_start;
+	LLVMValueRef v_tts_values;
+	LLVMValueRef v_tts_nulls;
+	LLVMValueRef v_slotoffp;
+	LLVMValueRef v_nvalidp, v_nvalid;
+	LLVMValueRef v_maxatt;
+
+	LLVMValueRef v_slot;
+
+	LLVMValueRef v_tupleheaderp;
+	LLVMValueRef v_tuplep;
+	LLVMValueRef v_infomask1;
+	//LLVMValueRef v_infomask2;
+	LLVMValueRef v_bits;
+
+	LLVMValueRef v_hoff;
+	//LLVMValueRef v_natts;
+
+	LLVMValueRef v_hasnulls;
+
+
+	int attnum;
+	int attcuralign = 0;
+	bool lastcouldbenull = false;
+
+	llvm_initialize();
+
+	mod = context->module;
+	if (!mod)
+	{
+		context->compiled = false;
+		mod = context->module = LLVMModuleCreateWithName("deform");
+		LLVMSetTarget(mod, llvm_triple);
+	}
+
+	funcname = psprintf("deform%d", context->counter++);
+	deformcounter++;
+
+	/* Create the signature and function */
+	{
+		LLVMTypeRef param_types[] = {
+			LLVMPointerType(StructTupleTableSlot, 0),
+			LLVMInt16Type()};
+		deform_sig = LLVMFunctionType(LLVMVoidType(), param_types,
+									  lengthof(param_types), 0);
+	}
+	deform_fn = LLVMAddFunction(mod, funcname, deform_sig);
+	LLVMSetLinkage(deform_fn, LLVMInternalLinkage);
+	LLVMSetVisibility(deform_fn, LLVMDefaultVisibility);
+	LLVMSetParamAlignment(LLVMGetParam(deform_fn, 0), MAXIMUM_ALIGNOF);
+
+	entry = LLVMAppendBasicBlock(deform_fn, "entry");
+	outblock = LLVMAppendBasicBlock(deform_fn, "out");
+	deadblock = LLVMAppendBasicBlock(deform_fn, "deadblock");
+	builder = LLVMCreateBuilder();
+
+	attcheckattnoblocks = palloc(sizeof(LLVMBasicBlockRef) * natts);
+	attstartblocks = palloc(sizeof(LLVMBasicBlockRef) * natts);
+	attisnullblocks = palloc(sizeof(LLVMBasicBlockRef) * natts);
+	attcheckalignblocks = palloc(sizeof(LLVMBasicBlockRef) * natts);
+	attalignblocks = palloc(sizeof(LLVMBasicBlockRef) * natts);
+	attstoreblocks = palloc(sizeof(LLVMBasicBlockRef) * natts);
+	attoutblocks = palloc(sizeof(LLVMBasicBlockRef) * natts);
+
+	l_varsize_any = create_varsize_any(mod);
+	l_strlen = create_strlen(mod);
+
+	attcuralign = 0;
+	lastcouldbenull = false;
+
+
+	LLVMPositionBuilderAtEnd(builder, entry);
+
+	v_slot = LLVMGetParam(deform_fn, 0);
+
+	v_tts_values = LLVMBuildLoad(builder,
+						   LLVMBuildStructGEP(builder, v_slot, 10, ""),
+						   "tts_values");
+	v_tts_nulls = LLVMBuildLoad(builder,
+							LLVMBuildStructGEP(builder, v_slot, 11, ""),
+							"tts_isnull");
+	v_slotoffp = LLVMBuildStructGEP(builder, v_slot, 14, "");
+	v_nvalidp = LLVMBuildStructGEP(builder, v_slot, 9, "");
+
+	v_tupleheaderp = LLVMBuildLoad(
+		builder,
+		LLVMBuildStructGEP(builder, v_slot, 5, ""),
+		"tupleheader");
+	v_tuplep = LLVMBuildLoad(
+		builder,
+		LLVMBuildStructGEP(builder, v_tupleheaderp, 3, ""),
+		"tuple");
+	v_bits = LLVMBuildBitCast(
+		builder,
+		LLVMBuildStructGEP(builder, v_tuplep, 5, "t_bits"),
+		LLVMPointerType(LLVMInt8Type(), 0),
+		"");
+
+	v_infomask1 =
+		LLVMBuildLoad(builder,
+					  LLVMBuildStructGEP(builder, v_tuplep, 3, ""),
+					  "infomask");
+	//(tuple)->t_data->t_infomask & HEAP_HASNULL
+	v_hasnulls =
+		LLVMBuildICmp(builder, LLVMIntNE,
+					  LLVMBuildAnd(builder,
+								   LLVMConstInt(LLVMInt16Type(), HEAP_HASNULL, false),
+								   v_infomask1, ""),
+					  LLVMConstInt(LLVMInt16Type(), 0, false),
+					  "hasnulls");
+
+	v_hoff = LLVMBuildLoad(
+		builder,
+		LLVMBuildStructGEP(
+			builder,
+			v_tuplep,
+			4,
+			""),
+		"t_hoff");
+
+	v_tupdata_base = LLVMBuildGEP(
+		builder,
+		LLVMBuildBitCast(
+			builder,
+			v_tuplep,
+			LLVMPointerType(LLVMInt8Type(), 0),
+			""),
+		&v_hoff, 1,
+		"v_tupdata_base");
+
+	v_off_start = LLVMBuildLoad(
+		builder,
+		LLVMBuildStructGEP(
+			builder,
+			v_slot,
+			14,
+			""),
+		"v_slot_off");
+
+	v_off_inc = v_off = v_off_start;
+
+	v_maxatt = LLVMGetParam(deform_fn, 1);
+
+	/* build the basic block for each attribute, need them as jump target */
+	for (attnum = 0; attnum < natts; attnum++)
+	{
+		char *blockname;
+
+		blockname = psprintf("block.attr.%d.attcheckattno", attnum);
+		attcheckattnoblocks[attnum] = LLVMAppendBasicBlock(deform_fn, blockname);
+		pfree(blockname);
+		blockname = psprintf("block.attr.%d.start", attnum);
+		attstartblocks[attnum] = LLVMAppendBasicBlock(deform_fn, blockname);
+		pfree(blockname);
+		blockname = psprintf("block.attr.%d.attisnull", attnum);
+		attisnullblocks[attnum] = LLVMAppendBasicBlock(deform_fn, blockname);
+		pfree(blockname);
+		blockname = psprintf("block.attr.%d.attcheckalign", attnum);
+		attcheckalignblocks[attnum] = LLVMAppendBasicBlock(deform_fn, blockname);
+		pfree(blockname);
+		blockname = psprintf("block.attr.%d.align", attnum);
+		attalignblocks[attnum] = LLVMAppendBasicBlock(deform_fn, blockname);
+		pfree(blockname);
+		blockname = psprintf("block.attr.%d.store", attnum);
+		attstoreblocks[attnum] = LLVMAppendBasicBlock(deform_fn, blockname);
+		pfree(blockname);
+		blockname = psprintf("block.attr.%d.out", attnum);
+		attoutblocks[attnum] = LLVMAppendBasicBlock(deform_fn, blockname);
+		pfree(blockname);
+	}
+
+	v_nvalid = LLVMBuildLoad(builder, v_nvalidp, "");
+
+	/* build switch to go from nvalid to the right startblock */
+	if (true)
+	{
+		LLVMValueRef v_switch = LLVMBuildSwitch(builder, v_nvalid,
+												deadblock, natts);
+		for (attnum = 0; attnum < natts; attnum++)
+		{
+			LLVMValueRef v_attno = LLVMConstInt(LLVMInt32Type(), attnum, false);
+			LLVMAddCase(v_switch, v_attno, attstartblocks[attnum]);
+		}
+
+	}
+	else
+	{
+		/* jump from entry block to first block */
+		LLVMBuildBr(builder, attstartblocks[0]);
+	}
+
+	LLVMPositionBuilderAtEnd(builder, deadblock);
+	LLVMBuildUnreachable(builder);
+
+	for (attnum = 0; attnum < natts; attnum++)
+	{
+		Form_pg_attribute att = TupleDescAttr(desc, attnum);
+		LLVMValueRef incby;
+		int alignto;
+		LLVMValueRef l_attno = LLVMConstInt(LLVMInt32Type(), attnum, false);
+		LLVMValueRef v_attdatap;
+		LLVMValueRef v_resultp;
+		LLVMValueRef v_islast;
+
+		/* build block checking whether we did all the necessary attributes */
+		LLVMPositionBuilderAtEnd(builder, attcheckattnoblocks[attnum]);
+
+		/*
+		 * Build phi node, unless first block. This can be reached from:
+		 * - store block of last attribute
+		 * - start block of last attribute if null
+		 */
+		if (lastcouldbenull)
+		{
+			LLVMValueRef incoming_values[] =
+				{v_off, v_off_inc};
+			LLVMBasicBlockRef incoming_blocks[] =
+				{attisnullblocks[attnum - 1], attstoreblocks[attnum - 1]};
+			v_off = LLVMBuildPhi(builder, LLVMInt32Type(), "off");
+			LLVMAddIncoming(v_off,
+							incoming_values, incoming_blocks,
+							lengthof(incoming_blocks));
+		}
+		else
+		{
+			v_off = v_off_inc;
+		}
+
+		/* check if done */
+		v_islast = LLVMBuildICmp(builder, LLVMIntEQ,
+								 LLVMConstInt(LLVMInt16Type(), attnum, false),
+								 v_maxatt, "");
+		LLVMBuildCondBr(
+			builder,
+			v_islast,
+			attoutblocks[attnum], attstartblocks[attnum]);
+
+		/* build block to jump out */
+		LLVMPositionBuilderAtEnd(builder, attoutblocks[attnum]);
+		LLVMBuildStore(builder, LLVMConstInt(LLVMInt32Type(), attnum, false), v_nvalidp);
+		LLVMBuildStore(builder, v_off, v_slotoffp);
+		LLVMBuildRetVoid(builder);
+
+		LLVMPositionBuilderAtEnd(builder, attstartblocks[attnum]);
+
+		/*
+		 * This block can be reached because
+		 * - we've been directly jumped through to continue deforming
+		 * - this attribute's checkattno block
+		 * Build the appropriate phi node.
+		 */
+		{
+			LLVMValueRef incoming_values[] =
+				{v_off_start, v_off};
+			LLVMBasicBlockRef incoming_blocks[] =
+				{entry, attcheckattnoblocks[attnum]};
+
+			v_off = LLVMBuildPhi(builder, LLVMInt32Type(), "off");
+			LLVMAddIncoming(v_off,
+							incoming_values, incoming_blocks,
+							lengthof(incoming_blocks));
+		}
+
+		/* check for nulls if necessary */
+		if (!att->attnotnull)
+		{
+			LLVMBasicBlockRef blockifnotnull;
+			LLVMBasicBlockRef blockifnull;
+			LLVMBasicBlockRef blocknext;
+			LLVMValueRef attisnull;
+			LLVMValueRef v_nullbyteno;
+			LLVMValueRef v_nullbytemask;
+			LLVMValueRef v_nullbyte;
+			LLVMValueRef v_nullbit;
+
+			blockifnotnull = attcheckalignblocks[attnum];
+			blockifnull = attisnullblocks[attnum];
+
+			if (attnum + 1 == natts)
+				blocknext = outblock;
+			else
+				blocknext = attcheckattnoblocks[attnum + 1];
+
+			/* FIXME: replace with neg */
+			v_nullbyteno = LLVMConstInt(LLVMInt32Type(), attnum >> 3, false);
+			v_nullbytemask = LLVMConstInt(LLVMInt8Type(), 1 << ((attnum) & 0x07), false);
+			v_nullbyte = LLVMBuildLoad(
+				builder,
+				LLVMBuildGEP(builder, v_bits,
+							 &v_nullbyteno, 1, ""),
+				"attnullbyte");
+
+			v_nullbit = LLVMBuildICmp(
+				builder,
+				LLVMIntEQ,
+				LLVMBuildAnd(builder, v_nullbyte, v_nullbytemask, ""),
+				LLVMConstInt(LLVMInt8Type(), 0, false),
+				"attisnull");
+
+			attisnull = LLVMBuildAnd(builder, v_hasnulls, v_nullbit, "");
+
+			LLVMBuildCondBr(builder, attisnull, blockifnull, blockifnotnull);
+
+			LLVMPositionBuilderAtEnd(builder, blockifnull);
+
+			/* store null-byte */
+			LLVMBuildStore(builder,
+						   LLVMConstInt(LLVMInt8Type(), 1, false),
+						   LLVMBuildGEP(builder, v_tts_nulls, &l_attno, 1, ""));
+			/* store zero datum */
+			LLVMBuildStore(builder,
+						   LLVMConstInt(TypeSizeT, 0, false),
+						   LLVMBuildGEP(builder, v_tts_values, &l_attno, 1, ""));
+
+			LLVMBuildBr(builder, blocknext);
+
+			lastcouldbenull = true;
+		}
+		else
+		{
+			LLVMBuildBr(builder, attcheckalignblocks[attnum]);
+			lastcouldbenull = false;
+
+			/* yuck, dirty hack */
+			LLVMPositionBuilderAtEnd(builder, attisnullblocks[attnum]);
+			LLVMBuildBr(builder, attcheckalignblocks[attnum]);
+		}
+		LLVMPositionBuilderAtEnd(builder, attcheckalignblocks[attnum]);
+
+		/* perform alignment */
+		if (att->attalign == 'i')
+		{
+			alignto = ALIGNOF_INT;
+		}
+		else if (att->attalign == 'c')
+		{
+			alignto = 1;
+		}
+		else if (att->attalign == 'd')
+		{
+			alignto = ALIGNOF_DOUBLE;
+		}
+		else if (att->attalign == 's')
+		{
+			alignto = ALIGNOF_SHORT;
+		}
+		else
+		{
+			elog(ERROR, "unknown alignment");
+			alignto = 0;
+		}
+
+		if ((alignto > 1 &&
+			 (attcuralign < 0 || attcuralign != TYPEALIGN(alignto, attcuralign))))
+		{
+			LLVMValueRef v_off_aligned;
+			bool conditional_alignment;
+
+			/*
+			 * If varlena, do only alignment if not short varlena. Check if
+			 * the byte is padding for that.
+			 */
+			if (att->attlen == -1)
+			{
+				LLVMValueRef possible_padbyte;
+				LLVMValueRef ispad;
+				possible_padbyte =
+					LLVMBuildLoad(builder,
+								  LLVMBuildGEP(builder, v_tupdata_base, &v_off, 1, ""),
+								  "padbyte");
+				ispad =
+					LLVMBuildICmp(builder, LLVMIntEQ, possible_padbyte,
+								  LLVMConstInt(LLVMInt8Type(), 0, false),
+								  "ispadbyte");
+				LLVMBuildCondBr(builder, ispad,
+								attalignblocks[attnum],
+								attstoreblocks[attnum]);
+				conditional_alignment = true;
+			}
+			else
+			{
+				LLVMBuildBr(builder, attalignblocks[attnum]);
+				conditional_alignment = false;
+			}
+
+			LLVMPositionBuilderAtEnd(builder, attalignblocks[attnum]);
+
+			{
+				/* translation of alignment code (cf TYPEALIGN()) */
+
+				/* ((ALIGNVAL) - 1) */
+				LLVMValueRef alignval = LLVMConstInt(LLVMInt32Type(), alignto - 1, false);
+				/* ((uintptr_t) (LEN) + ((ALIGNVAL) - 1)) */
+				LLVMValueRef lh = LLVMBuildAdd(builder, v_off, alignval, "");
+				/* ~((uintptr_t) ((ALIGNVAL) - 1))*/
+				LLVMValueRef rh = LLVMConstInt(LLVMInt32Type(), ~(alignto - 1), false);
+
+				v_off_aligned = LLVMBuildAnd(builder, lh, rh, "aligned_offset");
+			}
+
+			LLVMBuildBr(builder, attstoreblocks[attnum]);
+			LLVMPositionBuilderAtEnd(builder, attstoreblocks[attnum]);
+
+			if (conditional_alignment)
+			{
+				LLVMValueRef incoming_values[] =
+					{v_off, v_off_aligned};
+				LLVMBasicBlockRef incoming_blocks[] =
+					{attcheckalignblocks[attnum], attalignblocks[attnum]};
+				v_off_inc = LLVMBuildPhi(builder, LLVMInt32Type(), "");
+				LLVMAddIncoming(v_off_inc,
+								incoming_values, incoming_blocks,
+								lengthof(incoming_values));
+			}
+			else
+			{
+				v_off_inc = v_off_aligned;
+			}
+		}
+		else
+		{
+			LLVMPositionBuilderAtEnd(builder, attcheckalignblocks[attnum]);
+			LLVMBuildBr(builder, attalignblocks[attnum]);
+			LLVMPositionBuilderAtEnd(builder, attalignblocks[attnum]);
+			LLVMBuildBr(builder, attstoreblocks[attnum]);
+			v_off_inc = v_off;
+		}
+		LLVMPositionBuilderAtEnd(builder, attstoreblocks[attnum]);
+
+
+		/* compute what following columns are aligned to */
+		if (att->attlen < 0)
+		{
+			/* can't guarantee any alignment after varlen field */
+			attcuralign = -1;
+		}
+		else if (att->attnotnull && attcuralign >= 0)
+		{
+			Assert(att->attlen > 0);
+			attcuralign += att->attlen;
+		}
+		else if (att->attnotnull)
+		{
+			/*
+			 * After a NOT NULL fixed-width column, alignment is
+			 * guaranteed to be the minimum of the forced alignment and
+			 * length.  XXX
+			 */
+			attcuralign = alignto + att->attlen;
+			Assert(attcuralign > 0);
+		}
+		else
+		{
+			//elog(LOG, "attnotnullreset: %d", attnum);
+			attcuralign = -1;
+		}
+
+		/* compute address to load data from */
+		v_attdatap =
+			LLVMBuildGEP(builder, v_tupdata_base, &v_off_inc, 1, "");
+
+		/* compute address to store value at */
+		v_resultp = LLVMBuildGEP(builder, v_tts_values, &l_attno, 1, "");
+
+		/* store null-byte (false) */
+		LLVMBuildStore(builder,
+					   LLVMConstInt(LLVMInt8Type(), 0, false),
+					   LLVMBuildGEP(builder, v_tts_nulls, &l_attno, 1, ""));
+
+		if (att->attbyval)
+		{
+			LLVMValueRef tmp_loaddata;
+			LLVMTypeRef vartypep =
+				LLVMPointerType(LLVMIntType(att->attlen*8), 0);
+			tmp_loaddata =
+				LLVMBuildPointerCast(builder, v_attdatap, vartypep, "");
+			tmp_loaddata = LLVMBuildLoad(builder, tmp_loaddata, "attr_byval");
+			tmp_loaddata = LLVMBuildZExt(builder, tmp_loaddata, TypeSizeT, "");
+
+			LLVMBuildStore(builder, tmp_loaddata, v_resultp);
+		}
+		else
+		{
+			LLVMValueRef tmp_loaddata;
+
+			/* store pointer */
+			tmp_loaddata =
+				LLVMBuildPtrToInt(builder,
+								  v_attdatap,
+								  TypeSizeT,
+								  "attr_ptr");
+			LLVMBuildStore(builder, tmp_loaddata, v_resultp);
+		}
+
+		/* increment data pointer */
+		if (att->attlen > 0)
+		{
+			incby = LLVMConstInt(LLVMInt32Type(), att->attlen, false);
+		}
+		else if (att->attlen == -1)
+		{
+			incby =
+				LLVMBuildCall(builder, l_varsize_any,
+							  &v_attdatap, 1,
+							  "varsize_any");
+			{
+				char argname[] = "readonly";
+				LLVMAttributeRef ref =
+					LLVMCreateStringAttribute(LLVMGetGlobalContext(), argname, strlen(argname), NULL, 0);
+				LLVMAddCallSiteAttribute(incby, LLVMAttributeFunctionIndex, ref);
+			}
+			incby = LLVMBuildTrunc(builder, incby,
+								   LLVMInt32Type(), "");
+		}
+		else if (att->attlen == -2)
+		{
+			incby = LLVMBuildCall(builder, l_strlen, &v_attdatap, 1, "strlen");
+			incby = LLVMBuildTrunc(builder, incby,
+								   LLVMInt32Type(), "");
+			/* add 1 for NULL byte */
+			incby =
+				LLVMBuildAdd(builder, incby,
+							 LLVMConstInt(LLVMInt32Type(), 1, false), "");
+		}
+		else
+		{
+			Assert(false);
+			incby = NULL; /* silence compiler */
+		}
+
+		v_off_inc = LLVMBuildAdd(builder, v_off_inc, incby, "increment_offset");
+
+		/*
+		 * jump to next block, unless last possible column, or all desired
+		 * (available) attributes have been fetched.
+		 */
+		if (attnum + 1 == natts)
+		{
+			LLVMBuildBr(builder, outblock);
+		}
+		else
+		{
+			LLVMBuildBr(builder, attcheckattnoblocks[attnum + 1]);
+		}
+	}
+
+	/* jump out */
+	LLVMPositionBuilderAtEnd(builder, outblock);
+	LLVMBuildStore(builder, LLVMBuildZExt(builder, v_maxatt, LLVMInt32Type(), ""), v_nvalidp);
+	LLVMBuildStore(builder, v_off, v_slotoffp);
+	LLVMBuildRetVoid(builder);
+
+	LLVMDisposeBuilder(builder);
+
+	return deform_fn;
+}
+#endif
diff --git a/src/backend/executor/execExprCompile.c b/src/backend/executor/execExprCompile.c
index d41405b648..79b3ebd6c4 100644
--- a/src/backend/executor/execExprCompile.c
+++ b/src/backend/executor/execExprCompile.c
@@ -504,23 +504,37 @@ ExecReadyCompiledExpr(ExprState *state, PlanState *parent)
 			case EEOP_OUTER_FETCHSOME:
 			case EEOP_SCAN_FETCHSOME:
 				{
+					TupleDesc desc = NULL;
 					LLVMValueRef v_slot;
 					LLVMBasicBlockRef b_fetch = LLVMInsertBasicBlock(opblocks[i + 1], "");
 					LLVMValueRef v_nvalid;
 
 					if (op->opcode == EEOP_INNER_FETCHSOME)
 					{
+						PlanState *is = innerPlanState(parent);
 
 						v_slot = v_innerslot;
 
+						if (is &&
+							is->ps_ResultTupleSlot &&
+							is->ps_ResultTupleSlot->tts_fixedTupleDescriptor)
+							desc = is->ps_ResultTupleSlot->tts_tupleDescriptor;
 					}
 					else if (op->opcode == EEOP_OUTER_FETCHSOME)
 					{
+						PlanState *os = outerPlanState(parent);
+
 						v_slot = v_outerslot;
+
+						if (os &&
+							os->ps_ResultTupleSlot &&
+							os->ps_ResultTupleSlot->tts_fixedTupleDescriptor)
+							desc = os->ps_ResultTupleSlot->tts_tupleDescriptor;
 					}
 					else
 					{
 						v_slot = v_scanslot;
+						desc = parent ?  parent->scandesc : NULL;
 					}
 
 					/*
@@ -539,6 +553,28 @@ ExecReadyCompiledExpr(ExprState *state, PlanState *parent)
 						opblocks[i + 1], b_fetch);
 
 					LLVMPositionBuilderAtEnd(builder, b_fetch);
+
+					/*
+					 * If the tupledesc of the to-be-deformed tuple is known,
+					 * and JITing of deforming is enabled, build deform
+					 * function specific to tupledesc and the exact number of
+					 * to-be-extracted attributes.
+					 */
+					if (desc && jit_tuple_deforming)
+					{
+						LLVMValueRef params[2];
+						LLVMValueRef l_jit_deform;
+
+						l_jit_deform = slot_compile_deform(context,
+														   desc,
+														   op->d.fetch.last_var);
+						params[0] = v_slot;
+						params[1] = LLVMConstInt(LLVMInt16Type(), op->d.fetch.last_var, false);
+
+						LLVMBuildCall(builder, l_jit_deform, params, lengthof(params), "");
+
+					}
+					else
 					{
 						LLVMValueRef params[2];
 
diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c
index 78ec871f50..e5568b922e 100644
--- a/src/backend/executor/execTuples.c
+++ b/src/backend/executor/execTuples.c
@@ -121,6 +121,7 @@ MakeTupleTableSlot(TupleDesc tupleDesc)
 	slot->tts_mcxt = CurrentMemoryContext;
 	slot->tts_buffer = InvalidBuffer;
 	slot->tts_nvalid = 0;
+	slot->tts_off = 0;
 	slot->tts_values = NULL;
 	slot->tts_isnull = NULL;
 	slot->tts_mintuple = NULL;
@@ -358,6 +359,7 @@ ExecStoreTuple(HeapTuple tuple,
 
 	/* Mark extracted state invalid */
 	slot->tts_nvalid = 0;
+	slot->tts_off = 0;
 
 	/*
 	 * If tuple is on a disk page, keep the page pinned as long as we hold a
@@ -431,6 +433,7 @@ ExecStoreMinimalTuple(MinimalTuple mtup,
 
 	/* Mark extracted state invalid */
 	slot->tts_nvalid = 0;
+	slot->tts_off = 0;
 
 	return slot;
 }
@@ -477,6 +480,7 @@ ExecClearTuple(TupleTableSlot *slot)	/* slot in which to store tuple */
 	 */
 	slot->tts_isempty = true;
 	slot->tts_nvalid = 0;
+	slot->tts_off = 0;
 
 	return slot;
 }
@@ -776,6 +780,7 @@ ExecMaterializeSlot(TupleTableSlot *slot)
 	 * that we have not pfree'd tts_mintuple, if there is one.)
 	 */
 	slot->tts_nvalid = 0;
+	slot->tts_off = 0;
 
 	/*
 	 * On the same principle of not depending on previous remote storage,
diff --git a/src/backend/lib/llvmjit.c b/src/backend/lib/llvmjit.c
index 460cb6b325..e05fe2dd72 100644
--- a/src/backend/lib/llvmjit.c
+++ b/src/backend/lib/llvmjit.c
@@ -293,7 +293,7 @@ llvm_create_types(void)
 		members[11] = LLVMPointerType(LLVMInt8Type(), 0); /* nulls */
 		members[12] = LLVMPointerType(StructMinimalTupleData, 0); /* mintuple */
 		members[13] = StructHeapTupleData; /* minhdr */
-		members[14] = LLVMInt64Type(); /* off: FIXME, deterministic type, not long */
+		members[14] = LLVMInt32Type(); /* off */
 
 		StructTupleTableSlot = LLVMStructCreateNamed(LLVMGetGlobalContext(),
 													 "struct.TupleTableSlot");
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 9a80ecedc2..4cc9f305a2 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -41,6 +41,7 @@
 #include "commands/vacuum.h"
 #include "commands/variable.h"
 #include "commands/trigger.h"
+#include "executor/executor.h"
 #include "funcapi.h"
 #include "lib/llvmjit.h"
 #include "libpq/auth.h"
@@ -1031,6 +1032,17 @@ static struct config_bool ConfigureNamesBool[] =
 		NULL, NULL, NULL
 	},
 
+	{
+		{"jit_tuple_deforming", PGC_USERSET, DEVELOPER_OPTIONS,
+			gettext_noop("just-in-time compile tuple deforming"),
+			NULL,
+			GUC_NOT_IN_SAMPLE
+		},
+		&jit_tuple_deforming,
+		false,
+		NULL, NULL, NULL
+	},
+
 #endif
 
 	{
diff --git a/src/include/executor/executor.h b/src/include/executor/executor.h
index 4de4bf4035..ab2df96ca0 100644
--- a/src/include/executor/executor.h
+++ b/src/include/executor/executor.h
@@ -91,6 +91,7 @@ extern PGDLLIMPORT ExecutorCheckPerms_hook_type ExecutorCheckPerms_hook;
 /* GUC variables for JITing */
 #ifdef USE_LLVM
 extern bool jit_expressions;
+extern bool jit_tuple_deforming;
 #endif
 
 /*
diff --git a/src/include/executor/tuptable.h b/src/include/executor/tuptable.h
index 6c24fd334d..475b2bdcef 100644
--- a/src/include/executor/tuptable.h
+++ b/src/include/executor/tuptable.h
@@ -126,7 +126,7 @@ typedef struct TupleTableSlot
 	bool	   *tts_isnull;		/* current per-attribute isnull flags */
 	MinimalTuple tts_mintuple;	/* minimal tuple, or NULL if none */
 	HeapTupleData tts_minhdr;	/* workspace for minimal-tuple-only case */
-	long		tts_off;		/* saved state for slot_deform_tuple */
+	int32		tts_off;		/* saved state for slot_deform_tuple */
 	bool		tts_fixedTupleDescriptor;
 } TupleTableSlot;
 
diff --git a/src/include/lib/llvmjit.h b/src/include/lib/llvmjit.h
index 9711d398ca..61d7c67d6f 100644
--- a/src/include/lib/llvmjit.h
+++ b/src/include/lib/llvmjit.h
@@ -9,6 +9,7 @@
 #undef PM
 
 #include "nodes/pg_list.h"
+#include "access/tupdesc.h"
 
 #include <llvm-c/Core.h>
 #include <llvm-c/Core.h>
@@ -70,6 +71,8 @@ extern void llvm_shutdown_perf_support(LLVMExecutionEngineRef EE);
 extern void llvm_perf_orc_support(LLVMOrcJITStackRef llvm_orc);
 extern void llvm_shutdown_orc_perf_support(LLVMOrcJITStackRef llvm_orc);
 
+extern LLVMValueRef slot_compile_deform(struct LLVMJitContext *context, TupleDesc desc, int natts);
+
 #else
 
 struct LLVMJitContext;
@@ -79,4 +82,7 @@ typedef struct LLVMJitContext LLVMJitContext;
 
 extern void llvm_release_handle(ResourceOwner resowner, Datum handle);
 
+
+struct LLVMJitContext;
+
 #endif /* LLVMJIT_H */
-- 
2.14.1.2.g4274c698f4.dirty

0015-WIP-Expression-based-agg-transition.patchtext/x-diff; charset=us-asciiDownload
From 343c747ac083bab9a3582b043af1c8615d2eeee7 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 30 Aug 2017 21:16:56 -0700
Subject: [PATCH 15/16] WIP: Expression based agg transition.

Todo:
- Split EEOP_AGG_PLAIN_TRANS into lifetime caring/not variant
- Fix memory lifetime for JITed
---
 src/backend/executor/execExpr.c        | 289 ++++++++++++++++++
 src/backend/executor/execExprCompile.c | 357 ++++++++++++++++++++++
 src/backend/executor/execExprInterp.c  | 223 ++++++++++++++
 src/backend/executor/nodeAgg.c         | 534 ++++++---------------------------
 src/backend/lib/llvmjit.c              |  13 +
 src/include/executor/execExpr.h        |  69 +++++
 src/include/executor/executor.h        |   2 +
 src/include/executor/nodeAgg.h         | 308 +++++++++++++++++++
 src/include/lib/llvmjit.h              |   1 +
 src/include/nodes/execnodes.h          |   5 +
 10 files changed, 1351 insertions(+), 450 deletions(-)

diff --git a/src/backend/executor/execExpr.c b/src/backend/executor/execExpr.c
index e6ffe6e062..29aa8718fc 100644
--- a/src/backend/executor/execExpr.c
+++ b/src/backend/executor/execExpr.c
@@ -43,6 +43,7 @@
 #include "optimizer/planner.h"
 #include "pgstat.h"
 #include "utils/builtins.h"
+#include "utils/datum.h"
 #include "utils/lsyscache.h"
 #include "utils/typcache.h"
 
@@ -2532,6 +2533,294 @@ ExecInitArrayRef(ExprEvalStep *scratch, ArrayRef *aref, PlanState *parent,
 	}
 }
 
+static void
+ExecInitAggTransTrans(ExprState *state, AggState *aggstate, ExprEvalStep *scratch, FunctionCallInfo fcinfo,
+					  AggStatePerTrans pertrans, int transno, int setno, int setoff, bool ishash)
+{
+	int adjust_init_jumpnull = -1;
+	int adjust_strict_jumpnull = -1;
+	ExprContext *aggcontext;
+
+	if (ishash)
+		aggcontext = aggstate->hashcontext;
+	else
+		aggcontext = aggstate->aggcontexts[setno];
+
+	/*
+	 * If the initial value for the transition state doesn't exist in the
+	 * pg_aggregate table then we will let the first non-NULL value
+	 * returned from the outer procNode become the initial value. (This is
+	 * useful for aggregates like max() and min().) The noTransValue flag
+	 * signals that we still need to do this.
+	 */
+	if (pertrans->numSortCols == 0 &&
+		fcinfo->flinfo->fn_strict &&
+		pertrans->initValueIsNull)
+	{
+		scratch->opcode = EEOP_AGG_INIT_TRANS;
+		scratch->d.agg_init_trans.aggstate = aggstate;
+		scratch->d.agg_init_trans.pertrans = pertrans;
+		scratch->d.agg_init_trans.setno = setno;
+		scratch->d.agg_init_trans.setoff = setoff;
+		scratch->d.agg_init_trans.transno = transno;
+		scratch->d.agg_init_trans.aggcontext = aggcontext;
+		scratch->d.agg_init_trans.jumpnull = -1; /* adjust later */
+		ExprEvalPushStep(state, scratch);
+
+		adjust_init_jumpnull = state->steps_len - 1;
+	}
+
+	if (pertrans->numSortCols == 0 &&
+		fcinfo->flinfo->fn_strict)
+	{
+		scratch->opcode = EEOP_AGG_STRICT_TRANS_CHECK;
+		scratch->d.agg_strict_trans_check.aggstate = aggstate;
+		scratch->d.agg_strict_trans_check.setno = setno;
+		scratch->d.agg_strict_trans_check.setoff = setoff;
+		scratch->d.agg_strict_trans_check.transno = transno;
+		scratch->d.agg_strict_trans_check.jumpnull = -1; /* adjust later */
+		ExprEvalPushStep(state, scratch);
+
+		/*
+		 * Note, we don't push into adjust_bailout here - those jump
+		 * to the end of all transition value computations.
+		 */
+		adjust_strict_jumpnull = state->steps_len - 1;
+	}
+
+	if (pertrans->numSortCols == 0)
+	{
+		scratch->opcode = EEOP_AGG_PLAIN_TRANS;
+		scratch->d.agg_plain_trans.aggstate = aggstate;
+		scratch->d.agg_plain_trans.pertrans = pertrans;
+		scratch->d.agg_plain_trans.setno = setno;
+		scratch->d.agg_plain_trans.setoff = setoff;
+		scratch->d.agg_plain_trans.transno = transno;
+		scratch->d.agg_plain_trans.aggcontext = aggcontext;
+		ExprEvalPushStep(state, scratch);
+	}
+	else if (pertrans->numInputs == 1)
+	{
+		scratch->opcode = EEOP_AGG_ORDERED_TRANS_DATUM;
+		scratch->d.agg_ordered_trans.aggstate = aggstate;
+		scratch->d.agg_ordered_trans.pertrans = pertrans;
+		scratch->d.agg_ordered_trans.setno = setno;
+		scratch->d.agg_ordered_trans.setoff = setoff;
+		scratch->d.agg_ordered_trans.aggcontext = aggcontext;
+		ExprEvalPushStep(state, scratch);
+	}
+	else
+	{
+		scratch->opcode = EEOP_AGG_ORDERED_TRANS_TUPLE;
+		scratch->d.agg_ordered_trans.aggstate = aggstate;
+		scratch->d.agg_ordered_trans.pertrans = pertrans;
+		scratch->d.agg_ordered_trans.setno = setno;
+		scratch->d.agg_ordered_trans.setoff = setoff;
+		scratch->d.agg_ordered_trans.aggcontext = aggcontext;
+		ExprEvalPushStep(state, scratch);
+	}
+
+	if (adjust_init_jumpnull != -1 )
+	{
+		ExprEvalStep *as = &state->steps[adjust_init_jumpnull];
+		Assert(as->d.agg_init_trans.jumpnull == -1);
+		as->d.agg_init_trans.jumpnull = state->steps_len;
+	}
+
+	if (adjust_strict_jumpnull != -1 )
+	{
+		ExprEvalStep *as = &state->steps[adjust_strict_jumpnull];
+		Assert(as->d.agg_strict_trans_check.jumpnull == -1);
+		as->d.agg_strict_trans_check.jumpnull = state->steps_len;
+	}
+}
+
+ExprState *
+ExecInitAggTrans(AggState *aggstate, AggStatePerPhase phase,
+				 PlanState *parent, bool doSort, bool doHash)
+{
+	ExprState *state = makeNode(ExprState);
+	List *exprList = NIL;
+	ExprEvalStep scratch;
+	int transno = 0;
+	int setoff = 0;
+
+	state->expr = (Expr *) aggstate;
+
+	scratch.resvalue = &state->resvalue;
+	scratch.resnull = &state->resnull;
+
+	/*
+	 * First figure out which slots we're going to need. Out of expediency
+	 * build one list for all expressions and then use existing code :(
+	 */
+	for (transno = 0; transno < aggstate->numtrans; transno++)
+	{
+		AggStatePerTrans pertrans = &aggstate->pertrans[transno];
+
+		exprList = lappend(exprList, pertrans->aggref->aggdirectargs);
+		exprList = lappend(exprList, pertrans->aggref->args);
+		exprList = lappend(exprList, pertrans->aggref->aggorder);
+		exprList = lappend(exprList, pertrans->aggref->aggdistinct);
+		exprList = lappend(exprList, pertrans->aggref->aggfilter);
+	}
+	ExecInitExprSlots(state, (Node *) exprList);
+
+	/*
+	 * Emit instructions for each transition value / grouping set combination.
+	 */
+	for (transno = 0; transno < aggstate->numtrans; transno++)
+	{
+		AggStatePerTrans pertrans = &aggstate->pertrans[transno];
+		int			numInputs = pertrans->numInputs;
+		int			argno;
+		int			setno;
+		FunctionCallInfo fcinfo = &pertrans->transfn_fcinfo;
+		ListCell *arg, *bail;
+		List *adjust_bailout = NIL;
+		bool *strictnulls = NULL;
+
+		/*
+		 * If filter present, emit. Do so before evaluating the input, to
+		 * avoid potentially unneeded computations.
+		 */
+		if (pertrans->aggref->aggfilter)
+		{
+			/* evaluate filter expression */
+			ExecInitExprRec(pertrans->aggref->aggfilter, parent, state,
+							&state->resvalue, &state->resnull);
+			/* and jump out if false */
+			scratch.opcode = EEOP_AGG_FILTER;
+			scratch.d.agg_filter.jumpfalse = -1; /* adjust later */
+			ExprEvalPushStep(state, &scratch);
+			adjust_bailout = lappend_int(adjust_bailout,
+										 state->steps_len - 1);
+		}
+
+		/*
+		 * Evaluate aggregate input into the user of that information.
+		 */
+		argno = 0;
+		if (pertrans->numSortCols == 0)
+		{
+			strictnulls = fcinfo->argnull + 1;
+
+			foreach (arg, pertrans->aggref->args)
+			{
+				TargetEntry *source_tle = (TargetEntry *) lfirst(arg);
+
+				/* Start from 1, since the 0th arg will be the transition value */
+				ExecInitExprRec(source_tle->expr, parent, state,
+								&fcinfo->arg[argno + 1],
+								&fcinfo->argnull[argno + 1]);
+				argno++;
+			}
+		}
+		else if (pertrans->numInputs == 1)
+		{
+			TargetEntry *source_tle =
+				(TargetEntry *) linitial(pertrans->aggref->args);
+			Assert(list_length(pertrans->aggref->args) == 1);
+
+			ExecInitExprRec(source_tle->expr, parent, state,
+							&state->resvalue,
+							&state->resnull);
+			strictnulls = &state->resnull;
+			argno++;
+		}
+		else
+		{
+			Datum *values = pertrans->sortslot->tts_values;
+			bool *nulls = pertrans->sortslot->tts_isnull;
+
+			strictnulls = nulls;
+
+			foreach (arg, pertrans->aggref->args)
+			{
+				TargetEntry *source_tle = (TargetEntry *) lfirst(arg);
+
+				ExecInitExprRec(source_tle->expr, parent, state,
+								&values[argno], &nulls[argno]);
+				argno++;
+			}
+		}
+		Assert(numInputs == argno);
+
+		/*
+		 * For a strict transfn, nothing happens when there's a NULL input; we
+		 * just keep the prior transValue. This is true for both plain and
+		 * sorted/distinct aggregates.
+		 */
+		if (fcinfo->flinfo->fn_strict && numInputs > 0)
+		{
+			scratch.opcode = EEOP_AGG_STRICT_INPUT_CHECK;
+			scratch.d.agg_strict_input_check.nulls = strictnulls;
+			scratch.d.agg_strict_input_check.jumpnull = -1; /* adjust later */
+			scratch.d.agg_strict_input_check.nargs = numInputs;
+			ExprEvalPushStep(state, &scratch);
+			adjust_bailout = lappend_int(adjust_bailout,
+										 state->steps_len - 1);
+		}
+
+
+		/* and call transition function (once for each grouping set) */
+
+		setoff = 0;
+		if (doSort)
+		{
+			int processGroupingSets = Max(phase->numsets, 1);
+
+			for (setno = 0; setno < processGroupingSets; setno++)
+			{
+				ExecInitAggTransTrans(state, aggstate, &scratch, fcinfo, pertrans, transno, setno, setoff, false);
+				setoff++;
+			}
+		}
+
+		if (doHash)
+		{
+			int numHashes = aggstate->num_hashes;
+
+			if (aggstate->aggstrategy != AGG_HASHED)
+				setoff = aggstate->maxsets;
+			else
+				setoff = 0;
+
+			for (setno = 0; setno < numHashes; setno++)
+			{
+				ExecInitAggTransTrans(state, aggstate, &scratch, fcinfo, pertrans, transno, setno, setoff, true);
+				setoff++;
+			}
+		}
+
+		/* adjust early bail out jump target(s) */
+		foreach (bail, adjust_bailout)
+		{
+			ExprEvalStep *as = &state->steps[lfirst_int(bail)];
+			if (as->opcode == EEOP_AGG_FILTER)
+			{
+				Assert(as->d.agg_filter.jumpfalse == -1);
+				as->d.agg_filter.jumpfalse = state->steps_len;
+			}
+			else if (as->opcode == EEOP_AGG_STRICT_INPUT_CHECK)
+			{
+				Assert(as->d.agg_strict_input_check.jumpnull == -1);
+				as->d.agg_strict_input_check.jumpnull = state->steps_len;
+			}
+		}
+
+	}
+
+	scratch.resvalue = NULL;
+	scratch.resnull = NULL;
+	scratch.opcode = EEOP_DONE;
+	ExprEvalPushStep(state, &scratch);
+
+	ExecReadyExpr(state, parent);
+
+	return state;
+}
+
 /*
  * Helper for preparing ArrayRef expressions for evaluation: is expr a nested
  * FieldStore or ArrayRef that needs the old element value passed down?
diff --git a/src/backend/executor/execExprCompile.c b/src/backend/executor/execExprCompile.c
index 79b3ebd6c4..d0b943530c 100644
--- a/src/backend/executor/execExprCompile.c
+++ b/src/backend/executor/execExprCompile.c
@@ -23,6 +23,7 @@
 #include "catalog/objectaccess.h"
 #include "catalog/pg_type.h"
 #include "executor/execdebug.h"
+#include "executor/nodeAgg.h"
 #include "executor/nodeSubplan.h"
 #include "executor/execExpr.h"
 #include "funcapi.h"
@@ -273,6 +274,28 @@ BuildFunctionCall(LLVMJitContext *context, LLVMBuilderRef builder,
 	return v_retval;
 }
 
+static LLVMValueRef
+create_ExecAggInitGroup(LLVMModuleRef mod)
+{
+   LLVMTypeRef sig;
+   LLVMValueRef fn;
+   LLVMTypeRef param_types[3];
+   const char *nm = "ExecAggInitGroup";
+
+   fn = LLVMGetNamedFunction(mod, nm);
+   if (fn)
+	   return fn;
+
+   param_types[0] = LLVMPointerType(TypeSizeT, 0);
+   param_types[1] = LLVMPointerType(TypeSizeT, 0);
+   param_types[2] = LLVMPointerType(StructAggStatePerGroupData, 0);
+
+   sig = LLVMFunctionType(LLVMVoidType(), param_types, lengthof(param_types), 0);
+   fn = LLVMAddFunction(mod, nm, sig);
+
+   return fn;
+}
+
 static Datum
 ExecRunCompiledExpr(ExprState *state, ExprContext *econtext, bool *isNull)
 {
@@ -1446,6 +1469,8 @@ ExecReadyCompiledExpr(ExprState *state, PlanState *parent)
 			case EEOP_NULLTEST_ROWISNULL:
 			case EEOP_NULLTEST_ROWISNOTNULL:
 			case EEOP_WHOLEROW:
+			case EEOP_AGG_ORDERED_TRANS_DATUM:
+			case EEOP_AGG_ORDERED_TRANS_TUPLE:
 				{
 					LLVMValueRef v_params[3];
 					const char *funcname;
@@ -1502,6 +1527,10 @@ ExecReadyCompiledExpr(ExprState *state, PlanState *parent)
 						funcname = "ExecEvalAlternativeSubPlan";
 					else if (op->opcode == EEOP_WHOLEROW)
 						funcname = "ExecEvalWholeRowVar";
+					else if (op->opcode == EEOP_AGG_ORDERED_TRANS_DATUM)
+						funcname = "ExecEvalAggOrderedTransDatum";
+					else if (op->opcode == EEOP_AGG_ORDERED_TRANS_TUPLE)
+						funcname = "ExecEvalAggOrderedTransTuple";
 					else
 					{
 						Assert(false);
@@ -2346,6 +2375,334 @@ ExecReadyCompiledExpr(ExprState *state, PlanState *parent)
 
 					LLVMBuildBr(builder, opblocks[i + 1]);
 
+					break;
+				}
+			case EEOP_AGG_FILTER:
+				{
+					LLVMValueRef v_resnull, v_resvalue;
+					LLVMValueRef v_filtered;
+
+					v_resnull = LLVMBuildLoad(builder, v_resnullp, "");
+					v_resvalue = LLVMBuildLoad(builder, v_resvaluep, "");
+
+					v_filtered = LLVMBuildOr(
+						builder,
+						LLVMBuildICmp(
+							builder, LLVMIntEQ, v_resnull,
+							LLVMConstInt(LLVMInt8Type(), 1, false), ""),
+						LLVMBuildICmp(
+							builder, LLVMIntEQ, v_resvalue,
+							LLVMConstInt(TypeSizeT, 0, false), ""),
+						"");
+
+					LLVMBuildCondBr(
+						builder,
+						v_filtered,
+						opblocks[op->d.agg_filter.jumpfalse],
+						opblocks[i + 1]);
+
+					break;
+				}
+
+			case EEOP_AGG_STRICT_INPUT_CHECK:
+				{
+					int nargs = op->d.agg_strict_input_check.nargs;
+					bool *nulls = op->d.agg_strict_input_check.nulls;
+					int argno;
+
+					LLVMValueRef v_nullp;
+					LLVMBasicBlockRef *b_checknulls;
+
+					v_nullp = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(TypeSizeT, (uintptr_t) nulls, false),
+						LLVMPointerType(LLVMInt8Type(), 0),
+						"v_nullp");
+
+					/* create blocks for checking args */
+					b_checknulls = palloc(sizeof(LLVMBasicBlockRef *) * nargs);
+					for (argno = 0; argno < nargs; argno++)
+					{
+						b_checknulls[argno] = LLVMInsertBasicBlock(opblocks[i + 1], "check-null");
+					}
+
+					LLVMBuildBr(builder, b_checknulls[0]);
+
+					/* strict function, check for NULL args */
+					for (argno = 0; argno < nargs; argno++)
+					{
+						LLVMValueRef v_argno = LLVMConstInt(LLVMInt32Type(), argno, false);
+						LLVMValueRef v_argisnull;
+						LLVMBasicBlockRef b_argnotnull;
+
+						LLVMPositionBuilderAtEnd(builder, b_checknulls[argno]);
+
+						if (argno + 1 == nargs)
+							b_argnotnull = opblocks[i + 1];
+						else
+							b_argnotnull = b_checknulls[argno + 1];
+
+						v_argisnull = LLVMBuildLoad(
+							builder,
+							LLVMBuildGEP(
+								builder, v_nullp, &v_argno, 1, ""),
+							"");
+
+						LLVMBuildCondBr(
+							builder,
+							LLVMBuildICmp(builder, LLVMIntEQ, v_argisnull,
+										  LLVMConstInt(LLVMInt8Type(), 1, false), ""),
+							opblocks[op->d.agg_strict_input_check.jumpnull],
+							b_argnotnull);
+					}
+
+					break;
+				}
+
+			case EEOP_AGG_INIT_TRANS:
+				{
+					AggState *aggstate;
+					AggStatePerTrans pertrans;
+
+					LLVMValueRef v_aggstatep;
+					LLVMValueRef v_pertransp;
+
+					LLVMValueRef v_allpergroupspp;
+
+					LLVMValueRef v_pergroupp;
+
+					LLVMValueRef v_setoff, v_transno;
+
+					LLVMValueRef v_notransvalue;
+
+					LLVMBasicBlockRef b_init;
+
+					aggstate = op->d.agg_init_trans.aggstate;
+					pertrans = op->d.agg_init_trans.pertrans;
+
+					v_aggstatep =  LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(TypeSizeT, (intptr_t) aggstate, false),
+						LLVMPointerType(TypeSizeT, 0),
+						"");
+
+					v_pertransp = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(TypeSizeT, (intptr_t) pertrans, false),
+						LLVMPointerType(TypeSizeT, 0),
+						"");
+
+					v_allpergroupspp = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(TypeSizeT, (intptr_t) &aggstate->all_pergroups, false),
+						LLVMPointerType(LLVMPointerType(LLVMPointerType(StructAggStatePerGroupData, 0), 0), 0),
+						"aggstate.all_pergroups");
+
+					v_setoff = LLVMConstInt(LLVMInt32Type(), op->d.agg_init_trans.setoff, 0);
+					v_transno = LLVMConstInt(LLVMInt32Type(), op->d.agg_init_trans.transno, 0);
+
+					v_pergroupp = LLVMBuildGEP(
+						builder,
+						LLVMBuildLoad(
+							builder,
+							v_allpergroupspp,
+							""),
+						&v_setoff, 1, "");
+
+					v_pergroupp = LLVMBuildGEP(
+						builder,
+						LLVMBuildLoad(
+							builder,
+							v_pergroupp,
+							""),
+						&v_transno, 1, "");
+
+					v_notransvalue = LLVMBuildLoad(
+						builder,
+						LLVMBuildStructGEP(
+							builder, v_pergroupp, 2, "notransvalue"),
+						""
+						);
+
+					b_init = LLVMInsertBasicBlock(opblocks[i + 1], "inittrans");
+
+					LLVMBuildCondBr(
+						builder,
+						LLVMBuildICmp(builder, LLVMIntEQ, v_notransvalue,
+									  LLVMConstInt(LLVMInt8Type(), 1, false), ""),
+						b_init,
+						opblocks[i + 1]);
+
+					LLVMPositionBuilderAtEnd(builder, b_init);
+
+					{
+						LLVMValueRef params[3];
+
+						params[0] = v_aggstatep;
+						params[1] = v_pertransp;
+						params[2] = v_pergroupp;
+
+						LLVMBuildCall(
+							builder,
+							create_ExecAggInitGroup(mod),
+							params, lengthof(params),
+							"");
+					}
+					LLVMBuildBr(builder, opblocks[op->d.agg_init_trans.jumpnull]);
+
+					break;
+				}
+
+			case EEOP_AGG_STRICT_TRANS_CHECK:
+				{
+					LLVMBuildBr(
+						builder,
+						opblocks[i + 1]);
+					break;
+				}
+
+			case EEOP_AGG_PLAIN_TRANS:
+				{
+					AggState *aggstate;
+					AggStatePerTrans pertrans;
+					FunctionCallInfo fcinfo;
+
+					LLVMValueRef v_fcinfo_isnull;
+					LLVMValueRef v_argp, v_argnullp;
+
+					LLVMValueRef v_arg0p;
+					LLVMValueRef v_argnull0p;
+
+					LLVMValueRef v_transvaluep;
+					LLVMValueRef v_transnullp;
+
+					LLVMValueRef v_setno, v_setoff, v_transno;
+					LLVMValueRef v_aggcontext;
+
+					LLVMValueRef v_allpergroupsp;
+					LLVMValueRef v_current_setp;
+					LLVMValueRef v_current_pertransp;
+					LLVMValueRef v_curaggcontext;
+
+					LLVMValueRef v_pertransp;
+
+					LLVMValueRef v_pergroupp;
+					LLVMValueRef v_argno;
+
+
+					LLVMValueRef v_retval;
+
+					aggstate = op->d.agg_plain_trans.aggstate;
+					pertrans = op->d.agg_plain_trans.pertrans;
+
+					fcinfo = &pertrans->transfn_fcinfo;
+
+					v_argnullp = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(TypeSizeT, (uintptr_t) fcinfo->argnull, false),
+						LLVMPointerType(LLVMInt8Type(), 0),
+						"v_argnullp");
+
+					v_argp = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(TypeSizeT, (uintptr_t) fcinfo->arg, false),
+						LLVMPointerType(TypeSizeT, 0),
+						"v_arg");
+
+					v_setno = LLVMConstInt(LLVMInt32Type(), op->d.agg_plain_trans.setno, 0);
+					v_setoff = LLVMConstInt(LLVMInt32Type(), op->d.agg_plain_trans.setoff, 0);
+					v_transno = LLVMConstInt(LLVMInt32Type(), op->d.agg_plain_trans.transno, 0);
+					v_aggcontext = LLVMConstInt(LLVMInt64Type(), (uintptr_t)op->d.agg_plain_trans.aggcontext, 0);
+
+					v_pertransp = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(TypeSizeT, (uintptr_t) pertrans, false),
+						LLVMPointerType(TypeSizeT, 0),
+						"");
+
+					v_current_setp = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(TypeSizeT, (uintptr_t) &aggstate->current_set, false),
+						LLVMPointerType(LLVMInt32Type(), 0),
+						"aggstate.current_set");
+					v_curaggcontext = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(TypeSizeT, (uintptr_t) &aggstate->curaggcontext, false),
+						LLVMPointerType(TypeSizeT, 0),
+						"");
+					v_current_pertransp = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(TypeSizeT, (uintptr_t) &aggstate->curpertrans, false),
+						LLVMPointerType(LLVMPointerType(TypeSizeT, 0), 0),
+						"aggstate.curpertrans");
+
+					v_allpergroupsp = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(TypeSizeT, (uintptr_t) &aggstate->all_pergroups, false),
+						LLVMPointerType(LLVMPointerType(LLVMPointerType(StructAggStatePerGroupData, 0), 0), 0),
+						"aggstate.all_pergroups");
+
+					v_pergroupp = LLVMBuildGEP(
+						builder,
+						LLVMBuildLoad(
+							builder,
+							v_allpergroupsp,
+							""),
+						&v_setoff, 1, "setoff");
+
+					v_pergroupp = LLVMBuildGEP(
+						builder,
+						LLVMBuildLoad(
+							builder,
+							v_pergroupp,
+							""),
+						&v_transno, 1, "transno");
+
+					/* set aggstate globals */
+					LLVMBuildStore(builder, v_setno, v_current_setp);
+					LLVMBuildStore(builder, v_pertransp, v_current_pertransp);
+					LLVMBuildStore(builder, v_aggcontext, v_curaggcontext);
+
+					/* store transvalue in fcinfo->arg/argnull[0] */
+					v_argno = LLVMConstInt(LLVMInt32Type(), 0, false);
+					v_arg0p = LLVMBuildGEP(builder, v_argp, &v_argno, 1, "");
+					v_argnull0p = LLVMBuildGEP(builder, v_argnullp, &v_argno, 1, "");
+
+					v_transvaluep = LLVMBuildStructGEP(
+						builder, v_pergroupp, 0, "transvaluep");
+					v_transnullp = LLVMBuildStructGEP(
+						builder, v_pergroupp, 1, "transnullp");
+
+					LLVMBuildStore(
+						builder,
+						LLVMBuildLoad(
+							builder,
+							v_transvaluep,
+							"transvalue"),
+						v_arg0p);
+
+					LLVMBuildStore(
+						builder,
+						LLVMBuildLoad(
+							builder,
+							v_transnullp,
+							"transnull"),
+						v_argnull0p);
+
+					v_retval = BuildFunctionCall(context, builder, mod, fcinfo, &v_fcinfo_isnull);
+
+					/* retrieve trans value */
+					LLVMBuildStore(
+						builder,
+						v_retval,
+						v_transvaluep);
+					LLVMBuildStore(
+						builder,
+						v_fcinfo_isnull,
+						v_transnullp);
+
+					LLVMBuildBr(builder, opblocks[i + 1]);
+
 					break;
 				}
 
diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c
index df453b2ab4..a8e56f6f3a 100644
--- a/src/backend/executor/execExprInterp.c
+++ b/src/backend/executor/execExprInterp.c
@@ -64,12 +64,14 @@
 #include "executor/execExpr.h"
 #include "executor/nodeSubplan.h"
 #include "funcapi.h"
+#include "utils/memutils.h"
 #include "miscadmin.h"
 #include "nodes/nodeFuncs.h"
 #include "parser/parsetree.h"
 #include "pgstat.h"
 #include "utils/builtins.h"
 #include "utils/date.h"
+#include "utils/datum.h"
 #include "utils/lsyscache.h"
 #include "utils/timestamp.h"
 #include "utils/typcache.h"
@@ -358,6 +360,13 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull)
 		&&CASE_EEOP_WINDOW_FUNC,
 		&&CASE_EEOP_SUBPLAN,
 		&&CASE_EEOP_ALTERNATIVE_SUBPLAN,
+		&&CASE_EEOP_AGG_FILTER,
+		&&CASE_EEOP_AGG_STRICT_INPUT_CHECK,
+		&&CASE_EEOP_AGG_INIT_TRANS,
+		&&CASE_EEOP_AGG_STRICT_TRANS_CHECK,
+		&&CASE_EEOP_AGG_PLAIN_TRANS,
+		&&CASE_EEOP_AGG_ORDERED_TRANS_DATUM,
+		&&CASE_EEOP_AGG_ORDERED_TRANS_TUPLE,
 		&&CASE_EEOP_LAST
 	};
 
@@ -1461,6 +1470,171 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull)
 			EEO_NEXT();
 		}
 
+		EEO_CASE(EEOP_AGG_FILTER)
+		{
+			if (*op->resnull || !DatumGetBool(*op->resvalue))
+			{
+				Assert(op->d.agg_filter.jumpfalse != -1);
+				EEO_JUMP(op->d.agg_filter.jumpfalse);
+			}
+			else
+				EEO_NEXT();
+		}
+
+		EEO_CASE(EEOP_AGG_STRICT_INPUT_CHECK)
+		{
+			int argno;
+			bool *nulls = op->d.agg_strict_input_check.nulls;
+
+			Assert(op->d.agg_strict_input_check.jumpnull != -1);
+
+			for (argno = 0; argno < op->d.agg_strict_input_check.nargs; argno++)
+			{
+				if (nulls[argno])
+				{
+					EEO_JUMP(op->d.agg_strict_input_check.jumpnull);
+				}
+			}
+			EEO_NEXT();
+		}
+
+		EEO_CASE(EEOP_AGG_INIT_TRANS)
+		{
+			AggState *aggstate;
+			AggStatePerGroup pergroup;
+
+			aggstate = op->d.agg_init_trans.aggstate;
+			pergroup = &aggstate->all_pergroups
+				[op->d.agg_init_trans.setoff]
+				[op->d.agg_init_trans.transno];
+
+			if (pergroup->noTransValue)
+			{
+				AggStatePerTrans pertrans = op->d.agg_init_trans.pertrans;
+
+				aggstate->curaggcontext = op->d.agg_init_trans.aggcontext;
+				aggstate->current_set = op->d.agg_init_trans.setno;
+
+				ExecAggInitGroup(aggstate, pertrans, pergroup);
+
+				EEO_JUMP(op->d.agg_init_trans.jumpnull);
+			}
+
+			EEO_NEXT();
+		}
+
+		EEO_CASE(EEOP_AGG_STRICT_TRANS_CHECK)
+		{
+			AggState *aggstate;
+			AggStatePerGroup pergroup;
+
+			aggstate = op->d.agg_strict_trans_check.aggstate;
+			pergroup = &aggstate->all_pergroups
+				[op->d.agg_strict_trans_check.setoff]
+				[op->d.agg_strict_trans_check.transno];
+
+			Assert(op->d.agg_strict_trans_check.jumpnull != -1);
+
+			if (unlikely(pergroup->transValueIsNull))
+			{
+				elog(ERROR, "blarg");
+				EEO_JUMP(op->d.agg_strict_trans_check.jumpnull);
+			}
+			EEO_NEXT();
+		}
+
+		EEO_CASE(EEOP_AGG_PLAIN_TRANS)
+		{
+			AggState *aggstate;
+			AggStatePerTrans pertrans;
+			AggStatePerGroup pergroup;
+			FunctionCallInfo fcinfo;
+			MemoryContext oldContext;
+			Datum newVal;
+
+			aggstate = op->d.agg_plain_trans.aggstate;
+			pertrans = op->d.agg_plain_trans.pertrans;
+
+			pergroup = &aggstate->all_pergroups
+				[op->d.agg_plain_trans.setoff]
+				[op->d.agg_plain_trans.transno];
+
+			fcinfo = &pertrans->transfn_fcinfo;
+
+			/* cf. select_current_set() */
+			aggstate->curaggcontext = op->d.agg_plain_trans.aggcontext;
+			aggstate->current_set = op->d.agg_plain_trans.setno;
+
+			oldContext = MemoryContextSwitchTo(aggstate->tmpcontext->ecxt_per_tuple_memory);
+
+			/* set up aggstate->curpertrans for AggGetAggref() */
+			aggstate->curpertrans = pertrans;
+
+			fcinfo->arg[0] = pergroup->transValue;
+			fcinfo->argnull[0] = pergroup->transValueIsNull;
+			fcinfo->isnull = false;		/* just in case transfn doesn't set it */
+
+			newVal = FunctionCallInvoke(fcinfo);
+
+			/*
+			 * If pass-by-ref datatype, must copy the new value into aggcontext and
+			 * free the prior transValue.  But if transfn returned a pointer to its
+			 * first input, we don't need to do anything.  Also, if transfn returned a
+			 * pointer to a R/W expanded object that is already a child of the
+			 * aggcontext, assume we can adopt that value without copying it.
+			 */
+			if (!pertrans->transtypeByVal &&
+				DatumGetPointer(newVal) != DatumGetPointer(pergroup->transValue))
+			{
+				if (!fcinfo->isnull)
+				{
+					MemoryContextSwitchTo(aggstate->curaggcontext->ecxt_per_tuple_memory);
+					if (DatumIsReadWriteExpandedObject(newVal,
+													   false,
+													   pertrans->transtypeLen) &&
+						MemoryContextGetParent(DatumGetEOHP(newVal)->eoh_context) == CurrentMemoryContext)
+						/* do nothing */ ;
+					else
+						newVal = datumCopy(newVal,
+										   pertrans->transtypeByVal,
+										   pertrans->transtypeLen);
+				}
+				if (!pergroup->transValueIsNull)
+				{
+					if (DatumIsReadWriteExpandedObject(pergroup->transValue,
+													   false,
+													   pertrans->transtypeLen))
+						DeleteExpandedObject(pergroup->transValue);
+					else
+						pfree(DatumGetPointer(pergroup->transValue));
+				}
+			}
+
+
+			pergroup->transValue = newVal;
+			pergroup->transValueIsNull = fcinfo->isnull;
+
+			MemoryContextSwitchTo(oldContext);
+
+			EEO_NEXT();
+		}
+
+		EEO_CASE(EEOP_AGG_ORDERED_TRANS_DATUM)
+		{
+			/* too complex for an inline implementation */
+			ExecEvalAggOrderedTransDatum(state, op, econtext);
+
+			EEO_NEXT();
+		}
+
+		EEO_CASE(EEOP_AGG_ORDERED_TRANS_TUPLE)
+		{
+			/* too complex for an inline implementation */
+			ExecEvalAggOrderedTransTuple(state, op, econtext);
+
+			EEO_NEXT();
+		}
+
 		EEO_CASE(EEOP_LAST)
 		{
 			/* unreachable */
@@ -3539,3 +3713,52 @@ ExecEvalWholeRowVar(ExprState *state, ExprEvalStep *op, ExprContext *econtext)
 	*op->resvalue = PointerGetDatum(dtuple);
 	*op->resnull = false;
 }
+
+void
+ExecAggInitGroup(AggState *aggstate, AggStatePerTrans pertrans, AggStatePerGroup pergroup)
+{
+   FunctionCallInfo fcinfo = &pertrans->transfn_fcinfo;
+   MemoryContext oldContext;
+
+   /*
+	* transValue has not been initialized. This is the first non-NULL
+	* input value. We use it as the initial value for transValue. (We
+	* already checked that the agg's input type is binary-compatible
+	* with its transtype, so straight copy here is OK.)
+	*
+	* We must copy the datum into aggcontext if it is pass-by-ref. We
+	* do not need to pfree the old transValue, since it's NULL.
+	*/
+   oldContext = MemoryContextSwitchTo(
+	   aggstate->curaggcontext->ecxt_per_tuple_memory);
+   pergroup->transValue = datumCopy(fcinfo->arg[1],
+									pertrans->transtypeByVal,
+									pertrans->transtypeLen);
+   pergroup->transValueIsNull = false;
+   pergroup->noTransValue = false;
+   MemoryContextSwitchTo(oldContext);
+}
+
+
+void
+ExecEvalAggOrderedTransDatum(ExprState *state, ExprEvalStep *op,
+							 ExprContext *econtext)
+{
+	AggStatePerTrans pertrans = op->d.agg_plain_trans.pertrans;
+	int setno = op->d.agg_plain_trans.setno;
+
+	tuplesort_putdatum(pertrans->sortstates[setno],
+					   *op->resvalue, *op->resnull);
+}
+
+void ExecEvalAggOrderedTransTuple(ExprState *state, ExprEvalStep *op,
+								  ExprContext *econtext)
+{
+	AggStatePerTrans pertrans = op->d.agg_plain_trans.pertrans;
+	int setno = op->d.agg_plain_trans.setno;
+
+	ExecClearTuple(pertrans->sortslot);
+	pertrans->sortslot->tts_nvalid = pertrans->numInputs;
+	ExecStoreVirtualTuple(pertrans->sortslot);
+	tuplesort_puttupleslot(pertrans->sortstates[setno], pertrans->sortslot);
+}
diff --git a/src/backend/executor/nodeAgg.c b/src/backend/executor/nodeAgg.c
index a63c05cb68..3f3dadd2da 100644
--- a/src/backend/executor/nodeAgg.c
+++ b/src/backend/executor/nodeAgg.c
@@ -229,295 +229,6 @@
 #include "utils/datum.h"
 
 
-/*
- * AggStatePerTransData - per aggregate state value information
- *
- * Working state for updating the aggregate's state value, by calling the
- * transition function with an input row. This struct does not store the
- * information needed to produce the final aggregate result from the transition
- * state, that's stored in AggStatePerAggData instead. This separation allows
- * multiple aggregate results to be produced from a single state value.
- */
-typedef struct AggStatePerTransData
-{
-	/*
-	 * These values are set up during ExecInitAgg() and do not change
-	 * thereafter:
-	 */
-
-	/*
-	 * Link to an Aggref expr this state value is for.
-	 *
-	 * There can be multiple Aggref's sharing the same state value, as long as
-	 * the inputs and transition function are identical. This points to the
-	 * first one of them.
-	 */
-	Aggref	   *aggref;
-
-	/*
-	 * Nominal number of arguments for aggregate function.  For plain aggs,
-	 * this excludes any ORDER BY expressions.  For ordered-set aggs, this
-	 * counts both the direct and aggregated (ORDER BY) arguments.
-	 */
-	int			numArguments;
-
-	/*
-	 * Number of aggregated input columns.  This includes ORDER BY expressions
-	 * in both the plain-agg and ordered-set cases.  Ordered-set direct args
-	 * are not counted, though.
-	 */
-	int			numInputs;
-
-	/* offset of input columns in AggState->evalslot */
-	int			inputoff;
-
-	/*
-	 * Number of aggregated input columns to pass to the transfn.  This
-	 * includes the ORDER BY columns for ordered-set aggs, but not for plain
-	 * aggs.  (This doesn't count the transition state value!)
-	 */
-	int			numTransInputs;
-
-	/* Oid of the state transition or combine function */
-	Oid			transfn_oid;
-
-	/* Oid of the serialization function or InvalidOid */
-	Oid			serialfn_oid;
-
-	/* Oid of the deserialization function or InvalidOid */
-	Oid			deserialfn_oid;
-
-	/* Oid of state value's datatype */
-	Oid			aggtranstype;
-
-	/* ExprStates of the FILTER and argument expressions. */
-	ExprState  *aggfilter;		/* state of FILTER expression, if any */
-	List	   *aggdirectargs;	/* states of direct-argument expressions */
-
-	/*
-	 * fmgr lookup data for transition function or combine function.  Note in
-	 * particular that the fn_strict flag is kept here.
-	 */
-	FmgrInfo	transfn;
-
-	/* fmgr lookup data for serialization function */
-	FmgrInfo	serialfn;
-
-	/* fmgr lookup data for deserialization function */
-	FmgrInfo	deserialfn;
-
-	/* Input collation derived for aggregate */
-	Oid			aggCollation;
-
-	/* number of sorting columns */
-	int			numSortCols;
-
-	/* number of sorting columns to consider in DISTINCT comparisons */
-	/* (this is either zero or the same as numSortCols) */
-	int			numDistinctCols;
-
-	/* deconstructed sorting information (arrays of length numSortCols) */
-	AttrNumber *sortColIdx;
-	Oid		   *sortOperators;
-	Oid		   *sortCollations;
-	bool	   *sortNullsFirst;
-
-	/*
-	 * fmgr lookup data for input columns' equality operators --- only
-	 * set/used when aggregate has DISTINCT flag.  Note that these are in
-	 * order of sort column index, not parameter index.
-	 */
-	FmgrInfo   *equalfns;		/* array of length numDistinctCols */
-
-	/*
-	 * initial value from pg_aggregate entry
-	 */
-	Datum		initValue;
-	bool		initValueIsNull;
-
-	/*
-	 * We need the len and byval info for the agg's input and transition data
-	 * types in order to know how to copy/delete values.
-	 *
-	 * Note that the info for the input type is used only when handling
-	 * DISTINCT aggs with just one argument, so there is only one input type.
-	 */
-	int16		inputtypeLen,
-				transtypeLen;
-	bool		inputtypeByVal,
-				transtypeByVal;
-
-	/*
-	 * Stuff for evaluation of aggregate inputs in cases where the aggregate
-	 * requires sorted input.  The arguments themselves will be evaluated via
-	 * AggState->evalslot/evalproj for all aggregates at once, but we only
-	 * want to sort the relevant columns for individual aggregates.
-	 */
-	TupleDesc	sortdesc;		/* descriptor of input tuples */
-
-	/*
-	 * Slots for holding the evaluated input arguments.  These are set up
-	 * during ExecInitAgg() and then used for each input row requiring
-	 * processing besides what's done in AggState->evalproj.
-	 */
-	TupleTableSlot *sortslot;	/* current input tuple */
-	TupleTableSlot *uniqslot;	/* used for multi-column DISTINCT */
-
-	/*
-	 * These values are working state that is initialized at the start of an
-	 * input tuple group and updated for each input tuple.
-	 *
-	 * For a simple (non DISTINCT/ORDER BY) aggregate, we just feed the input
-	 * values straight to the transition function.  If it's DISTINCT or
-	 * requires ORDER BY, we pass the input values into a Tuplesort object;
-	 * then at completion of the input tuple group, we scan the sorted values,
-	 * eliminate duplicates if needed, and run the transition function on the
-	 * rest.
-	 *
-	 * We need a separate tuplesort for each grouping set.
-	 */
-
-	Tuplesortstate **sortstates;	/* sort objects, if DISTINCT or ORDER BY */
-
-	/*
-	 * This field is a pre-initialized FunctionCallInfo struct used for
-	 * calling this aggregate's transfn.  We save a few cycles per row by not
-	 * re-initializing the unchanging fields; which isn't much, but it seems
-	 * worth the extra space consumption.
-	 */
-	FunctionCallInfoData transfn_fcinfo;
-
-	/* Likewise for serialization and deserialization functions */
-	FunctionCallInfoData serialfn_fcinfo;
-
-	FunctionCallInfoData deserialfn_fcinfo;
-}			AggStatePerTransData;
-
-/*
- * AggStatePerAggData - per-aggregate information
- *
- * This contains the information needed to call the final function, to produce
- * a final aggregate result from the state value. If there are multiple
- * identical Aggrefs in the query, they can all share the same per-agg data.
- *
- * These values are set up during ExecInitAgg() and do not change thereafter.
- */
-typedef struct AggStatePerAggData
-{
-	/*
-	 * Link to an Aggref expr this state value is for.
-	 *
-	 * There can be multiple identical Aggref's sharing the same per-agg. This
-	 * points to the first one of them.
-	 */
-	Aggref	   *aggref;
-
-	/* index to the state value which this agg should use */
-	int			transno;
-
-	/* Optional Oid of final function (may be InvalidOid) */
-	Oid			finalfn_oid;
-
-	/*
-	 * fmgr lookup data for final function --- only valid when finalfn_oid oid
-	 * is not InvalidOid.
-	 */
-	FmgrInfo	finalfn;
-
-	/*
-	 * Number of arguments to pass to the finalfn.  This is always at least 1
-	 * (the transition state value) plus any ordered-set direct args. If the
-	 * finalfn wants extra args then we pass nulls corresponding to the
-	 * aggregated input columns.
-	 */
-	int			numFinalArgs;
-
-	/*
-	 * We need the len and byval info for the agg's result data type in order
-	 * to know how to copy/delete values.
-	 */
-	int16		resulttypeLen;
-	bool		resulttypeByVal;
-
-}			AggStatePerAggData;
-
-/*
- * AggStatePerGroupData - per-aggregate-per-group working state
- *
- * These values are working state that is initialized at the start of
- * an input tuple group and updated for each input tuple.
- *
- * In AGG_PLAIN and AGG_SORTED modes, we have a single array of these
- * structs (pointed to by aggstate->pergroup); we re-use the array for
- * each input group, if it's AGG_SORTED mode.  In AGG_HASHED mode, the
- * hash table contains an array of these structs for each tuple group.
- *
- * Logically, the sortstate field belongs in this struct, but we do not
- * keep it here for space reasons: we don't support DISTINCT aggregates
- * in AGG_HASHED mode, so there's no reason to use up a pointer field
- * in every entry of the hashtable.
- */
-typedef struct AggStatePerGroupData
-{
-	Datum		transValue;		/* current transition value */
-	bool		transValueIsNull;
-
-	bool		noTransValue;	/* true if transValue not set yet */
-
-	/*
-	 * Note: noTransValue initially has the same value as transValueIsNull,
-	 * and if true both are cleared to false at the same time.  They are not
-	 * the same though: if transfn later returns a NULL, we want to keep that
-	 * NULL and not auto-replace it with a later input value. Only the first
-	 * non-NULL input will be auto-substituted.
-	 */
-}			AggStatePerGroupData;
-
-/*
- * AggStatePerPhaseData - per-grouping-set-phase state
- *
- * Grouping sets are divided into "phases", where a single phase can be
- * processed in one pass over the input. If there is more than one phase, then
- * at the end of input from the current phase, state is reset and another pass
- * taken over the data which has been re-sorted in the mean time.
- *
- * Accordingly, each phase specifies a list of grouping sets and group clause
- * information, plus each phase after the first also has a sort order.
- */
-typedef struct AggStatePerPhaseData
-{
-	AggStrategy aggstrategy;	/* strategy for this phase */
-	int			numsets;		/* number of grouping sets (or 0) */
-	int		   *gset_lengths;	/* lengths of grouping sets */
-	Bitmapset **grouped_cols;	/* column groupings for rollup */
-	FmgrInfo   *eqfunctions;	/* per-grouping-field equality fns */
-	Agg		   *aggnode;		/* Agg node for phase data */
-	Sort	   *sortnode;		/* Sort node for input ordering for phase */
-}			AggStatePerPhaseData;
-
-/*
- * AggStatePerHashData - per-hashtable state
- *
- * When doing grouping sets with hashing, we have one of these for each
- * grouping set. (When doing hashing without grouping sets, we have just one of
- * them.)
- */
-typedef struct AggStatePerHashData
-{
-	TupleHashTable hashtable;	/* hash table with one entry per group */
-	TupleHashIterator hashiter; /* for iterating through hash table */
-	TupleTableSlot *hashslot;	/* slot for loading hash table */
-	FmgrInfo   *hashfunctions;	/* per-grouping-field hash fns */
-	FmgrInfo   *eqfunctions;	/* per-grouping-field equality fns */
-	int			numCols;		/* number of hash key columns */
-	int			numhashGrpCols; /* number of columns in hash table */
-	int			largestGrpColIdx;	/* largest col required for hashing */
-	AttrNumber *hashGrpColIdxInput; /* hash col indices in input slot */
-	AttrNumber *hashGrpColIdxHash;	/* indices in hashtbl tuples */
-	Agg		   *aggnode;		/* original Agg node, for numGroups etc. */
-}			AggStatePerHashData;
-
-
 static void select_current_set(AggState *aggstate, int setno, bool is_hash);
 static void initialize_phase(AggState *aggstate, int newphase);
 static TupleTableSlot *fetch_input_tuple(AggState *aggstate);
@@ -578,21 +289,6 @@ static int find_compatible_pertrans(AggState *aggstate, Aggref *newagg,
 						 List *transnos);
 
 
-/*
- * Select the current grouping set; affects current_set and
- * curaggcontext.
- */
-static void
-select_current_set(AggState *aggstate, int setno, bool is_hash)
-{
-	if (is_hash)
-		aggstate->curaggcontext = aggstate->hashcontext;
-	else
-		aggstate->curaggcontext = aggstate->aggcontexts[setno];
-
-	aggstate->current_set = setno;
-}
-
 /*
  * Switch to phase "newphase", which must either be 0 or 1 (to reset) or
  * current_phase + 1. Juggle the tuplesorts accordingly.
@@ -954,137 +650,12 @@ advance_transition_function(AggState *aggstate,
 static void
 advance_aggregates(AggState *aggstate, AggStatePerGroup *sort_pergroups, AggStatePerGroup *hash_pergroups)
 {
-	int			transno;
-	int			setno = 0;
-	int			numGroupingSets = Max(aggstate->phase->numsets, 1);
-	int			numHashes = aggstate->num_hashes;
-	int			numTrans = aggstate->numtrans;
-	TupleTableSlot *slot = aggstate->evalslot;
-	Datum	   *values = slot->tts_values;
-	bool	   *nulls = slot->tts_isnull;
-	AggStatePerTrans pertrans;
+	bool isnull;
 
-	/* compute input for all aggregates */
-	if (aggstate->evalproj)
-		aggstate->evalslot = ExecProject(aggstate->evalproj);
-
-	for (transno = 0, pertrans = &aggstate->pertrans[0];
-		 transno < numTrans; transno++, pertrans++)
-	{
-		ExprState  *filter = pertrans->aggfilter;
-		int			numTransInputs = pertrans->numTransInputs;
-		int			i;
-		int			inputoff = pertrans->inputoff;
-
-		/* Skip anything FILTERed out */
-		if (filter)
-		{
-			Datum		res;
-			bool		isnull;
-
-			res = ExecEvalExprSwitchContext(filter, aggstate->tmpcontext,
-											&isnull);
-			if (isnull || !DatumGetBool(res))
-				continue;
-		}
-
-		if (pertrans->numSortCols > 0)
-		{
-			/* DISTINCT and/or ORDER BY case */
-			Assert(slot->tts_nvalid >= (pertrans->numInputs + inputoff));
-			Assert(!hash_pergroups);
-
-			/*
-			 * If the transfn is strict, we want to check for nullity before
-			 * storing the row in the sorter, to save space if there are a lot
-			 * of nulls.  Note that we must only check numTransInputs columns,
-			 * not numInputs, since nullity in columns used only for sorting
-			 * is not relevant here.
-			 */
-			if (pertrans->transfn.fn_strict)
-			{
-				for (i = 0; i < numTransInputs; i++)
-				{
-					if (slot->tts_isnull[i + inputoff])
-						break;
-				}
-				if (i < numTransInputs)
-					continue;
-			}
-
-			for (setno = 0; setno < numGroupingSets; setno++)
-			{
-				/* OK, put the tuple into the tuplesort object */
-				if (pertrans->numInputs == 1)
-					tuplesort_putdatum(pertrans->sortstates[setno],
-									   values[inputoff], nulls[inputoff]);
-				else
-				{
-					/*
-					 * Copy slot contents, starting from inputoff, into sort
-					 * slot.
-					 */
-					ExecClearTuple(pertrans->sortslot);
-					memcpy(pertrans->sortslot->tts_values,
-						   &values[inputoff],
-						   pertrans->numInputs * sizeof(Datum));
-					memcpy(pertrans->sortslot->tts_isnull,
-						   &nulls[inputoff],
-						   pertrans->numInputs * sizeof(bool));
-					pertrans->sortslot->tts_nvalid = pertrans->numInputs;
-					ExecStoreVirtualTuple(pertrans->sortslot);
-					tuplesort_puttupleslot(pertrans->sortstates[setno], pertrans->sortslot);
-				}
-			}
-		}
-		else
-		{
-			/* We can apply the transition function immediately */
-			FunctionCallInfo fcinfo = &pertrans->transfn_fcinfo;
-
-			/* Load values into fcinfo */
-			/* Start from 1, since the 0th arg will be the transition value */
-			Assert(slot->tts_nvalid >= (numTransInputs + inputoff));
-
-			for (i = 0; i < numTransInputs; i++)
-			{
-				fcinfo->arg[i + 1] = values[i + inputoff];
-				fcinfo->argnull[i + 1] = nulls[i + inputoff];
-			}
-
-			if (sort_pergroups)
-			{
-				/* advance transition states for ordered grouping  */
-
-				for (setno = 0; setno < numGroupingSets; setno++)
-				{
-					AggStatePerGroup pergroupstate;
-
-					select_current_set(aggstate, setno, false);
-
-					pergroupstate = &sort_pergroups[setno][transno];
-
-					advance_transition_function(aggstate, pertrans, pergroupstate);
-				}
-			}
-
-			if (hash_pergroups)
-			{
-				/* advance transition states for hashed grouping */
-
-				for (setno = 0; setno < numHashes; setno++)
-				{
-					AggStatePerGroup pergroupstate;
-
-					select_current_set(aggstate, setno, true);
-
-					pergroupstate = &hash_pergroups[setno][transno];
-
-					advance_transition_function(aggstate, pertrans, pergroupstate);
-				}
-			}
-		}
-	}
+	ExecEvalExprSwitchContext(aggstate->phase->evaltrans,
+							  aggstate->tmpcontext,
+							  &isnull);
+	return;
 }
 
 /*
@@ -2663,6 +2234,8 @@ ExecInitAgg(Agg *node, EState *estate, int eflags)
 	AggStatePerAgg peraggs;
 	AggStatePerTrans pertransstates;
 	AggStatePerTrans pertrans;
+	AggStatePerGroup *pergroups;
+	ExprContext **contexts;
 	Plan	   *outerPlan;
 	ExprContext *econtext;
 	int			numaggs,
@@ -2985,6 +2558,30 @@ ExecInitAgg(Agg *node, EState *estate, int eflags)
 	aggstate->peragg = peraggs;
 	aggstate->pertrans = pertransstates;
 
+
+	aggstate->all_pergroups =
+		(AggStatePerGroup *) palloc0(sizeof(AggStatePerGroup)
+									* (numGroupingSets + numHashes));
+	aggstate->all_contexts =
+		(ExprContext **) palloc0(sizeof(ExprContext *)
+									* (numGroupingSets + numHashes));
+	pergroups = aggstate->all_pergroups;
+	contexts = aggstate->all_contexts;
+
+	if (node->aggstrategy != AGG_HASHED)
+	{
+		for (i = 0; i < numGroupingSets; i++)
+		{
+			pergroups[i] = (AggStatePerGroup) palloc0(sizeof(AggStatePerGroupData)
+													 * numaggs);
+			contexts[i] = aggstate->aggcontexts[i];
+		}
+
+		aggstate->pergroups = pergroups;
+		pergroups += numGroupingSets;
+		contexts += numGroupingSets;
+	}
+
 	/*
 	 * Hashing can only appear in the initial phase.
 	 */
@@ -3001,28 +2598,13 @@ ExecInitAgg(Agg *node, EState *estate, int eflags)
 		}
 
 		/* this is an array of pointers, not structures */
-		aggstate->hash_pergroup = palloc0(sizeof(AggStatePerGroup) * numHashes);
+		aggstate->hash_pergroup = pergroups;
 
 		find_hash_columns(aggstate);
 		build_hash_table(aggstate);
 		aggstate->table_filled = false;
 	}
 
-	if (node->aggstrategy != AGG_HASHED)
-	{
-		AggStatePerGroup *pergroups =
-			(AggStatePerGroup*) palloc0(sizeof(AggStatePerGroup)
-										* numGroupingSets);
-
-		for (i = 0; i < numGroupingSets; i++)
-		{
-			pergroups[i] = (AggStatePerGroup) palloc0(sizeof(AggStatePerGroupData)
-													 * numaggs);
-		}
-
-		aggstate->pergroups = pergroups;
-	}
-
 	/*
 	 * Initialize current phase-dependent values to initial phase. The initial
 	 * phase is 1 (first sort pass) for all strategies that use sorting (if
@@ -3388,6 +2970,58 @@ ExecInitAgg(Agg *node, EState *estate, int eflags)
 												 NULL);
 	ExecSetSlotDescriptor(aggstate->evalslot, aggstate->evaldesc);
 
+	/*
+	 * Build expressions doing all the transition stuff at once. We build a
+	 * different one for each phase, as the number of transition function
+	 * invocation changes.
+	 */
+	for (phaseidx = 0; phaseidx < aggstate->numphases; phaseidx++)
+	{
+		AggStatePerPhase phase = &aggstate->phases[phaseidx];
+		bool dohash, dosort;
+
+		if (!phase->aggnode)
+			continue;
+
+		if (aggstate->aggstrategy == AGG_MIXED &&
+			phaseidx == 1)
+		{
+			dohash = true;
+			dosort = true;
+		}
+		else if (aggstate->aggstrategy == AGG_MIXED &&
+			phaseidx == 0)
+		{
+			dohash = true;
+			dosort = false;
+		}
+		else if (phase->aggstrategy == AGG_PLAIN ||
+				 phase->aggstrategy == AGG_SORTED)
+		{
+			dohash = false;
+			dosort = true;
+		}
+		else if (phase->aggstrategy == AGG_HASHED)
+		{
+			dohash = true;
+			dosort = false;
+		}
+		else if (phase->aggstrategy == AGG_MIXED)
+		{
+			dohash = true;
+			dosort = true;
+		}
+		else
+		{
+			elog(ERROR, "frak");
+		}
+
+		phase->evaltrans = ExecInitAggTrans(aggstate, phase,
+											&aggstate->ss.ps,
+											dosort, dohash);
+
+	}
+
 	return aggstate;
 }
 
diff --git a/src/backend/lib/llvmjit.c b/src/backend/lib/llvmjit.c
index e05fe2dd72..57d0663410 100644
--- a/src/backend/lib/llvmjit.c
+++ b/src/backend/lib/llvmjit.c
@@ -63,6 +63,7 @@ LLVMTypeRef StructFmgrInfo;
 LLVMTypeRef StructFunctionCallInfoData;
 LLVMTypeRef StructExprState;
 LLVMTypeRef StructExprContext;
+LLVMTypeRef StructAggStatePerGroupData;
 
 
 static LLVMTargetRef llvm_targetref;
@@ -381,6 +382,18 @@ llvm_create_types(void)
 		params[0] = LLVMPointerType(StructFunctionCallInfoData, 0);
 		TypePGFunction = LLVMFunctionType(TypeSizeT, params, lengthof(params), 0);
 	}
+
+	{
+		LLVMTypeRef members[3];
+
+		members[0] = TypeSizeT;
+		members[1] = LLVMInt8Type();
+		members[2] = LLVMInt8Type();
+
+		StructAggStatePerGroupData = LLVMStructCreateNamed(LLVMGetGlobalContext(),
+														   "struct.AggStatePerGroupData");
+		LLVMStructSetBody(StructAggStatePerGroupData, members, lengthof(members), false);
+	}
 }
 
 static uint64_t
diff --git a/src/include/executor/execExpr.h b/src/include/executor/execExpr.h
index 3919ac5598..661c18fcbe 100644
--- a/src/include/executor/execExpr.h
+++ b/src/include/executor/execExpr.h
@@ -15,6 +15,7 @@
 #define EXEC_EXPR_H
 
 #include "nodes/execnodes.h"
+#include "executor/nodeAgg.h"
 
 /* forward reference to avoid circularity */
 struct ArrayRefState;
@@ -207,6 +208,14 @@ typedef enum ExprEvalOp
 	EEOP_SUBPLAN,
 	EEOP_ALTERNATIVE_SUBPLAN,
 
+	EEOP_AGG_FILTER,
+	EEOP_AGG_STRICT_INPUT_CHECK,
+	EEOP_AGG_INIT_TRANS,
+	EEOP_AGG_STRICT_TRANS_CHECK,
+	EEOP_AGG_PLAIN_TRANS,
+	EEOP_AGG_ORDERED_TRANS_DATUM,
+	EEOP_AGG_ORDERED_TRANS_TUPLE,
+
 	/* non-existent operation, used e.g. to check array lengths */
 	EEOP_LAST
 } ExprEvalOp;
@@ -555,6 +564,58 @@ typedef struct ExprEvalStep
 			/* out-of-line state, created by nodeSubplan.c */
 			AlternativeSubPlanState *asstate;
 		}			alternative_subplan;
+
+		struct
+		{
+			int jumpfalse;
+		} agg_filter;
+
+		struct
+		{
+			bool *nulls;
+			int nargs;
+			int jumpnull;
+		} agg_strict_input_check;
+
+		struct
+		{
+			AggState *aggstate;
+			AggStatePerTrans pertrans;
+			ExprContext *aggcontext;
+			int setno;
+			int transno;
+			int setoff;
+			int jumpnull;
+		} agg_init_trans;
+
+		struct
+		{
+			AggState *aggstate;
+			int setno;
+			int transno;
+			int setoff;
+			int jumpnull;
+		} agg_strict_trans_check;
+
+		struct
+		{
+			AggState *aggstate;
+			AggStatePerTrans pertrans;
+			ExprContext *aggcontext;
+			int setno;
+			int transno;
+			int setoff;
+		} agg_plain_trans;
+
+		struct
+		{
+			AggState *aggstate;
+			AggStatePerTrans pertrans;
+			ExprContext *aggcontext;
+			int setno;
+			int transno;
+			int setoff;
+		} agg_ordered_trans;
 	}			d;
 } ExprEvalStep;
 
@@ -648,4 +709,12 @@ extern void ExecEvalAlternativeSubPlan(ExprState *state, ExprEvalStep *op,
 extern void ExecEvalWholeRowVar(ExprState *state, ExprEvalStep *op,
 					ExprContext *econtext);
 
+extern void ExecEvalAggOrderedTransDatum(ExprState *state, ExprEvalStep *op,
+										 ExprContext *econtext);
+extern void ExecEvalAggOrderedTransTuple(ExprState *state, ExprEvalStep *op,
+										 ExprContext *econtext);
+
+
+extern void ExecAggInitGroup(AggState *aggstate, AggStatePerTrans pertrans, AggStatePerGroup pergroup);
+
 #endif							/* EXEC_EXPR_H */
diff --git a/src/include/executor/executor.h b/src/include/executor/executor.h
index ab2df96ca0..af2dfcc287 100644
--- a/src/include/executor/executor.h
+++ b/src/include/executor/executor.h
@@ -264,6 +264,8 @@ extern ExprState *ExecInitExpr(Expr *node, PlanState *parent);
 extern ExprState *ExecInitQual(List *qual, PlanState *parent);
 extern ExprState *ExecInitCheck(List *qual, PlanState *parent);
 extern List *ExecInitExprList(List *nodes, PlanState *parent);
+extern ExprState *ExecInitAggTrans(AggState *aggstate, struct AggStatePerPhaseData *phase,
+								   PlanState *parent, bool doSort, bool doHash);
 extern ProjectionInfo *ExecBuildProjectionInfo(List *targetList,
 						ExprContext *econtext,
 						TupleTableSlot *slot,
diff --git a/src/include/executor/nodeAgg.h b/src/include/executor/nodeAgg.h
index eff5af9c2a..3932bd8270 100644
--- a/src/include/executor/nodeAgg.h
+++ b/src/include/executor/nodeAgg.h
@@ -16,6 +16,297 @@
 
 #include "nodes/execnodes.h"
 
+
+/*
+ * AggStatePerTransData - per aggregate state value information
+ *
+ * Working state for updating the aggregate's state value, by calling the
+ * transition function with an input row. This struct does not store the
+ * information needed to produce the final aggregate result from the transition
+ * state, that's stored in AggStatePerAggData instead. This separation allows
+ * multiple aggregate results to be produced from a single state value.
+ */
+typedef struct AggStatePerTransData
+{
+	/*
+	 * These values are set up during ExecInitAgg() and do not change
+	 * thereafter:
+	 */
+
+	/*
+	 * Link to an Aggref expr this state value is for.
+	 *
+	 * There can be multiple Aggref's sharing the same state value, as long as
+	 * the inputs and transition function are identical. This points to the
+	 * first one of them.
+	 */
+	Aggref	   *aggref;
+
+	/*
+	 * Nominal number of arguments for aggregate function.  For plain aggs,
+	 * this excludes any ORDER BY expressions.  For ordered-set aggs, this
+	 * counts both the direct and aggregated (ORDER BY) arguments.
+	 */
+	int			numArguments;
+
+	/*
+	 * Number of aggregated input columns.  This includes ORDER BY expressions
+	 * in both the plain-agg and ordered-set cases.  Ordered-set direct args
+	 * are not counted, though.
+	 */
+	int			numInputs;
+
+	/* offset of input columns in AggState->evalslot */
+	int			inputoff;
+
+	/*
+	 * Number of aggregated input columns to pass to the transfn.  This
+	 * includes the ORDER BY columns for ordered-set aggs, but not for plain
+	 * aggs.  (This doesn't count the transition state value!)
+	 */
+	int			numTransInputs;
+
+	/* Oid of the state transition or combine function */
+	Oid			transfn_oid;
+
+	/* Oid of the serialization function or InvalidOid */
+	Oid			serialfn_oid;
+
+	/* Oid of the deserialization function or InvalidOid */
+	Oid			deserialfn_oid;
+
+	/* Oid of state value's datatype */
+	Oid			aggtranstype;
+
+	/* ExprStates of the FILTER and argument expressions. */
+	ExprState  *aggfilter;		/* state of FILTER expression, if any */
+	List	   *aggdirectargs;	/* states of direct-argument expressions */
+
+	/*
+	 * fmgr lookup data for transition function or combine function.  Note in
+	 * particular that the fn_strict flag is kept here.
+	 */
+	FmgrInfo	transfn;
+
+	/* fmgr lookup data for serialization function */
+	FmgrInfo	serialfn;
+
+	/* fmgr lookup data for deserialization function */
+	FmgrInfo	deserialfn;
+
+	/* Input collation derived for aggregate */
+	Oid			aggCollation;
+
+	/* number of sorting columns */
+	int			numSortCols;
+
+	/* number of sorting columns to consider in DISTINCT comparisons */
+	/* (this is either zero or the same as numSortCols) */
+	int			numDistinctCols;
+
+	/* deconstructed sorting information (arrays of length numSortCols) */
+	AttrNumber *sortColIdx;
+	Oid		   *sortOperators;
+	Oid		   *sortCollations;
+	bool	   *sortNullsFirst;
+
+	/*
+	 * fmgr lookup data for input columns' equality operators --- only
+	 * set/used when aggregate has DISTINCT flag.  Note that these are in
+	 * order of sort column index, not parameter index.
+	 */
+	FmgrInfo   *equalfns;		/* array of length numDistinctCols */
+
+	/*
+	 * initial value from pg_aggregate entry
+	 */
+	Datum		initValue;
+	bool		initValueIsNull;
+
+	/*
+	 * We need the len and byval info for the agg's input and transition data
+	 * types in order to know how to copy/delete values.
+	 *
+	 * Note that the info for the input type is used only when handling
+	 * DISTINCT aggs with just one argument, so there is only one input type.
+	 */
+	int16		inputtypeLen,
+				transtypeLen;
+	bool		inputtypeByVal,
+				transtypeByVal;
+
+	/*
+	 * Stuff for evaluation of aggregate inputs in cases where the aggregate
+	 * requires sorted input.  The arguments themselves will be evaluated via
+	 * AggState->evalslot/evalproj for all aggregates at once, but we only
+	 * want to sort the relevant columns for individual aggregates.
+	 */
+	TupleDesc	sortdesc;		/* descriptor of input tuples */
+
+	/*
+	 * Slots for holding the evaluated input arguments.  These are set up
+	 * during ExecInitAgg() and then used for each input row requiring
+	 * processing besides what's done in AggState->evalproj.
+	 */
+	TupleTableSlot *sortslot;	/* current input tuple */
+	TupleTableSlot *uniqslot;	/* used for multi-column DISTINCT */
+
+	/*
+	 * These values are working state that is initialized at the start of an
+	 * input tuple group and updated for each input tuple.
+	 *
+	 * For a simple (non DISTINCT/ORDER BY) aggregate, we just feed the input
+	 * values straight to the transition function.  If it's DISTINCT or
+	 * requires ORDER BY, we pass the input values into a Tuplesort object;
+	 * then at completion of the input tuple group, we scan the sorted values,
+	 * eliminate duplicates if needed, and run the transition function on the
+	 * rest.
+	 *
+	 * We need a separate tuplesort for each grouping set.
+	 */
+
+	Tuplesortstate **sortstates;	/* sort objects, if DISTINCT or ORDER BY */
+
+	/*
+	 * This field is a pre-initialized FunctionCallInfo struct used for
+	 * calling this aggregate's transfn.  We save a few cycles per row by not
+	 * re-initializing the unchanging fields; which isn't much, but it seems
+	 * worth the extra space consumption.
+	 */
+	FunctionCallInfoData transfn_fcinfo;
+
+	/* Likewise for serialization and deserialization functions */
+	FunctionCallInfoData serialfn_fcinfo;
+
+	FunctionCallInfoData deserialfn_fcinfo;
+}			AggStatePerTransData;
+
+/*
+ * AggStatePerAggData - per-aggregate information
+ *
+ * This contains the information needed to call the final function, to produce
+ * a final aggregate result from the state value. If there are multiple
+ * identical Aggrefs in the query, they can all share the same per-agg data.
+ *
+ * These values are set up during ExecInitAgg() and do not change thereafter.
+ */
+typedef struct AggStatePerAggData
+{
+	/*
+	 * Link to an Aggref expr this state value is for.
+	 *
+	 * There can be multiple identical Aggref's sharing the same per-agg. This
+	 * points to the first one of them.
+	 */
+	Aggref	   *aggref;
+
+	/* index to the state value which this agg should use */
+	int			transno;
+
+	/* Optional Oid of final function (may be InvalidOid) */
+	Oid			finalfn_oid;
+
+	/*
+	 * fmgr lookup data for final function --- only valid when finalfn_oid oid
+	 * is not InvalidOid.
+	 */
+	FmgrInfo	finalfn;
+
+	/*
+	 * Number of arguments to pass to the finalfn.  This is always at least 1
+	 * (the transition state value) plus any ordered-set direct args. If the
+	 * finalfn wants extra args then we pass nulls corresponding to the
+	 * aggregated input columns.
+	 */
+	int			numFinalArgs;
+
+	/*
+	 * We need the len and byval info for the agg's result data type in order
+	 * to know how to copy/delete values.
+	 */
+	int16		resulttypeLen;
+	bool		resulttypeByVal;
+
+}			AggStatePerAggData;
+
+/*
+ * AggStatePerGroupData - per-aggregate-per-group working state
+ *
+ * These values are working state that is initialized at the start of
+ * an input tuple group and updated for each input tuple.
+ *
+ * In AGG_PLAIN and AGG_SORTED modes, we have a single array of these
+ * structs (pointed to by aggstate->pergroup); we re-use the array for
+ * each input group, if it's AGG_SORTED mode.  In AGG_HASHED mode, the
+ * hash table contains an array of these structs for each tuple group.
+ *
+ * Logically, the sortstate field belongs in this struct, but we do not
+ * keep it here for space reasons: we don't support DISTINCT aggregates
+ * in AGG_HASHED mode, so there's no reason to use up a pointer field
+ * in every entry of the hashtable.
+ */
+typedef struct AggStatePerGroupData
+{
+	Datum		transValue;		/* current transition value */
+	bool		transValueIsNull;
+
+	bool		noTransValue;	/* true if transValue not set yet */
+
+	/*
+	 * Note: noTransValue initially has the same value as transValueIsNull,
+	 * and if true both are cleared to false at the same time.  They are not
+	 * the same though: if transfn later returns a NULL, we want to keep that
+	 * NULL and not auto-replace it with a later input value. Only the first
+	 * non-NULL input will be auto-substituted.
+	 */
+}			AggStatePerGroupData;
+
+/*
+ * AggStatePerPhaseData - per-grouping-set-phase state
+ *
+ * Grouping sets are divided into "phases", where a single phase can be
+ * processed in one pass over the input. If there is more than one phase, then
+ * at the end of input from the current phase, state is reset and another pass
+ * taken over the data which has been re-sorted in the mean time.
+ *
+ * Accordingly, each phase specifies a list of grouping sets and group clause
+ * information, plus each phase after the first also has a sort order.
+ */
+typedef struct AggStatePerPhaseData
+{
+	AggStrategy aggstrategy;	/* strategy for this phase */
+	int			numsets;		/* number of grouping sets (or 0) */
+	int		   *gset_lengths;	/* lengths of grouping sets */
+	Bitmapset **grouped_cols;	/* column groupings for rollup */
+	FmgrInfo   *eqfunctions;	/* per-grouping-field equality fns */
+	Agg		   *aggnode;		/* Agg node for phase data */
+	Sort	   *sortnode;		/* Sort node for input ordering for phase */
+
+	ExprState  *evaltrans;		/* evaluation of transition functions  */
+}			AggStatePerPhaseData;
+
+/*
+ * AggStatePerHashData - per-hashtable state
+ *
+ * When doing grouping sets with hashing, we have one of these for each
+ * grouping set. (When doing hashing without grouping sets, we have just one of
+ * them.)
+ */
+typedef struct AggStatePerHashData
+{
+	TupleHashTable hashtable;	/* hash table with one entry per group */
+	TupleHashIterator hashiter; /* for iterating through hash table */
+	TupleTableSlot *hashslot;	/* slot for loading hash table */
+	FmgrInfo   *hashfunctions;	/* per-grouping-field hash fns */
+	FmgrInfo   *eqfunctions;	/* per-grouping-field equality fns */
+	int			numCols;		/* number of hash key columns */
+	int			numhashGrpCols; /* number of columns in hash table */
+	int			largestGrpColIdx;	/* largest col required for hashing */
+	AttrNumber *hashGrpColIdxInput; /* hash col indices in input slot */
+	AttrNumber *hashGrpColIdxHash;	/* indices in hashtbl tuples */
+	Agg		   *aggnode;		/* original Agg node, for numGroups etc. */
+}			AggStatePerHashData;
+
 extern AggState *ExecInitAgg(Agg *node, EState *estate, int eflags);
 extern void ExecEndAgg(AggState *node);
 extern void ExecReScanAgg(AggState *node);
@@ -24,4 +315,21 @@ extern Size hash_agg_entry_size(int numAggs);
 
 extern Datum aggregate_dummy(PG_FUNCTION_ARGS);
 
+/*
+ * Select the current grouping set; affects current_set and
+ * curaggcontext.
+ */
+static inline void
+select_current_set(AggState *aggstate, int setno, bool is_hash)
+{
+	/* when changing this, also adapt ExecInterpExpr() and friends */
+	if (is_hash)
+		aggstate->curaggcontext = aggstate->hashcontext;
+	else
+		aggstate->curaggcontext = aggstate->aggcontexts[setno];
+
+	aggstate->current_set = setno;
+}
+
+
 #endif							/* NODEAGG_H */
diff --git a/src/include/lib/llvmjit.h b/src/include/lib/llvmjit.h
index 61d7c67d6f..47f9b6d64c 100644
--- a/src/include/lib/llvmjit.h
+++ b/src/include/lib/llvmjit.h
@@ -59,6 +59,7 @@ extern LLVMTypeRef StructFmgrInfo;
 extern LLVMTypeRef StructFunctionCallInfoData;
 extern LLVMTypeRef StructExprState;
 extern LLVMTypeRef StructExprContext;
+extern LLVMTypeRef StructAggStatePerGroupData;
 
 extern void llvm_initialize(void);
 extern void llvm_dispose_module(LLVMModuleRef mod, const char *funcname);
diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h
index b0c4856392..68352b431c 100644
--- a/src/include/nodes/execnodes.h
+++ b/src/include/nodes/execnodes.h
@@ -1835,6 +1835,11 @@ typedef struct AggState
 	AggStatePerHash perhash;
 	AggStatePerGroup *hash_pergroup;	/* grouping set indexed array of
 										 * per-group pointers */
+
+	AggStatePerGroup *all_pergroups;
+	ExprContext **all_contexts;
+
+
 	/* support for evaluation of agg inputs */
 	TupleTableSlot *evalslot;	/* slot for agg inputs */
 	ProjectionInfo *evalproj;	/* projection machinery */
-- 
2.14.1.2.g4274c698f4.dirty

0016-Hacky-Preliminary-inlining-implementation.patchtext/x-diff; charset=us-asciiDownload
From 97b671aff4aafa834befaa3479af0cb2afade4d8 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Thu, 31 Aug 2017 23:06:04 -0700
Subject: [PATCH 16/16] Hacky/Preliminary inlining implementation.

---
 src/Makefile.global.in                 |   8 ++
 src/backend/Makefile                   |   6 +
 src/backend/executor/execExprCompile.c | 111 +++++++++++++++
 src/backend/lib/llvmjit.c              | 239 ++++++++++++++++++++++++++++++++-
 src/backend/utils/misc/guc.c           |  24 ++++
 src/include/lib/llvmjit.h              |   7 +
 6 files changed, 391 insertions(+), 4 deletions(-)

diff --git a/src/Makefile.global.in b/src/Makefile.global.in
index ab5862b472..0d47734a6a 100644
--- a/src/Makefile.global.in
+++ b/src/Makefile.global.in
@@ -812,6 +812,10 @@ ifndef COMPILE.c
 COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) -c
 endif
 
+ifndef COMPILE.bc
+COMPILE.bc = $(CC) $(filter-out -g3 -g -ggdb3 -fno-strict-aliasing, $(CFLAGS)) -fstrict-aliasing $(CPPFLAGS) -emit-llvm -c
+endif
+
 DEPDIR = .deps
 
 ifeq ($(GCC), yes)
@@ -821,6 +825,10 @@ ifeq ($(GCC), yes)
 	@if test ! -d $(DEPDIR); then mkdir -p $(DEPDIR); fi
 	$(COMPILE.c) -o $@ $< -MMD -MP -MF $(DEPDIR)/$(*F).Po
 
+%.bc : %.c %.o
+	@if test ! -d $(DEPDIR); then mkdir -p $(DEPDIR); fi
+	$(COMPILE.bc) -o $@ $<
+
 endif # GCC
 
 # Include all the dependency files generated for the current
diff --git a/src/backend/Makefile b/src/backend/Makefile
index c82ad75bda..1f1945b5f3 100644
--- a/src/backend/Makefile
+++ b/src/backend/Makefile
@@ -64,6 +64,12 @@ ifneq ($(PORTNAME), aix)
 postgres: $(OBJS)
 	$(CC) $(CFLAGS) $(LDFLAGS) $(LDFLAGS_EX) $(export_dynamic) $(call expand_subsys,$^) $(LIBS) -o $@
 
+
+ifeq ($(findstring clang,$(CC)), clang)
+parsed: $(OBJS)
+	$(MAKE $(patsubst %.o,%.bc,$(call expand_subsys,$(OBJS))))
+endif
+
 endif
 endif
 endif
diff --git a/src/backend/executor/execExprCompile.c b/src/backend/executor/execExprCompile.c
index d0b943530c..73412d0e1b 100644
--- a/src/backend/executor/execExprCompile.c
+++ b/src/backend/executor/execExprCompile.c
@@ -213,9 +213,21 @@ BuildFunctionCall(LLVMJitContext *context, LLVMBuilderRef builder,
 	}
 	else if (builtin)
 	{
+		LLVMModuleRef inline_mod;
+
 		LLVMAddFunction(mod, builtin->funcName, TypePGFunction);
 		v_fn_addr = LLVMGetNamedFunction(mod, builtin->funcName);
 		Assert(v_fn_addr);
+
+		inline_mod = llvm_module_for_function(builtin->funcName);
+		if (inline_mod)
+		{
+			context->inline_modules =
+				list_append_unique_ptr(context->inline_modules,
+									   inline_mod);
+		}
+
+		forceinline = true;
 	}
 	else
 	{
@@ -263,6 +275,20 @@ BuildFunctionCall(LLVMJitContext *context, LLVMBuilderRef builder,
 		LLVMValueRef v_lifetime = get_LifetimeEnd(mod);
 		LLVMValueRef params[2];
 
+		params[0] = LLVMConstInt(LLVMInt64Type(), sizeof(fcinfo->arg), false);
+		params[1] = LLVMBuildBitCast(
+			builder, LLVMConstInt(TypeSizeT, (intptr_t) fcinfo->arg, false),
+			LLVMPointerType(LLVMInt8Type(), 0),
+			"");
+		LLVMBuildCall(builder, v_lifetime, params, lengthof(params), "");
+
+		params[0] = LLVMConstInt(LLVMInt64Type(), sizeof(fcinfo->argnull), false);
+		params[1] = LLVMBuildBitCast(
+			builder, LLVMConstInt(TypeSizeT, (intptr_t) fcinfo->argnull, false),
+			LLVMPointerType(LLVMInt8Type(), 0),
+			"");
+		LLVMBuildCall(builder, v_lifetime, params, lengthof(params), "");
+
 		params[0] = LLVMConstInt(LLVMInt64Type(), sizeof(FunctionCallInfoData), false);
 		params[1] = LLVMBuildBitCast(
 			builder, v_fcinfo,
@@ -314,6 +340,9 @@ ExecRunCompiledExpr(ExprState *state, ExprContext *econtext, bool *isNull)
 	return func(state, econtext, isNull);
 }
 
+static void
+emit_lifetime_end(ExprState *state, LLVMModuleRef mod, LLVMBuilderRef builder);
+
 bool
 ExecReadyCompiledExpr(ExprState *state, PlanState *parent)
 {
@@ -519,6 +548,7 @@ ExecReadyCompiledExpr(ExprState *state, PlanState *parent)
 						LLVMBuildCall(builder, v_lifetime, params, lengthof(params), "");
 					}
 
+					emit_lifetime_end(state, mod, builder);
 
 					LLVMBuildRet(builder, v_tmpvalue);
 					break;
@@ -2793,4 +2823,85 @@ ExecReadyCompiledExpr(ExprState *state, PlanState *parent)
 	return true;
 }
 
+
+static void
+emit_lifetime_end(ExprState *state, LLVMModuleRef mod, LLVMBuilderRef builder)
+{
+	ExprEvalStep   *op;
+	int i = 0;
+	int argno = 0;
+	LLVMValueRef v_lifetime = get_LifetimeEnd(mod);
+
+
+	/*
+	 * Add lifetime-end annotation, signalling that writes to memory don't
+	 * have to be retained (important for inlining potential).
+	 */
+
+	for (i = 0; i < state->steps_len; i++)
+	{
+		FunctionCallInfo fcinfo = NULL;
+		LLVMValueRef v_ptr;
+		LLVMValueRef params[2];
+
+		op = &state->steps[i];
+
+		switch ((ExprEvalOp) op->opcode)
+		{
+			case EEOP_FUNCEXPR:
+			case EEOP_FUNCEXPR_STRICT:
+			case EEOP_NULLIF:
+			case EEOP_DISTINCT:
+				fcinfo = op->d.func.fcinfo_data;
+
+				for (argno = 0; argno < op->d.func.nargs; argno++)
+				{
+					params[0] = LLVMConstInt(LLVMInt64Type(), sizeof(Datum), false);
+					params[1] = LLVMBuildIntToPtr(
+						builder, LLVMConstInt(TypeSizeT, (intptr_t) &fcinfo->arg[argno], false),
+						LLVMPointerType(LLVMInt8Type(), 0),
+						"");
+					LLVMBuildCall(builder, v_lifetime, params, lengthof(params), "");
+
+					params[0] = LLVMConstInt(LLVMInt64Type(), sizeof(bool), false);
+					params[1] = LLVMBuildIntToPtr(
+						builder, LLVMConstInt(TypeSizeT, (intptr_t) &fcinfo->argnull[argno], false),
+						LLVMPointerType(LLVMInt8Type(), 0),
+						"");
+					LLVMBuildCall(builder, v_lifetime, params, lengthof(params), "");
+				}
+				params[0] = LLVMConstInt(LLVMInt64Type(), sizeof(FunctionCallInfoData), false);
+				params[1] = LLVMBuildIntToPtr(
+					builder, LLVMConstInt(TypeSizeT, (intptr_t) fcinfo, false),
+					LLVMPointerType(LLVMInt8Type(), 0),
+					"");
+				LLVMBuildCall(builder, v_lifetime, params, lengthof(params), "");
+
+				break;
+			case EEOP_ROWCOMPARE_STEP:
+				fcinfo = op->d.rowcompare_step.fcinfo_data;;
+				break;
+			case EEOP_BOOLTEST_IS_TRUE:
+			case EEOP_BOOLTEST_IS_NOT_FALSE:
+			case EEOP_BOOLTEST_IS_FALSE:
+			case EEOP_BOOLTEST_IS_NOT_TRUE:
+				if (op->d.boolexpr.anynull)
+				{
+					v_ptr = LLVMBuildIntToPtr(
+						builder,
+						LLVMConstInt(LLVMInt64Type(), (intptr_t) op->d.boolexpr.anynull, false),
+						LLVMPointerType(LLVMInt8Type(), 0),
+						"anynull");
+
+					params[0] = LLVMConstInt(LLVMInt64Type(), sizeof(bool), false);
+					params[1] = v_ptr;
+					LLVMBuildCall(builder, v_lifetime, params, lengthof(params), "");
+				}
+				break;
+		default:
+			break;
+		}
+
+	}
+}
 #endif
diff --git a/src/backend/lib/llvmjit.c b/src/backend/lib/llvmjit.c
index 57d0663410..86d43c3c07 100644
--- a/src/backend/lib/llvmjit.c
+++ b/src/backend/lib/llvmjit.c
@@ -9,6 +9,7 @@
 
 #include "utils/memutils.h"
 #include "utils/resowner_private.h"
+#include "utils/varlena.h"
 
 #ifdef USE_LLVM
 
@@ -32,6 +33,8 @@
 /* GUCs */
 bool jit_log_ir = 0;
 bool jit_dump_bitcode = 0;
+bool jit_perform_inlining = 0;
+char *jit_inline_directories = NULL;
 
 static bool llvm_initialized = false;
 static LLVMPassManagerBuilderRef llvm_pmb;
@@ -72,6 +75,8 @@ static LLVMOrcJITStackRef llvm_orc;
 static void llvm_shutdown(void);
 static void llvm_create_types(void);
 
+static void llvm_search_inline_directories(void);
+
 
 static void
 llvm_shutdown(void)
@@ -103,6 +108,8 @@ llvm_initialize(void)
 	LLVMLoadLibraryPermanently("");
 
 	llvm_triple = LLVMGetDefaultTargetTriple();
+	/* FIXME: overwrite with clang compatible one? */
+	llvm_triple = "x86_64-pc-linux-gnu";
 
 	if (LLVMGetTargetFromTriple(llvm_triple, &llvm_targetref, &error) != 0)
 	{
@@ -117,6 +124,7 @@ llvm_initialize(void)
 
 	llvm_pmb = LLVMPassManagerBuilderCreate();
 	LLVMPassManagerBuilderSetOptLevel(llvm_pmb, 3);
+	LLVMPassManagerBuilderUseInlinerWithThreshold(llvm_pmb, 0);
 
 	llvm_orc = LLVMOrcCreateInstance(llvm_targetmachine);
 
@@ -128,9 +136,188 @@ llvm_initialize(void)
 	llvm_create_types();
 
 	llvm_initialized = true;
+
+	llvm_search_inline_directories();
+
 	MemoryContextSwitchTo(oldcontext);
 }
 
+#include "common/string.h"
+#include "storage/fd.h"
+#include "miscadmin.h"
+
+static HTAB *InlineModuleHash = NULL;
+
+typedef struct InlineableFunction
+{
+	NameData fname;
+	const char *path;
+	LLVMModuleRef mod;
+} InlineableFunction;
+
+static void
+llvm_preload_bitcode(const char *filename)
+{
+	LLVMMemoryBufferRef buf;
+	char *msg;
+	LLVMValueRef func;
+	LLVMModuleRef mod = NULL;
+
+	mod = LLVMModuleCreateWithName("tmp");
+
+	if (LLVMCreateMemoryBufferWithContentsOfFile(
+			filename, &buf, &msg))
+	{
+		elog(ERROR, "LLVMCreateMemoryBufferWithContentsOfFile(%s) failed: %s",
+			 filename, msg);
+	}
+
+#if 1
+	if (LLVMParseBitcode2(buf, &mod))
+	{
+		elog(ERROR, "LLVMParseBitcode2 failed: %s", msg);
+	}
+#else
+	if (LLVMGetBitcodeModule2(buf, &mod))
+	{
+		elog(ERROR, "LLVMGetBitcodeModule2 failed: %s", msg);
+	}
+#endif
+
+	func = LLVMGetFirstFunction(mod);
+	while (func)
+	{
+		const char *funcname = LLVMGetValueName(func);
+
+		if (!LLVMIsDeclaration(func))
+		{
+			if (LLVMGetLinkage(func) == LLVMExternalLinkage)
+			{
+				InlineableFunction *fentry;
+				bool found;
+
+				fentry = (InlineableFunction *)
+					hash_search(InlineModuleHash,
+								(void *) funcname,
+								HASH_ENTER, &found);
+
+				if (found)
+				{
+					elog(LOG, "skiping loading func %s, already exists at %s, loading %s",
+						 funcname, fentry->path, filename);
+				}
+				else
+				{
+					fentry->path = pstrdup(filename);
+					fentry->mod = mod;
+				}
+
+				LLVMSetLinkage(func, LLVMAvailableExternallyLinkage);
+			}
+		}
+
+		func = LLVMGetNextFunction(func);
+	}
+}
+
+static void
+llvm_search_inline_directory(const char *path)
+{
+	DIR		   *dir;
+	struct dirent *de;
+
+	dir = AllocateDir(path);
+	if (dir == NULL)
+	{
+		ereport(ERROR,
+				(errcode_for_file_access(),
+				 errmsg("could not open directory \"%s\": %m", path)));
+		return;
+	}
+
+	while ((de = ReadDir(dir, path)) != NULL)
+	{
+		char		subpath[MAXPGPATH * 2];
+		struct stat fst;
+		int			sret;
+
+		CHECK_FOR_INTERRUPTS();
+
+		if (strcmp(de->d_name, ".") == 0 ||
+			strcmp(de->d_name, "..") == 0)
+			continue;
+
+		snprintf(subpath, sizeof(subpath), "%s/%s", path, de->d_name);
+
+		sret = lstat(subpath, &fst);
+
+		if (sret < 0)
+		{
+			ereport(ERROR,
+					(errcode_for_file_access(),
+					 errmsg("could not stat file \"%s\": %m", subpath)));
+			continue;
+		}
+
+		if (S_ISREG(fst.st_mode))
+		{
+			if (pg_str_endswith(subpath, ".bc"))
+			{
+				llvm_preload_bitcode(subpath);
+			}
+		}
+		else if (S_ISDIR(fst.st_mode))
+		{
+			llvm_search_inline_directory(subpath);
+		}
+	}
+
+	FreeDir(dir);				/* we ignore any error here */
+}
+
+static void
+llvm_search_inline_directories(void)
+{
+	List *elemlist;
+	ListCell *lc;
+	HASHCTL		ctl;
+
+	Assert(InlineModuleHash == NULL);
+	/* First time through: initialize the hash table */
+
+	MemSet(&ctl, 0, sizeof(ctl));
+	ctl.keysize = sizeof(NameData);
+	ctl.entrysize = sizeof(InlineableFunction);
+	InlineModuleHash = hash_create("inlineable function cache", 64,
+								   &ctl, HASH_ELEM);
+
+	SplitDirectoriesString(pstrdup(jit_inline_directories), ';', &elemlist);
+
+	foreach(lc, elemlist)
+	{
+		char	   *curdir = (char *) lfirst(lc);
+
+		llvm_search_inline_directory(curdir);
+	}
+}
+
+LLVMModuleRef
+llvm_module_for_function(const char *funcname)
+{
+	InlineableFunction *fentry;
+	bool found;
+
+	fentry = (InlineableFunction *)
+		hash_search(InlineModuleHash,
+					(void *) funcname,
+					HASH_FIND, &found);
+
+	if (fentry)
+		return fentry->mod;
+	return NULL;
+}
+
+
 static void
 llvm_create_types(void)
 {
@@ -399,7 +586,11 @@ llvm_create_types(void)
 static uint64_t
 llvm_resolve_symbol(const char *name, void *ctx)
 {
-	return (uint64_t) LLVMSearchForAddressOfSymbol(name);
+	uint64_t addr = (uint64_t) LLVMSearchForAddressOfSymbol(name);
+
+	if (!addr)
+		elog(ERROR, "failed to resolve name %s", name);
+	return addr;
 }
 
 void *
@@ -412,9 +603,22 @@ llvm_get_function(LLVMJitContext *context, const char *funcname)
 	if (!context->compiled)
 	{
 		int handle;
-		LLVMSharedModuleRef smod = LLVMOrcMakeSharedModule(context->module);
+		LLVMSharedModuleRef smod;
 		MemoryContext oldcontext;
 
+		if (jit_perform_inlining)
+		{
+			ListCell *lc;
+
+			foreach(lc, context->inline_modules)
+			{
+				LLVMModuleRef inline_mod = lfirst(lc);
+
+				inline_mod = LLVMCloneModule(inline_mod);
+				LLVMLinkModules2Needed(context->module, inline_mod);
+			}
+		}
+
 		if (jit_log_ir)
 		{
 			LLVMDumpModule(context->module);
@@ -439,13 +643,26 @@ llvm_get_function(LLVMJitContext *context, const char *funcname)
 			llvm_mpm = LLVMCreatePassManager();
 
 			LLVMPassManagerBuilderPopulateFunctionPassManager(llvm_pmb, llvm_fpm);
-			LLVMPassManagerBuilderPopulateModulePassManager(llvm_pmb, llvm_mpm);
+			//LLVMPassManagerBuilderPopulateModulePassManager(llvm_pmb, llvm_mpm);
 			LLVMPassManagerBuilderPopulateLTOPassManager(llvm_pmb, llvm_mpm, true, true);
 
+			LLVMAddCFGSimplificationPass(llvm_fpm);
+			LLVMAddJumpThreadingPass(llvm_fpm);
+			LLVMAddTypeBasedAliasAnalysisPass(llvm_fpm);
+			LLVMAddDeadStoreEliminationPass(llvm_fpm);
+			LLVMAddConstantPropagationPass(llvm_fpm);
+			LLVMAddSCCPPass(llvm_fpm);
+
 			LLVMAddAnalysisPasses(llvm_targetmachine, llvm_mpm);
 			LLVMAddAnalysisPasses(llvm_targetmachine, llvm_fpm);
 
-			LLVMAddDeadStoreEliminationPass(llvm_fpm);
+			/* do function level optimization */
+			LLVMInitializeFunctionPassManager(llvm_fpm);
+			for (func = LLVMGetFirstFunction(context->module);
+				 func != NULL;
+				 func = LLVMGetNextFunction(func))
+				LLVMRunFunctionPassManager(llvm_fpm, func);
+			LLVMFinalizeFunctionPassManager(llvm_fpm);
 
 			/* do function level optimization */
 			LLVMInitializeFunctionPassManager(llvm_fpm);
@@ -457,11 +674,24 @@ llvm_get_function(LLVMJitContext *context, const char *funcname)
 
 			/* do module level optimization */
 			LLVMRunPassManager(llvm_mpm, context->module);
+			LLVMRunPassManager(llvm_mpm, context->module);
+			LLVMRunPassManager(llvm_mpm, context->module);
+			LLVMRunPassManager(llvm_mpm, context->module);
 
 			LLVMDisposePassManager(llvm_fpm);
 			LLVMDisposePassManager(llvm_mpm);
 		}
 
+		if (jit_dump_bitcode)
+		{
+			/* FIXME: invent module rather than function specific name */
+			char *filename = psprintf("%s.optimized.bc", funcname);
+			LLVMWriteBitcodeToFile(context->module, filename);
+			pfree(filename);
+		}
+
+		smod = LLVMOrcMakeSharedModule(context->module);
+
 		/* and emit the code */
 		{
 			handle =
@@ -480,6 +710,7 @@ llvm_get_function(LLVMJitContext *context, const char *funcname)
 
 		context->module = NULL;
 		context->compiled = true;
+		context->inline_modules = NIL;
 	}
 
 	/* search all emitted modules for function we're asked for */
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 4cc9f305a2..82359b1616 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -1043,6 +1043,17 @@ static struct config_bool ConfigureNamesBool[] =
 		NULL, NULL, NULL
 	},
 
+	{
+		{"jit_perform_inlining", PGC_USERSET, DEVELOPER_OPTIONS,
+			gettext_noop("inline functions for JIT"),
+			NULL,
+			GUC_NOT_IN_SAMPLE
+		},
+		&jit_perform_inlining,
+		false,
+		NULL, NULL, NULL
+	},
+
 #endif
 
 	{
@@ -3700,6 +3711,19 @@ static struct config_string ConfigureNamesString[] =
 		check_wal_consistency_checking, assign_wal_consistency_checking, NULL
 	},
 
+#ifdef USE_LLVM
+	{
+		{"jit_inline_directories", PGC_BACKEND, DEVELOPER_OPTIONS,
+			gettext_noop("Sets the directories where inline contents for JIT are located."),
+			NULL,
+			GUC_SUPERUSER_ONLY
+		},
+		&jit_inline_directories,
+		"",
+		NULL, NULL, NULL
+	},
+#endif
+
 	/* End-of-list marker */
 	{
 		{NULL, 0, 0, NULL, NULL}, NULL, NULL, NULL, NULL, NULL
diff --git a/src/include/lib/llvmjit.h b/src/include/lib/llvmjit.h
index 47f9b6d64c..e2a8cccafc 100644
--- a/src/include/lib/llvmjit.h
+++ b/src/include/lib/llvmjit.h
@@ -27,12 +27,15 @@ typedef struct LLVMJitContext
 {
 	int counter;
 	LLVMModuleRef module;
+	List *inline_modules;
 	bool compiled;
 	List *handles;
 } LLVMJitContext;
 
 extern bool jit_log_ir;
 extern bool jit_dump_bitcode;
+extern bool jit_perform_inlining;
+extern char *jit_inline_directories;
 
 extern LLVMTargetMachineRef llvm_targetmachine;
 extern const char *llvm_triple;
@@ -74,6 +77,10 @@ extern void llvm_shutdown_orc_perf_support(LLVMOrcJITStackRef llvm_orc);
 
 extern LLVMValueRef slot_compile_deform(struct LLVMJitContext *context, TupleDesc desc, int natts);
 
+
+extern LLVMModuleRef llvm_module_for_function(const char *funcname);
+
+
 #else
 
 struct LLVMJitContext;
-- 
2.14.1.2.g4274c698f4.dirty

#2Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#1)
Re: JIT & function naming

Hi,

On 2017-08-31 23:41:31 -0700, Andres Freund wrote:

I previously had an early prototype of JITing [1] expression evaluation
and tuple deforming. I've since then worked a lot on this.

Here's an initial, not really pretty but functional, submission.

One of the things I'm not really happy about yet is the naming of the
generated functions. Those primarily matter when doing profiling, where
the function name will show up when the profiler supports JIT stuff
(e.g. with a patch I proposed to LLVM that emits perf compatible output,
there's also existing LLVM support for a profiler by intel and
oprofile).

Currently there's essentially a per EState counter and the generated
functions get named deform$n and evalexpr$n. That allows for profiling
of a single query, because different compiled expressions are
disambiguated. It even allows to run the same query over and over, still
giving meaningful results. But it breaks down when running multiple
queries while profiling - evalexpr0 can mean something entirely
different for different queries.

The best idea I have so far would be to name queries like
evalexpr_$fingerprint_$n, but for that we'd need fingerprinting support
outside of pg_stat_statement, which seems painful-ish.

Perhaps somebody has a better idea?

Regards,

Andres

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#3Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Andres Freund (#2)
Re: JIT & function naming

On 09/03/2017 02:59 AM, Andres Freund wrote:

Hi,

On 2017-08-31 23:41:31 -0700, Andres Freund wrote:

I previously had an early prototype of JITing [1] expression evaluation
and tuple deforming. I've since then worked a lot on this.

Here's an initial, not really pretty but functional, submission.

One of the things I'm not really happy about yet is the naming of the
generated functions. Those primarily matter when doing profiling, where
the function name will show up when the profiler supports JIT stuff
(e.g. with a patch I proposed to LLVM that emits perf compatible output,
there's also existing LLVM support for a profiler by intel and
oprofile).

Currently there's essentially a per EState counter and the generated
functions get named deform$n and evalexpr$n. That allows for profiling
of a single query, because different compiled expressions are
disambiguated. It even allows to run the same query over and over, still
giving meaningful results. But it breaks down when running multiple
queries while profiling - evalexpr0 can mean something entirely
different for different queries.

The best idea I have so far would be to name queries like
evalexpr_$fingerprint_$n, but for that we'd need fingerprinting support
outside of pg_stat_statement, which seems painful-ish.

Perhaps somebody has a better idea?

As far as I understand we do not need precise fingerprint.
So may be just calculate some lightweight fingerprint?
For example take query text (es_sourceText from EText), replace all non-alphanumeric characters spaces with '_' and take first N (16?) characters of the result?
It seems to me that in most cases it will help to identify the query...

--
Konstantin Knizhnik
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#2)
Re: JIT & function naming

Andres Freund <andres@anarazel.de> writes:

Currently there's essentially a per EState counter and the generated
functions get named deform$n and evalexpr$n. That allows for profiling
of a single query, because different compiled expressions are
disambiguated. It even allows to run the same query over and over, still
giving meaningful results. But it breaks down when running multiple
queries while profiling - evalexpr0 can mean something entirely
different for different queries.

The best idea I have so far would be to name queries like
evalexpr_$fingerprint_$n, but for that we'd need fingerprinting support
outside of pg_stat_statement, which seems painful-ish.

Yeah. Why not just use a static counter to give successive unique IDs
to each query that gets JIT-compiled? Then the function names would
be like deform_$querynumber_$subexprnumber.

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#5Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#4)
Re: JIT & function naming

On 2017-09-03 10:11:37 -0400, Tom Lane wrote:

Andres Freund <andres@anarazel.de> writes:

Currently there's essentially a per EState counter and the generated
functions get named deform$n and evalexpr$n. That allows for profiling
of a single query, because different compiled expressions are
disambiguated. It even allows to run the same query over and over, still
giving meaningful results. But it breaks down when running multiple
queries while profiling - evalexpr0 can mean something entirely
different for different queries.

The best idea I have so far would be to name queries like
evalexpr_$fingerprint_$n, but for that we'd need fingerprinting support
outside of pg_stat_statement, which seems painful-ish.

Yeah. Why not just use a static counter to give successive unique IDs
to each query that gets JIT-compiled? Then the function names would
be like deform_$querynumber_$subexprnumber.

That works, but unfortunately it doesn't keep the names the same over
reruns. So if you rerun the query inside the same session - a quite
reasonable thing to get more accurate profiles - the names in the
profile will change. That makes it quite hard to compare profiles,
especially when a single execution of the query is too quick to see
something meaningful.

Greetings,

Andres Freund

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#6Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Andres Freund (#1)
Re: JIT compiling expressions/deform + inlining prototype v2.0

On 01.09.2017 09:41, Andres Freund wrote:

Hi,

I previously had an early prototype of JITing [1] expression evaluation
and tuple deforming. I've since then worked a lot on this.

Here's an initial, not really pretty but functional, submission. This
supports all types of expressions, and tuples, and allows, albeit with
some drawbacks, inlining of builtin functions. Between the version at
[1] and this I'd done some work in c++, because that allowed to
experiment more with llvm, but I've now translated everything back.
Some features I'd to re-implement due to limitations of C API.

I've whacked this around quite heavily today, this likely has some new
bugs, sorry for that :(

Can you please clarify the following fragment calculating attributes
alignment:

         /* compute what following columns are aligned to */
+        if (att->attlen < 0)
+        {
+            /* can't guarantee any alignment after varlen field */
+            attcuralign = -1;
+        }
+        else if (att->attnotnull && attcuralign >= 0)
+        {
+            Assert(att->attlen > 0);
+            attcuralign += att->attlen;
+        }
+        else if (att->attnotnull)
+        {
+            /*
+             * After a NOT NULL fixed-width column, alignment is
+             * guaranteed to be the minimum of the forced alignment and
+             * length.  XXX
+             */
+            attcuralign = alignto + att->attlen;
+            Assert(attcuralign > 0);
+        }
+        else
+        {
+            //elog(LOG, "attnotnullreset: %d", attnum);
+            attcuralign = -1;
+        }

I wonder why in this branch (att->attnotnull && attcuralign >= 0)
we are not adding "alignto" and comment in the following branch else if
(att->attnotnull)
seems to be not related to this branch, because in this case attcuralign
is expected to be less then zero wjhich means that previous attribute is
varlen field.

--
Konstantin Knizhnik
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#7Andres Freund
andres@anarazel.de
In reply to: Konstantin Knizhnik (#6)
Re: JIT compiling expressions/deform + inlining prototype v2.0

Hi,

On 2017-09-04 20:01:03 +0300, Konstantin Knizhnik wrote:

I previously had an early prototype of JITing [1] expression evaluation
and tuple deforming. I've since then worked a lot on this.

Here's an initial, not really pretty but functional, submission. This
supports all types of expressions, and tuples, and allows, albeit with
some drawbacks, inlining of builtin functions. Between the version at
[1] and this I'd done some work in c++, because that allowed to
experiment more with llvm, but I've now translated everything back.
Some features I'd to re-implement due to limitations of C API.

I've whacked this around quite heavily today, this likely has some new
bugs, sorry for that :(

Can you please clarify the following fragment calculating attributes
alignment:

Hi. That piece of code isn't particularly clear (and has a bug in the
submitted version), I'm revising it.

/* compute what following columns are aligned to */
+        if (att->attlen < 0)
+        {
+            /* can't guarantee any alignment after varlen field */
+            attcuralign = -1;
+        }
+        else if (att->attnotnull && attcuralign >= 0)
+        {
+            Assert(att->attlen > 0);
+            attcuralign += att->attlen;
+        }
+        else if (att->attnotnull)
+        {
+            /*
+             * After a NOT NULL fixed-width column, alignment is
+             * guaranteed to be the minimum of the forced alignment and
+             * length.  XXX
+             */
+            attcuralign = alignto + att->attlen;
+            Assert(attcuralign > 0);
+        }
+        else
+        {
+            //elog(LOG, "attnotnullreset: %d", attnum);
+            attcuralign = -1;
+        }

I wonder why in this branch (att->attnotnull && attcuralign >= 0)
we are not adding "alignto" and comment in the following branch else if
(att->attnotnull)
seems to be not related to this branch, because in this case attcuralign is
expected to be less then zero wjhich means that previous attribute is varlen
field.

Yea, I've changed that already, although it's currently added earlier,
because the alignment is needed before, to access the column correctly.
I've also made number of efficiency improvements, primarily to access
columns with an absolute offset if all preceding ones are fixed width
not null columns - that is quite noticeable performancewise.

Greetings,

Andres Freund

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#8Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Andres Freund (#7)
Re: JIT compiling expressions/deform + inlining prototype v2.0

On 04.09.2017 23:52, Andres Freund wrote:

Yea, I've changed that already, although it's currently added earlier,
because the alignment is needed before, to access the column correctly.
I've also made number of efficiency improvements, primarily to access
columns with an absolute offset if all preceding ones are fixed width
not null columns - that is quite noticeable performancewise.

Unfortunately, in most of real table columns are nullable.
I wonder if we can perform some optimization in this case (assuming that
in typical cases column either contains mostly non-null values, either
mostly null values).

--
Konstantin Knizhnik
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#9Noname
andres@anarazel.de
In reply to: Konstantin Knizhnik (#8)
Re: JIT compiling expressions/deform + inlining prototype v2.0

On 2017-09-05 13:58:56 +0300, Konstantin Knizhnik wrote:

On 04.09.2017 23:52, Andres Freund wrote:

Yea, I've changed that already, although it's currently added earlier,
because the alignment is needed before, to access the column correctly.
I've also made number of efficiency improvements, primarily to access
columns with an absolute offset if all preceding ones are fixed width
not null columns - that is quite noticeable performancewise.

Unfortunately, in most of real table columns are nullable.

I'm not sure I agree with that assertion, but:

I wonder if we can perform some optimization in this case (assuming that in
typical cases column either contains mostly non-null values, either mostly
null values).

Even if all columns are NULLABLE, the JITed code is still a good chunk
faster (a significant part of that is the slot->tts_{nulls,values}
accesses). Alignment is still cheaper with constants, and often enough
the alignment can be avoided (consider e.g. a table full of nullable
ints - everything is guaranteed to be aligned, or columns after an
individual NOT NULL column is also guaranteed to be aligned). What
largely changes is that the 'offset' from the start of the tuple has to
be tracked.

Greetings,

Andres Freund

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#10Greg Stark
stark@mit.edu
In reply to: Konstantin Knizhnik (#8)
Re: JIT compiling expressions/deform + inlining prototype v2.0

On 5 September 2017 at 11:58, Konstantin Knizhnik
<k.knizhnik@postgrespro.ru> wrote:

I wonder if we can perform some optimization in this case (assuming that in
typical cases column either contains mostly non-null values, either mostly
null values).

If you really wanted to go crazy here you could do lookup tables of
bits of null bitmaps. Ie, you look at the first byte of the null
bitmap, index into an array and it points to 8 offsets for the 8
fields covered by that much of the bitmap. The lookup table might be
kind of large since offsets are 16-bits so you're talking 256 * 16
bytes or 2kB for every 8 columns up until the first variable size
column (or I suppose you could even continue in the case where the
variable size column is null).

--
greg

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#11Andres Freund
andres@anarazel.de
In reply to: Greg Stark (#10)
Re: JIT compiling expressions/deform + inlining prototype v2.0

On 2017-09-05 19:43:33 +0100, Greg Stark wrote:

On 5 September 2017 at 11:58, Konstantin Knizhnik
<k.knizhnik@postgrespro.ru> wrote:

I wonder if we can perform some optimization in this case (assuming that in
typical cases column either contains mostly non-null values, either mostly
null values).

If you really wanted to go crazy here you could do lookup tables of
bits of null bitmaps. Ie, you look at the first byte of the null
bitmap, index into an array and it points to 8 offsets for the 8
fields covered by that much of the bitmap. The lookup table might be
kind of large since offsets are 16-bits so you're talking 256 * 16
bytes or 2kB for every 8 columns up until the first variable size
column (or I suppose you could even continue in the case where the
variable size column is null).

I'm missing something here. What's this saving? The code for lookups
with NULLs after jitting effectively is
a) one load for every 8 columns (could be optimized to one load every
sizeof(void*) cols)
b) one bitmask for every column + one branch for null
c) load for the datum, indexed by register
d) saving the column value, that's independent of NULLness
e) one addi adding the length to the offset

Greetings,

Andres Freund

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#12Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Andres Freund (#7)
Re: JIT compiling expressions/deform + inlining prototype v2.0

On 04.09.2017 23:52, Andres Freund wrote:

Hi. That piece of code isn't particularly clear (and has a bug in the
submitted version), I'm revising it.

...

Yea, I've changed that already, although it's currently added earlier,
because the alignment is needed before, to access the column correctly.
I've also made number of efficiency improvements, primarily to access
columns with an absolute offset if all preceding ones are fixed width
not null columns - that is quite noticeable performancewise.

Should I wait for new version of your patch or continue review of this code?

--
Konstantin Knizhnik
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#13Andres Freund
andres@anarazel.de
In reply to: Konstantin Knizhnik (#12)
Re: JIT compiling expressions/deform + inlining prototype v2.0

On 2017-09-19 12:57:33 +0300, Konstantin Knizhnik wrote:

On 04.09.2017 23:52, Andres Freund wrote:

Hi. That piece of code isn't particularly clear (and has a bug in the
submitted version), I'm revising it.

...

Yea, I've changed that already, although it's currently added earlier,
because the alignment is needed before, to access the column correctly.
I've also made number of efficiency improvements, primarily to access
columns with an absolute offset if all preceding ones are fixed width
not null columns - that is quite noticeable performancewise.

Should I wait for new version of your patch or continue review of this code?

I'll update the posted version later this week, sorry for the delay.

Regards,

Andres

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#14Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#1)
22 attachment(s)
Re: JIT compiling - v4.0

Hi,

Here's an updated version of the patchset. There's some substantial
changes here, but it's still very obviously very far from committable as
a whole. There's some helper commmits that are simple and independent
enough to be committable earlier on.

The git tree of this work, which is *frequently* rebased, is at:
https://git.postgresql.org/gitweb/?p=users/andresfreund/postgres.git;a=shortlog;h=refs/heads/jit

The biggest changes are:

- The JIT "infrastructure" is less bad than before, and starting to
shape up.
- The tuple deforming logic is considerably faster than before due to
various optimizations. The optimizations are:
- build deforming exactly to the required natts for the specific caller
- avoid checking the tuple's natts for attributes that have
"following" NOT NULL columns.
- a bunch of minor codegen improvements.
- The tuple deforming codegen also got simpler by relying on LLVM to
promote a stack variable to a register, instead of working with a
register manually - the need to keep IR in SSA form makes doing so
manually rather painful.
- WIP patch to do execGrouping.c TupleHashTableMatch() via JIT. That
makes the column comparison faster, but more importantly it JITs the
deforming (one side at least always is a MinimalTuple).
- All tests pass with JITed expression, tuple deforming, agg transition
value computation and execGrouping logic. There were a number of bugs,
who would have imagined that.
- some more experimental changes later in the series to address some
bottlenecks.

Functionally this covers all of what I think a sensible goal for v11
is. There's a lot of details to figure out, and the inlining
*implementation* isn't what I think we should do. I'll follow up, not
tonight though, with an email outlining the first few design decisions
we're going to have to finalize, which'll be around the memory/lifetime
management of functions, and other infrastructure pieces (currently
patch 0006).

As the patchset is pretty large already, and not going to get any
smaller, I'll make smaller adjustments solely via the git tree, rather
than full reposts.

Greetings,

Andres Freund

Attachments:

0001-Rely-on-executor-utils-to-build-targetlist-for-DM.v4.patch.gzapplication/x-patch-gzipDownload
0002-WIP-Allow-tupleslots-to-have-a-fixed-tupledesc-us.v4.patch.gzapplication/x-patch-gzipDownload
0003-Perform-slot-validity-checks-in-a-separate-pass-o.v4.patch.gzapplication/x-patch-gzipDownload
0004-Pass-through-PlanState-parent-to-expression-insta.v4.patch.gzapplication/x-patch-gzipDownload
0005-Add-configure-infrastructure-to-enable-LLVM.v4.patch.gzapplication/x-patch-gzipDownload
0006-Beginning-of-a-LLVM-JIT-infrastructure.v4.patch.gzapplication/x-patch-gzipDownload
0007-JIT-compile-expressions.v4.patch.gzapplication/x-patch-gzipDownload
����Y0007-JIT-compile-expressions.v4.patch�=iWG���_Q�{�Z�$>�X8dl`N<'�G��]��{z���wo���$6�$�I@�������Wu��D3��O����������t���m���������&���z����C�F!����^���l�z��>�yFvC/�)�Ohz�{�}}��N��N��G�7_9}FNs�&[���`8��z�����6��=����|�u�g������I�qws�������,�J��`�~��fscc�I�����#
�.�D�<���[�#������c�������q����{�4�_����M���������l��}-�|��O��4w�lD�/I�C7�=Z1�3����0`�8 ��� 8���g����
{��v���1r�M�����=s�)�����>���&�@k}�
�=P�}c�I�����Y�Q����x-�~���O&dcc�g���������z��=�o�&[��l>~�n�'�IO����O�e!�/�F�������5�����*g�$Y���x�S��e�5�X��-��*�/�u�A4v�&in��i�����D��^�$4��7&n��A��$���\��h�T����`��$�c?������Oy��4������W��_��
A�JCNh����'�]G}<��N����^,`��Yv�C�d�Q���'���N���M���V�������������Gd���'\�3�~la�a������6��k�)#k���@G��w�y�{M��:�%��r8�x;(�?����'��w�������6����0!+* �������,O����'M07
5��t���$�A��_L�"�X���^0�g�1iT��N����M����Bw=z�
� XfA52\�^����<�������m�k��5��+8�*���5��.�i;)�gO���\����{����?=�H�]%��Om`x���4���!���"��9
�x�H��Xi�MN�z�$�����w�N���.�����(	}G���������Y�.F�%���r��
#��J���v�VxCA������t��<y4s�m�a��8K(�n����������	�i7b��]�%�������b�G�����p�0c�&�`���j�����~���X-�9��/�A
 pC?
�����s��5�3��N�.N �E�4����FnD��)�G�J�S4r��<Js���9�Dc��X���U��%��=�9�3����Ca����2���iMh����2�Y�C�bz�����z�&?��rm���7i��4��5!k���3���s��8�������������p���g�������q�(
�l4�Y��{��-��6�����X�D����i�Ow�#	�L��B/�g��.�u�Cqv��\)�_aD7&!�"��4;x(�he[@Q������'���9����� `G>zf��5d+���Sg�!�&=������om���0A4I�X���h��m�lh�����,���������W�o�.0�s��x���3_���;Z���.`��������~��l=	��6$#XeY����W4u��j�9k~��*sr�J���
����akD-|��2���q�)s��'��$t��{�V��6�2��"�[��E��V,���s���?���O�F��"#{ZJ ~�t�6�A���R�%��i�w�"<�������LX�����2��	��k����z���E�M�B����gw�Z[5��ix%_6����n:��%/��Go�	��{z_8�������;q�r��ax��d��������eH3�e�	��s�A�
��OD����-�G�J����B�]IT^b������8!�;MP��c�!
E����{N"2q}�e
Q��v>��#5re��$���?�F�e+G��%U-&���0�Z�H-���!���5YI6�����A�%�8����@�G Lb�P����h����1��R)r��f>W��8
��`�xj��iP�41hT8+�����|��k��)�M�mH�W0�SIjG�����F���0������/�1=ElF�%�l�T�""hsi\�p�NG�����\���O)m�D�4/M�Ea��+������I����:��$�9��t�-�M���sWQ7����$Y����^Y�V%;������fI"��m�@i�~��/]G*��G�n�o����d������<���Co?JPGZ+Np�\�|�
���)8'��*� }�NL�% 4y�����=�ZX����{�.Z�]
�3���P�d����$�WD=�R�v��0CY�Se��h���*o"��V�ZNX��5�A��Kd$��q�0�����!9�NIv�d�"�Y�$�������xQ�]��9�[��$X���?��$s`ia�	[G
3�	V;lp����k�����x;�!,Bq6��*�*���`)�
�$�U�;$l����
�����5f������G�;���8��4��QL0��Jf���*��^B���Y�i��~-%"p#�4�p�b>k��}�<�������U�C/��2 �g@��	��x���xFq���������=��0��d'x?�����u��"D��~ ��U��!�G���,	�p �Cds�R�7|�l>
�ikprrt�.���������Df�A���L��B:gZ�����t�gJ*F�*�"+���8���B&J%�:}�d�E,g)nu5k���%�����}�$�X��O�B�,UX��(�t a}D�G�)�eu�Z��s��&:�0[VY
Q����0(��XS8\-�,���b��([���T�)J�P����O�?����IRp����Q����JX��w����qS�+Ei�����4%4��L4r�HM�e���+@�V�������n(��v$6�
�s����`)Z�d��+E���tZ�l�Q`H�Gn1J�Qipo����E,lU[4�g���_(�Y
����L�����cp������g	s N�F�#=������<%�`�C^��1u�<�xV'���$�����G,=�3/�	�Dx�G�n��(<�\���}8������w��<�����BY������!�ah����<����sX�N��&d��g�'�r�����l�
��KB�Y��
�<�p�����F�\DI
!��N0n�����0�2��/�Q�I�zcD��B���z��S�8at����^D��7�
X���������Lu~��G��*������������#=��j�R���b���A�x�2�q�&�Q�F6*q �����OpZ�,�p�F3��Z��.����2`�[F���g�B4f�j��C%�����D`t�c���RL�A2�d�$��2�P�f�~UEx��S�Vl����z��A��f�e���;8Nd�|�nm���,��J��(4��?�Z�@xt6��7E���g?��~�g���Wt����b�Y`#I�c0E:��VX7]}���T"� <=�8;thR��/:���r�Mck�8J}d����k*3b��Z�
Z�<�������O� v��a_:`i��A��r���iCSE@�������P��\4���,D2P9�������J4*��9�-�FA�htx]<b��5
�n�x��f%��ZF�^�&�f��={%9\9{0����0����lJJ@�9�-d7����_�e�����KI�=/���F�2q���y���u�i-�gf����hn�~���F��te�"�O����<QTt���/������jt�����$X�M!' Q9�$��m���O� Y�-������d5���%J����*Y��4�q:�H��*�-�v�O�/u��f������R���v���w}f�A���2���W����E��IBi�~�Y�9B&��+� u��	d2��N�y}7����}������A-�!��L��DRQN�u����(�,l�IL����Xhm�����������juHJmU+�V���d���x�M���H/�����ksLQ�F5rH���x08:�::<c�DSITP�6jtc�a����U��������:,67]��Ea��@��-�����2���3�n,�7�.���}�z!kM�P)l��6S�
�������[]
<��V�2`�*l~q��)f0gc�d�\����)XC����}��W��������
�A�7��
dyI$L�|��7�)8�Y��Q(�	u>�/�����pp2����8<z+L�n>zw:�y��{Xl���rgA�nm��G0o0���'��2b�W�:��8X�����i6aQ;���_�v��G<��wT���U�G�*p�g�(a��e����3�llqbefA���E*AVIB���	��v�&%�"�?��(�1�{qF��O<,H��^D�`tT���i|JM_���f�����^u�Q���B�{��N@����'�$���*%�Ej���0��`xF�NRv3'!�DZ�@A�����[Dzf���Y2����b[Y��$W6�����:����M�y�d�A��5��jLe����%�
�����l�� �T���5<�fG%�~Y�E�sQ�Dz����3��C����	���5���
���a���J0t��O(,�������X���P*v�����K�����\	Id>�����.��D��w�Gs�K#�:H5�j�8VY�6����/T[����JpZ"��)xw���k��#^XG����nI�M��v-�����7����������R��C��j�R��7���(��!��uk���O�Z�o���V������>��)���g��S���+������u���:������F'G2]���Q6G�U��V������0j���o�X�|��/��s���F\���Y����#�-r;����!�������%�����f�
F>D�"�'zN����7��]�s!�[Rm�J��J������	s��b�
��nOi�A>Z>��
���Vv);��H�
�����O�#�.�4V5�;����}zxT��7��u&/�=wq�G�x�����M_[)��'�UUo�\�h=���-K�L�Cv��=`����L�}B�W����W20��QaK���m!T�������n[��qFO�s��7%9i/e���T��[�+^�l����9rn���`B�f��-�V~V�����_��?\���W�|M�#��ozO�~�`��px:�|��0T%�MTE�t��J���6������Q��F�����I��y-��o�x��������!L;=9�+�T�U��n�[�q_���5�R1�j��0��N2M��<�i�9
~�T\O��x�� �gj��3v���
����-�����7����� �
��H3��)co]�9�A���)������,��+{���N�n��Uvw��s��j\���&�$�KYI��^����F�
}'0��r�Kv��7?���[�F�Zu�+���T�\X%�W ��1��C�leQZ��Y�w)������;����?�?~_���kd��	����P�tR)A$�0�pK\-��jr�n�$��mv�x�� Z`��+ePv����1P��T��j����h`�l�:�e)����0����5���H����\A3�-3��g*M�2����1�-EW�[���H.�V�5fA�t&���5*���l�W�M'��O�RdgI�O������-�qC	��I�w��+xS���)[�z�+%��(�.���T�N����\�/p������~a�v���N����@o���G]�Ve�� }��U��aS�������9������i�pA�3'%!�?��$�F�����}I�F$AP��Mkq-{U��z	2z�/����x��w�&��ip�!���W�=|���������[��/ic�G�N3��l��K���{��;��+�xj`�z�����:4���Z��G��-������/���?���s�2_�>�._�.�����d	��v�1��s�����-`�n�	{P����g��~	��1�
C�4�<:z3�=|5� $;8YT��u������	���n���#��wv�����k�s�������(�����Q�,���/\�7��Dx/������rXm�^������Vc��]�C���������A'.�L��wd�c���t���/P���[�(��;/�;H�]_ �m�,]�,�'���R�J�i~�,,�W$R�s�	y��TPi6���JP^j�r'����|H�EN���.'�48�+%����U�����=�W���?��BM�k!���8���{0�^�]�������e��O�!�$����/��V�J���sN���������������<����-��)<�i��^&�s�},��&�rn��Rx��IU�d�dt4���^U?]@0-�������T�?�����h��	�Hth���BF%�R���hT����y��*���nu�H��Y�8�;������}�2V�V�� {�?"��<}H�,d<�z��}�m+�J��N�������!%�B�����mY����R�py!�%:+�]Q�d����+a=��W�:i�/[5�
w�kp��$����s�f5���A�|��CT��2/(%��g%5,
��+l���G���+��<R�z�4�{�[�DCS��+��{S�)s���\����[h��JDDsb[wP�by�L�Q��$�i�Le7�)����2�����J��=Jy^:��+�+w�1y�h�����h��2l�r����`�^4��_�K�����m�B[��V.���;p�q�����<h_�M����]iZ.���V���/Ep������W��q�U�@�T�+�;������KW����������-��u����X�S_�=�e�N�����/]��3�(�����h7i�JYNt-@������tv����%��A�Jz'�����3�'c�[�K���IR'Kr$��#��8>�rna6;Fgi�KVY��c�?p��s!X�Y��l�
��dy}���JZH�T"�,}([o�V	V���WF]���M�/wj�p)��-��������f�-�:�����db*�������G!�Dc�������8e"�� p�)!dr����e����b*���3l����V��#�`ZN%��6��B�=+�R�f�y>h��:R�d�7�V�"UA����f�u����:��G�{��E�s�$H^^ ��k��f���+��Q��;J���u�P��]�7�T��������v�e6R_�;����u����4������Nhf�����f��N�8����7�^&�����e�F������s�<����?��G����������C�i���{vq*�s���U��LO�
����ie5���[�x�g���*-����N���!Kp�l�p�������J�cF���ox��-��[\jyw�3��1�-����r&`���`�_s�CcX.������s�����s[��F.��C��n���\��0����$���Q���k�v.�^pg��\P��n0�&�\�'���<w�:q	��D6�6��{���]����,��I��(J[8�p��7qu�r���d�3�1sJ�����TM6�B�Al�����9Rh�#]�LJ�{y��v��������U���Gqh{~\fmDm�<��m��#�p��N�%����B=
����_�fh�D����o6�NlCFL�O��8����[�L7Lw����u0qE���e�?2���CVR�	�_BX8�p�q��o��;;����w�+S��-������TK���2��d��V%]�}]|tH�H���/������6b����Cc��\'���
oHm�g^@J3�} ��<��u�i����?%~��������0�y�vzQ�c��B�l&��PeF�~��9YS�"t���-��c7����ek���ig*����Mhu �sCIT�-�5��`�g�[��	�%-�5��d&O>L3m�b7����e�6DV����{��k�������1V�h��&'�yE:��!���H�n�1�r�ll�U�~�E�V�.��T�4��-�VK1E��c�#5xg��������[�~�����F�]H��"l;D����Rk&~��NS�+Gi�~F�������V;�jG[�h_~G�}�m�;����W<0,�(����n����� �s2�"�Z�Y������O�	)��5eM@�a�`��CROD�������1�4s�]Q�D�p��R����n�6\^��9s�Y�I^G;��+��
�*�f�T��\��(�)��[���C\_�j������lY��B��%d��K_�u����cR�4��Le8��'��5�,m�*��������V��bB������O
��4T�����P��F��3.[��'�+�N�h�j
1n}���Y����6��.�Me`O�0����Ii.>��o�<������#
��^��\��{�M���{�$�E���-��P�<S�@-�T����Zf��N��z�k�>U5/
!���~��5��qmS�@$����T�QxV��,tmAS�/�p�rR�>��9F������s������
[���zu����*�����bb��eh!�����EhC,udT�����*nw�����:�/������C�?�������k/x��-�|]V��"��`}P�-9���]�#�(�a_o�\3�sHe"V�.�^AQ)����4��Ym!lf�b�����9,�)��|,�n~����	,��
����/����X�@!�E�+��;!�����e�%���,i$z�$���
�D�eP�B�R^�_Z�����>eE[IA���	@O��&�!����ft���qu�����X��L;S�3��7����Q	�E8N�:���"l�b������p���2[�{4
ys�kt��<�e<�d���yfi�C4h�<��D�5���w�=��� z�e�NZ�����(�'PJ[W����X�����b7���]x~��+�0�j��KQLx�{1�����DO4x)���_`F�����,>��� ��#���9F�U
@T60�y/c���	$myH���xB,p����=e�JM�@��d��x�y�{�����0���)j�<qZ�[��b|R�p�������X�4��j��tTT�����_}�d|�w��`=�������+9��6U9�u!3J>7���	Hswd!��x����'l���v�����0��'<L��'�	4��#(���Hg%��6T+9,y>	6+f
�I�T�Ye_��3)���cr(�[rlO��2��j�:�Z����wo��y��Enq��}�\T���?�f*�	z�Q��
/
���)3+�!V|^x��"D|���G���S�9����KL�G%���V�g��X2�8<j�H�$1"�[R������K<�V�=<���Jd��tR��yK���_Um���+���&�C�As�������h5��ES��[���-;F�?�"������{��@�����\.�F�Q*���"}��n�b���^��`r�����,��X�������e�������|���5��F��� ���.��+������b O8�2��#�L��&��2����H�L�w"�D�%>�2W��v��j�=a�r������������B��0�e���C�(�Gj\���8�Nf�6����J�C���+D��q�h�N�R'*���������J}$���l�� !$�&�����;���p�%XO������P��P$�M�1)%o�B���u�����>����I^��2�T.�#0��(�3�D_B��!`+��(��d��7OpR������`�H������ww��AQH���RH%CzA��e���LRe��D�e,�h��n�����y�������B8�D����Mv2�D��T��e��]�E���(F�g\����6����]�z�@����?���o��N���2���V9#�e�U�5��0�T������L�]|���,�R���`l=�����'������s�B-����>�m��FeVK�-{�?�:��f��+�Vdb����A�7�]I[U�4�mK��U��[�8�W�g��P�S%��$��u�T��$��IP���r���)$�8��j�� �sP����>�|)�����4��X��,cHfY��-C�0��]���-�����y��q�U�i������J���z��f�|5���J������T�s���N�t���`:�/�	��C��hJ�L�*vp/DQ�����-m%�V'n*�vFV�C���D�X������Pwi���
��}{r���~�sO\�����@@Db���Q�cR�wB�������'7���5���reCrVL@�"g��j��9�3X6Z�89�H%s�wG���:P~@g �����L�����3���K����y��p�I~�;�^���
��Xh���5���m!.rG����|��I�g�Bp1�@
^����e[�}��S��	3������u��U�~��y4?�Jj/iS���y�sm����E�~���Eg���P����;�
���� �#�N��T�?K<�M|��s�N�G
�V��)���1����`L��c�c�=�\_�@��cX�@�����S������Q�z����Yc�,�3�`��"��F����9o��5�������_y���a���R8K>�E���0�;a!�����5�?��i�d�1/)���~�~�imoE��Rpt�$E@�$�5\���g+�E4�����LG&Us����$K�W;�(���5����t����~�I�e��?s�<�<Z��}RK�H�;������>� ��u��N�C��C��%K�1�X�d���t��@})�\�~�l���(������Q?iE����j���uzh�3���L\8{B�
{����w�xK�3���t�n^2�J��$G
�V���|�o�x�)R#�&��;��`1FV�=Bf���{a�����+E��(�N	�����`��Q��_�Tu��9q/�5	��A`�+,���*��e��T,��� ��5��N�~<u�AxO`�����j^V���5x
�	��m��]!2��W��D��De���������8��f���G�	�����U��I=F�C��{+����>R<�	�[���"l={�M�T�1���B�.H������s,X��M@�`��]@��EBQ�7��H��`4�`=;�8'�!�sh�k���WCCv�eYO��xp���j�sE��*�F�^#���� �A��`F��"�f��\>��&�$��!j�����HH�\�"���[���`����(n�g�62��x>�n���gO68����:�'��?,�M�	D$�����
Fl�g|��4QU�8L?�����`��I�����1t���s�!�h�1C��9]q_��.3��4p/lB3�|�!~�C�}C�Q�����NAi�3
�r�1h�IH~2uw�<O���GVo������*Z��_'��e�6a}����	sx�pP���~T{��������-i�e����_2��Q����N��HiI_S��$'��{#��-Y��
����"�u�NQ����(��J�d�\8'�"�%M�hg���"�����ck{�
��Q�<��{���,�&����*��k��~�C����~�|o�Y���Vk����Qc8~n�wv��k���E��mnn���[���[��M�7����x[��� r�R��h5���wI�]�D?h�N/��Y��-�n��4�"���1��:�����:����5|9�Z���9@
�	��#�i|��d@^4$O�1�����q�ma	� D�,������W3'!�k�w��7��:�������;�S�L:�&����n}�am��"J"��k�]
�A�#��,t/��G��#|��z��'�g����S���cd~�.BVh��h�����l��������t[�A���$���t�p~��?�{�����ux�8�Ej!���t�������e����y�?�w?)c��$�?�����[�(+Zh����|g2�O���,�����5�KNJ��������k�j���a�q�{�&�<H	��Rxv���`:��$���x�X0`�kh��z46���y��@h����	�1���4}�����),Lg�hJ���"/�������d]"�2�)���S��	�C���u�7j����xog�g�S
������P����J��tO��
u����xi�d������O�r0r�Z�Z��]7�F���z�C���n
����B�K@���'bg��={8q���������GoE�e;�L[
���[*"d���rq�@��`*8������C�3�<&��)x�PW)���16����=D�s��F���l��a��A~�����C��nT���	4�;���H�y��3=�!Jd�t���z���c��Gk�V�2����k����/�w�i���K5��D��U�{��gb*�Pb{�����b�Q��q��C�V��w��t0�dcK�����0�����6��
ci+(T=����i>1��g�^��	���
���f����c�&�b��=>��D/�����|��i��|5����Y����k��3��]5�w����
k#/�����A���&B
0008-Centralize-slot-deforming-logic-a-bit.v4.patch.gzapplication/x-patch-gzipDownload
0009-WIP-Make-scan-desc-available-for-all-PlanStates.v4.patch.gzapplication/x-patch-gzipDownload
0010-JITed-tuple-deforming.v4.patch.gzapplication/x-patch-gzipDownload
0011-Simplify-aggregate-code-a-bit.v4.patch.gzapplication/x-patch-gzipDownload
0022-WIP-Faster-order.v4.patch.gzapplication/x-patch-gzipDownload
0012-More-efficient-AggState-pertrans-iteration.v4.patch.gzapplication/x-patch-gzipDownload
0013-Avoid-dereferencing-tts_values-nulls-repeatedly-i.v4.patch.gzapplication/x-patch-gzipDownload
0014-WIP-Expression-based-agg-transition.v4.patch.gzapplication/x-patch-gzipDownload
0015-Hacky-Preliminary-inlining-implementation.v4.patch.gzapplication/x-patch-gzipDownload
0016-WIP-Inline-ExecScan-mostly-to-make-profiles-easie.v4.patch.gzapplication/x-patch-gzipDownload
����Y0016-WIP-Inline-ExecScan-mostly-to-make-profiles-easie.v4.patch�<�r�F���WL|�bJ !��'){e{�Z�q$e����	6 �H�����=3�@R�YU�P@OOO�{�Go�`C��i�V��k�6g�1���XK6w�5���V��9����$����GM��o�3���#�7K}��/����>��������+��g�:ec2%�X	d���l�l6#m�i�������������?}qf�&�_�F.|��y��YW�G'd�	��{ I@6�#a8�t0�,���Q�D_��m�(N&�!�#����'��g��I�/8�j���b�
�L~v�����M64���0.a��t�t���m��4�{�y���%���I����{�� b��_������7�
��9��Ce`�q[����n���!�<�x�=��npLm��������E���������v����'�R������S������-/�Y�=�������=�Zp��&\�|��&�Y���a��3��~�"��#�d�j�fO&'Cb��J��"��ip��m�q�dr�&��u�2�b��q���X������.��+}=�4����k�1��d��������x1$�#�K����o����'CR~� �'Ce�{��'��t�����i�z���m�1-Rh,��zEc9��8�qBI<7N>lhb���xTs����U��<
�1y0����	wA��F~0����!r��s\�prv:���<��a0���Y�@�Ei���{��w>���0H����#�W!
�����I�� ��W+�-��&�nrK���7��7���@@\��3B#�
��VQ����.�����J%�"���J?B0!Bb|r/-�le�i�����$�*��
'�����S�M]yA����f��$��Q����`@r��������V��@�(�z2T�fV*3�~�����Q�N^i�<��vj>G���^���vr�b>�'���*��rM�UF�smqR��I�O&?�P�����O������/�.�]���������s�@)Fb�����,����|�y�����2R�����?q=uv������@��q�rI���h��S�;W�n��dI�\+�-��.�u=$mL�&�!�v�?H�M��N��Y��Z��r��"���!Z"�#�� ""������`��4&a��E���O���1p}�e���m��	.t��w ����a�@�K�&&J�	*�A�(�3>�����)/8,&:(Q �D� ���&�OE�p��t0
*�w�����7'>��	�4�s�������y�@����q��D������_%��c�g�
��s7���W,�W��	���4��hR�F���~�X��3H�8V�$�c�O�9J�$��P\�����P#^�#x�?���#DtJ��6a��	�b��u�CA:��Mb�����B�%	y��������!�2�q&�4Ar�[�'�� Hp���^tl)�A+��������]�r��q�~�o�-�������J��K�|-[s��c���h#�Y�uD0�
��J�n�
7(�8�!sZwx
���n�dZ��������[�8,�+sio�&����\��K��\T��q��Ez.3�RJS��o�s��O�_��w8�zfA�.�Gc�^���7���C����ZGn��7�a����,�d����N�rB.�W$V��C��VaRa�Y)9�o��	<��M�,�?��w���k���3�=W/����a�w���l����Kn1�A���r|��]���/������^q�����@^y��3b����J#��<��P(C��pM��i,�Y��%yZ����
��<�1�.�$X� �tX�0���&����S�CF�*HA�D���K�-�a>J�o&��glW�%��sd���8���Fq=�H���0|���L
� �C�MI�<�gP�0������P���w��/z�&�W_�L���T����@0Fe��Wi4��=6�w�(��QN���������]��m�c�l��:�����1�����0�'h#������&r�|�g����0��	�)h�G�&62?(v�l�P��.)wj\aK��U�]x_�0�����V��Q��	����Am�M�����<����VD�PN/��0Q?�ga�|cr,����<�U��n![�~'*�&"z/�M�e�9<�����|��/!.Y���rGGD�ZJ��
3�)k��Za���,�{u����2��j��1�y�8�	���[���U��T����LH��TS��*��uy%"1df��l���6B�����P�U>
����8fq��1XSX$U�[F���Bh*�}Y��%�os�N^�V2�b�h���<i�K_$P@VHG|���[��$���3@�p��:C���X"1���t����9)�\�AR/Z �d
���~���Y�K������7*�?����;��������� �T�a�^�Q.�+��L�K��A��S4Q�3k(-&ST�����d��)�G>��%Y���������C��@������rb�]�bi�	�����7MG'�=�O6WD��*PrT�}@�����c��#��m�4��`HM������|�R��/�$7������7vP�j%���N��T��.�'F���FDc�����RR��8<����z��]���PVP'��"~���6�?�����JN�3F�*[l�[t�J.����������|�z*��KG�o9%���P���\,��V�@�$��P�������T��@e��
��>�.vJ6���P���1ci��3��Z����qh#����Fx<��ixD
��#R��� ���9�K(��nj/+g�63��=Q���w���S�������������/W��2L��QC�����K�e���Y���
'|v��H�*�j�T�i?�
I-�������j5�-6WU}�,k1�g���*�u���
	�����OFM���y����x	#9>���b��sMUm��M}�X[}9���bx����A������4��ym>��>�&���"�����������'�j�\�*�R@��X�����2�p�����UvH�
�=��{��_�����*�#��9�=
�����b��&�q�)��W����U����.
�Y�Tc������
�[�7g����>JPezj��W�"��
�CF�6�&�@��f���0�L��
_eKg���Re����(�)��t[N}r�;7vM�s���4�����d=S��$o�^��z��,U5gl����1�G�{��hY������d��&�X�-n��" ��f�N6��4V�ta���BUW��i�M��4�w��y�Cn�D�>���5��wn�x��_��>�����@�v
e�>S��������oJY��!�
,���kuX�o����3%z�M�\\"h�Z$�eS��`��BD�W�5���[\9�.Y��<[�M��zw
�,������&��d�����km��@�u�3_��U�3j-����s�a�D�K����m6����$�������nf���LO���Y�
L�j������2W�z	�R[OMK[��;�(;�V�r�q������}T�V�l �������Fq��]P^�-������Sm>�s���KY��r@.�9�|W4�b�$���0+����e���FA���?,:�P{�m��_-,�e���0�3��W��������7���^�������=M�})0��i�n�	U�u-,��f;RKf��&]�����l�kN{J���C(u�����JSk�BP�+���Uy���.6�]C���{����W����Zsf:�
�Ewf��3<�-I�m�6�@c�Z	Q�N�m�*���}ENIiF�u@�mW&{�b�aD	?
�a>����.��P^��7eHL���x����G�����'��6�'�� �����7T�O$����VWJFE1�h��y��0b$�8IQ�����>[q,\������2�\P1l��8�>�R�y>�5������	^�7��_������W��yA�$�{�a���\2Ag�����b7y�'��� �]���^�z����������_�e��P@9�QU�l���
n�0���.oDZp���)��B�����z�E�`�uC	Z�t������T*�af���L��p�T9������S!�����K�����~Z�u������	p�nm*�Jf
����z}����=�U5C`���qncf�����4��������Zz�����D;�����j�uB���x��E�����|z|G�Ri��|T��rt�����_9��_y����uG4�+�6�+�6�������Gj�WZ�����M��#4�+�6�+����_xi�,G^P�2�,�4_P�(-W�^��
@����(�W�^W�t<JK�rHK��]-�2��5F*��o�c[��Z����.�D�#��+�-�UyK{���R�C�����#������~�����z���5��+!�Z��rx���5X�q�������/���_���~>����~��������*�������z��+�|�}�2|G��g(j����DBG��2�W�u�&��~�F:r%���|��~�����_hC{X���L��O����%) ������1�-�����Z3����K���cTB��}}1^e�������y���\/~���6�K�eW,]	��l��(�xH�x����$�N��@(	�w�s�n/F]���������?��c�jg���G�:�Q�TN�}��dD�I�j�����c�4���g��P��mM�Mk�[,24T}���|�Po���X��T��M���8
R�U
0017-WIP-Do-execGrouping.c-via-expression-eval-machine.v4.patch.gzapplication/x-patch-gzipDownload
0018-WIP-deduplicate-int-float-overflow-handling-code.v4.patch.gzapplication/x-patch-gzipDownload
0019-Make-timestamp_cmp_internal-an-inline-function.v4.patch.gzapplication/x-patch-gzipDownload
0020-Make-hot-path-of-pg_detoast_datum-an-inline-funct.v4.patch.gzapplication/x-patch-gzipDownload
0021-WIP-Inline-additional-function.v4.patch.gzapplication/x-patch-gzipDownload
#15Ants Aasma
ants.aasma@eesti.ee
In reply to: Andres Freund (#14)
Re: JIT compiling - v4.0

On Wed, Oct 4, 2017 at 9:48 AM, Andres Freund <andres@anarazel.de> wrote:

Here's an updated version of the patchset. There's some substantial
changes here, but it's still very obviously very far from committable as
a whole. There's some helper commmits that are simple and independent
enough to be committable earlier on.

Looks pretty impressive already.

I wanted to take it for a spin, but got errors about the following
symbols being missing:

LLVMOrcUnregisterPerf
LLVMOrcRegisterGDB
LLVMOrcRegisterPerf
LLVMOrcGetSymbolAddressIn
LLVMLinkModules2Needed

As far as I can tell these are not in mainline LLVM. Is there a branch
or patchset of LLVM available somewhere that I need to use this?

Regards,
Ants Aasma

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#16Andres Freund
andres@anarazel.de
In reply to: Ants Aasma (#15)
6 attachment(s)
Re: JIT compiling - v4.0

On 2017-10-04 11:56:47 +0300, Ants Aasma wrote:

On Wed, Oct 4, 2017 at 9:48 AM, Andres Freund <andres@anarazel.de> wrote:

Here's an updated version of the patchset. There's some substantial
changes here, but it's still very obviously very far from committable as
a whole. There's some helper commmits that are simple and independent
enough to be committable earlier on.

Looks pretty impressive already.

Thanks!

I wanted to take it for a spin, but got errors about the following
symbols being missing:

LLVMOrcUnregisterPerf
LLVMOrcRegisterGDB
LLVMOrcRegisterPerf
LLVMOrcGetSymbolAddressIn
LLVMLinkModules2Needed

As far as I can tell these are not in mainline LLVM. Is there a branch
or patchset of LLVM available somewhere that I need to use this?

Oops, I'd forgotten about the modifications. Sorry. I've attached them
here. The GDB and Perf stuff should now be an optional dependency,
too. The required changes are fairly small, so they hopefully shouldn't
be too hard to upstream.

Please check the git tree for a rebased version of the pg patches, with
a bunch bugfixes (oops, some last minute "cleanups") and performance
fixes.

Here's some numbers for a a TPC-H scale 5 run. Obviously the Q01 numbers
are pretty nice in partcular. But it's also visible that the shorter
query can loose, which is largely due to the JIT overhead - that can be
ameliorated to some degree, but JITing obviously isn't always going to
be a win.

It's pretty impressive that in q01, even after all of this, expression
evaluation *still* is 35% of the total time (25% in the aggregate
transition function). That's partially just because the query does
primarily aggregation, but also because the generated code can stand a
good chunk of improvements.

master q01 min: 14146.498 dev min: 11479.05 [diff -23.24] dev-jit min: 8659.961 [diff -63.36] dev-jit-deform min: 7279.395 [diff -94.34] dev-jit-deform-inline min: 6997.956 [diff -102.15]
master q02 min: 1234.229 dev min: 1208.102 [diff -2.16] dev-jit min: 1292.983 [diff +4.54] dev-jit-deform min: 1580.505 [diff +21.91] dev-jit-deform-inline min: 1809.046 [diff +31.77]
master q03 min: 6220.814 dev min: 5424.107 [diff -14.69] dev-jit min: 5175.125 [diff -20.21] dev-jit-deform min: 4257.368 [diff -46.12] dev-jit-deform-inline min: 4218.115 [diff -47.48]
master q04 min: 947.476 dev min: 970.608 [diff +2.38] dev-jit min: 969.944 [diff +2.32] dev-jit-deform min: 999.006 [diff +5.16] dev-jit-deform-inline min: 1033.78 [diff +8.35]
master q05 min: 4729.9 dev min: 4059.665 [diff -16.51] dev-jit min: 4182.941 [diff -13.08] dev-jit-deform min: 4147.493 [diff -14.04] dev-jit-deform-inline min: 4284.473 [diff -10.40]
master q06 min: 1603.708 dev min: 1592.107 [diff -0.73] dev-jit min: 1556.216 [diff -3.05] dev-jit-deform min: 1516.078 [diff -5.78] dev-jit-deform-inline min: 1579.839 [diff -1.51]
master q07 min: 4549.738 dev min: 4331.565 [diff -5.04] dev-jit min: 4475.654 [diff -1.66] dev-jit-deform min: 4645.773 [diff +2.07] dev-jit-deform-inline min: 4885.781 [diff +6.88]
master q08 min: 1394.428 dev min: 1350.363 [diff -3.26] dev-jit min: 1434.366 [diff +2.78] dev-jit-deform min: 1716.65 [diff +18.77] dev-jit-deform-inline min: 1938.152 [diff +28.05]
master q09 min: 5958.198 dev min: 5700.329 [diff -4.52] dev-jit min: 5491.683 [diff -8.49] dev-jit-deform min: 5582.431 [diff -6.73] dev-jit-deform-inline min: 5797.475 [diff -2.77]
master q10 min: 5228.69 dev min: 4475.154 [diff -16.84] dev-jit min: 4269.365 [diff -22.47] dev-jit-deform min: 3767.888 [diff -38.77] dev-jit-deform-inline min: 3962.084 [diff -31.97]
master q11 min: 281.201 dev min: 280.132 [diff -0.38] dev-jit min: 351.85 [diff +20.08] dev-jit-deform min: 455.885 [diff +38.32] dev-jit-deform-inline min: 532.093 [diff +47.15]
master q12 min: 4289.268 dev min: 4082.359 [diff -5.07] dev-jit min: 4007.199 [diff -7.04] dev-jit-deform min: 3752.396 [diff -14.31] dev-jit-deform-inline min: 3916.653 [diff -9.51]
master q13 min: 7110.545 dev min: 6898.576 [diff -3.07] dev-jit min: 6579.554 [diff -8.07] dev-jit-deform min: 6304.15 [diff -12.79] dev-jit-deform-inline min: 6135.952 [diff -15.88]
master q14 min: 678.024 dev min: 650.943 [diff -4.16] dev-jit min: 682.387 [diff +0.64] dev-jit-deform min: 746.354 [diff +9.16] dev-jit-deform-inline min: 878.437 [diff +22.81]
master q15 min: 1641.897 dev min: 1650.57 [diff +0.53] dev-jit min: 1661.591 [diff +1.19] dev-jit-deform min: 1821.02 [diff +9.84] dev-jit-deform-inline min: 1863.304 [diff +11.88]
master q16 min: 1890.246 dev min: 1819.423 [diff -3.89] dev-jit min: 1838.079 [diff -2.84] dev-jit-deform min: 1962.274 [diff +3.67] dev-jit-deform-inline min: 2096.154 [diff +9.82]
master q17 min: 502.605 dev min: 462.881 [diff -8.58] dev-jit min: 495.648 [diff -1.40] dev-jit-deform min: 537.666 [diff +6.52] dev-jit-deform-inline min: 613.144 [diff +18.03]
master q18 min: 12863.972 dev min: 11257.57 [diff -14.27] dev-jit min: 10847.61 [diff -18.59] dev-jit-deform min: 10119.769 [diff -27.12] dev-jit-deform-inline min: 10103.051 [diff -27.33]
master q19 min: 281.991 dev min: 264.191 [diff -6.74] dev-jit min: 331.102 [diff +14.83] dev-jit-deform min: 373.759 [diff +24.55] dev-jit-deform-inline min: 531.07 [diff +46.90]
master q20 min: 541.154 dev min: 511.372 [diff -5.82] dev-jit min: 565.378 [diff +4.28] dev-jit-deform min: 662.926 [diff +18.37] dev-jit-deform-inline min: 805.835 [diff +32.85]
master q22 min: 678.266 dev min: 656.643 [diff -3.29] dev-jit min: 676.886 [diff -0.20] dev-jit-deform min: 735.058 [diff +7.73] dev-jit-deform-inline min: 943.013 [diff +28.07]

master total min: 76772.848 dev min: 69125.71 [diff -11.06] dev-jit min: 65545.522 [diff -17.13] dev-jit-deform min: 62963.844 [diff -21.93] dev-jit-deform-inline min: 64925.407 [diff -18.25]

Greetings,

Andres Freund

Attachments:

0001-ORC-Add-findSymbolIn-wrapper-to-C-bindings.patchtext/x-diff; charset=us-asciiDownload
From f636e4caf62ed2a29851b9cca8bb664df73c7bb9 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 4 Oct 2017 15:36:51 -0700
Subject: [PATCH 1/6] [ORC] Add findSymbolIn() wrapper to C bindings.

---
 include/llvm-c/OrcBindings.h                |  5 +++++
 lib/ExecutionEngine/Orc/OrcCBindings.cpp    |  8 ++++++++
 lib/ExecutionEngine/Orc/OrcCBindingsStack.h | 22 ++++++++++++++++++++++
 3 files changed, 35 insertions(+)

diff --git a/include/llvm-c/OrcBindings.h b/include/llvm-c/OrcBindings.h
index abb3ac6a7f0..4ff1f47e87d 100644
--- a/include/llvm-c/OrcBindings.h
+++ b/include/llvm-c/OrcBindings.h
@@ -170,6 +170,11 @@ LLVMOrcErrorCode LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef JITStack,
                                          LLVMOrcTargetAddress *RetAddr,
                                          const char *SymbolName);
 
+LLVMOrcErrorCode LLVMOrcGetSymbolAddressIn(LLVMOrcJITStackRef JITStack,
+                                           LLVMOrcTargetAddress *RetAddr,
+                                           LLVMOrcModuleHandle H,
+                                           const char *SymbolName);
+
 /**
  * Dispose of an ORC JIT stack.
  */
diff --git a/lib/ExecutionEngine/Orc/OrcCBindings.cpp b/lib/ExecutionEngine/Orc/OrcCBindings.cpp
index f945acaf95e..9b9c1512402 100644
--- a/lib/ExecutionEngine/Orc/OrcCBindings.cpp
+++ b/lib/ExecutionEngine/Orc/OrcCBindings.cpp
@@ -120,6 +120,14 @@ LLVMOrcErrorCode LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef JITStack,
   return J.findSymbolAddress(*RetAddr, SymbolName, true);
 }
 
+LLVMOrcErrorCode LLVMOrcGetSymbolAddressIn(LLVMOrcJITStackRef JITStack,
+                                           LLVMOrcTargetAddress *RetAddr,
+                                           LLVMOrcModuleHandle H,
+                                           const char *SymbolName) {
+  OrcCBindingsStack &J = *unwrap(JITStack);
+  return J.findSymbolAddressIn(*RetAddr, H, SymbolName, true);
+}
+
 LLVMOrcErrorCode LLVMOrcDisposeInstance(LLVMOrcJITStackRef JITStack) {
   auto *J = unwrap(JITStack);
   auto Err = J->shutdown();
diff --git a/lib/ExecutionEngine/Orc/OrcCBindingsStack.h b/lib/ExecutionEngine/Orc/OrcCBindingsStack.h
index 405970e063d..6eaac01d52f 100644
--- a/lib/ExecutionEngine/Orc/OrcCBindingsStack.h
+++ b/lib/ExecutionEngine/Orc/OrcCBindingsStack.h
@@ -354,6 +354,28 @@ public:
     return LLVMOrcErrSuccess;
   }
 
+
+  LLVMOrcErrorCode findSymbolAddressIn(JITTargetAddress &RetAddr,
+                                       ModuleHandleT H,
+                                       const std::string &Name,
+                                       bool ExportedSymbolsOnly) {
+    RetAddr = 0;
+    if (auto Sym = findSymbolIn(H, Name, ExportedSymbolsOnly)) {
+      // Successful lookup, non-null symbol:
+      if (auto AddrOrErr = Sym.getAddress()) {
+        RetAddr = *AddrOrErr;
+        return LLVMOrcErrSuccess;
+      } else
+        return mapError(AddrOrErr.takeError());
+    } else if (auto Err = Sym.takeError()) {
+      // Lookup failure - report error.
+      return mapError(std::move(Err));
+    }
+    // Otherwise we had a successful lookup but got a null result. We already
+    // set RetAddr to '0' above, so just return success.
+    return LLVMOrcErrSuccess;
+  }
+
   const std::string &getErrorMessage() const { return ErrMsg; }
 
 private:
-- 
2.14.1.536.g6867272d5b.dirty

0002-C-API-WIP-Add-LLVMGetHostCPUName.patchtext/x-diff; charset=us-asciiDownload
From 98716f882cf08f521dc8e57693d224006e3f3b68 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 4 Oct 2017 23:38:46 -0700
Subject: [PATCH 2/6] [C-API] WIP: Add LLVMGetHostCPUName().

---
 include/llvm-c/TargetMachine.h | 4 ++++
 lib/Target/TargetMachineC.cpp  | 8 ++++++++
 2 files changed, 12 insertions(+)

diff --git a/include/llvm-c/TargetMachine.h b/include/llvm-c/TargetMachine.h
index f4f7f7698c4..44f6b8babd1 100644
--- a/include/llvm-c/TargetMachine.h
+++ b/include/llvm-c/TargetMachine.h
@@ -137,6 +137,10 @@ LLVMBool LLVMTargetMachineEmitToMemoryBuffer(LLVMTargetMachineRef T, LLVMModuleR
   disposed with LLVMDisposeMessage. */
 char* LLVMGetDefaultTargetTriple(void);
 
+/** Get the host CPU as a string. The result needs to be disposed with
+  LLVMDisposeMessage. */
+char* LLVMGetHostCPUName(void);
+
 /** Adds the target-specific analysis passes to the pass manager. */
 void LLVMAddAnalysisPasses(LLVMTargetMachineRef T, LLVMPassManagerRef PM);
 
diff --git a/lib/Target/TargetMachineC.cpp b/lib/Target/TargetMachineC.cpp
index 210375ff828..63d0bbf74bc 100644
--- a/lib/Target/TargetMachineC.cpp
+++ b/lib/Target/TargetMachineC.cpp
@@ -238,6 +238,14 @@ char *LLVMGetDefaultTargetTriple(void) {
   return strdup(sys::getDefaultTargetTriple().c_str());
 }
 
+/** Get the host CPU as a string. The result needs to be disposed with
+  LLVMDisposeMessage. */
+char* LLVMGetHostCPUName(void)
+{
+  /* XXX: verify it's null terminated */
+  return strdup(sys::getHostCPUName().data());
+}
+
 void LLVMAddAnalysisPasses(LLVMTargetMachineRef T, LLVMPassManagerRef PM) {
   unwrap(PM)->add(
       createTargetTransformInfoWrapperPass(unwrap(T)->getTargetIRAnalysis()));
-- 
2.14.1.536.g6867272d5b.dirty

0003-C-API-Add-LLVMLinkModules2Needed.patchtext/x-diff; charset=us-asciiDownload
From c0cb3ec7472d4667226d0183382e165a7a6d2c30 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 4 Oct 2017 12:55:38 -0700
Subject: [PATCH 3/6] [C API] Add LLVMLinkModules2Needed().

---
 include/llvm-c/Linker.h    | 1 +
 lib/Linker/LinkModules.cpp | 6 ++++++
 2 files changed, 7 insertions(+)

diff --git a/include/llvm-c/Linker.h b/include/llvm-c/Linker.h
index d02c37f94c8..06af8193e57 100644
--- a/include/llvm-c/Linker.h
+++ b/include/llvm-c/Linker.h
@@ -33,6 +33,7 @@ typedef enum {
  * Use the diagnostic handler to get any diagnostic message.
 */
 LLVMBool LLVMLinkModules2(LLVMModuleRef Dest, LLVMModuleRef Src);
+LLVMBool LLVMLinkModules2Needed(LLVMModuleRef Dest, LLVMModuleRef Src);
 
 #ifdef __cplusplus
 }
diff --git a/lib/Linker/LinkModules.cpp b/lib/Linker/LinkModules.cpp
index 25f31a3401a..9a34c9ecce8 100644
--- a/lib/Linker/LinkModules.cpp
+++ b/lib/Linker/LinkModules.cpp
@@ -604,3 +604,9 @@ LLVMBool LLVMLinkModules2(LLVMModuleRef Dest, LLVMModuleRef Src) {
   std::unique_ptr<Module> M(unwrap(Src));
   return Linker::linkModules(*D, std::move(M));
 }
+
+LLVMBool LLVMLinkModules2Needed(LLVMModuleRef Dest, LLVMModuleRef Src) {
+  Module *D = unwrap(Dest);
+  std::unique_ptr<Module> M(unwrap(Src));
+  return Linker::linkModules(*D, std::move(M), Linker::Flags::LinkOnlyNeeded);
+}
-- 
2.14.1.536.g6867272d5b.dirty

0004-MCJIT-Call-JIT-notifiers-only-after-code-sections-ar.patchtext/x-diff; charset=us-asciiDownload
From 389e5cca8e5145c9378730479de4b42870a8b347 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 1 Feb 2017 21:18:54 -0800
Subject: [PATCH 4/6] [MCJIT] Call JIT notifiers only after code sections are
 ready.

Previously JIT notifiers were called before relocations were
performed (leading to ominious function call of "0"), and before
memory marked executable (confusing some profilers).

Move notifications to finalizeLoadedModules().
---
 lib/ExecutionEngine/MCJIT/MCJIT.cpp | 16 ++++++++++++++--
 lib/ExecutionEngine/MCJIT/MCJIT.h   |  2 ++
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/lib/ExecutionEngine/MCJIT/MCJIT.cpp b/lib/ExecutionEngine/MCJIT/MCJIT.cpp
index 1164d60ffc1..2dd92164794 100644
--- a/lib/ExecutionEngine/MCJIT/MCJIT.cpp
+++ b/lib/ExecutionEngine/MCJIT/MCJIT.cpp
@@ -222,8 +222,10 @@ void MCJIT::generateCodeForModule(Module *M) {
   if (Dyld.hasError())
     report_fatal_error(Dyld.getErrorString());
 
-  NotifyObjectEmitted(*LoadedObject.get(), *L);
-
+  // Can't call notifiers yet as relocations have not yet been performed, and
+  // memory hasn't been marked executable.
+  PendingLoadedObjects.push_back(LoadedObject->get());
+  PendingLoadedObjectInfos.push_back(std::move(L));
   Buffers.push_back(std::move(ObjectToLoad));
   LoadedObjects.push_back(std::move(*LoadedObject));
 
@@ -243,6 +245,16 @@ void MCJIT::finalizeLoadedModules() {
 
   // Set page permissions.
   MemMgr->finalizeMemory();
+
+  // Notify listeners about loaded objects now that memory is marked executable
+  // and relocations have been performed.
+  for (size_t i = 0; i < PendingLoadedObjects.size(); i++) {
+    auto &Obj = PendingLoadedObjects[i];
+    auto &Info = PendingLoadedObjectInfos[i];
+    NotifyObjectEmitted(*Obj, *Info);
+  }
+  PendingLoadedObjects.clear();
+  PendingLoadedObjectInfos.clear();
 }
 
 // FIXME: Rename this.
diff --git a/lib/ExecutionEngine/MCJIT/MCJIT.h b/lib/ExecutionEngine/MCJIT/MCJIT.h
index daf578f5daa..418578fc7a3 100644
--- a/lib/ExecutionEngine/MCJIT/MCJIT.h
+++ b/lib/ExecutionEngine/MCJIT/MCJIT.h
@@ -189,6 +189,8 @@ class MCJIT : public ExecutionEngine {
   SmallVector<std::unique_ptr<MemoryBuffer>, 2> Buffers;
 
   SmallVector<std::unique_ptr<object::ObjectFile>, 2> LoadedObjects;
+  SmallVector<object::ObjectFile*, 2> PendingLoadedObjects;
+  SmallVector<std::unique_ptr<RuntimeDyld::LoadedObjectInfo>, 2> PendingLoadedObjectInfos;
 
   // An optional ObjectCache to be notified of compiled objects and used to
   // perform lookup of pre-compiled code to avoid re-compilation.
-- 
2.14.1.536.g6867272d5b.dirty

0005-Add-PerfJITEventListener-for-perf-profiling-support.patchtext/x-diff; charset=us-asciiDownload
From 1db0527249415c5abbcf7425f05e04c7dc1713ef Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 1 Feb 2017 23:10:45 -0800
Subject: [PATCH 5/6] Add PerfJITEventListener for perf profiling support.

---
 CMakeLists.txt                                     |  13 +
 include/llvm/Config/config.h.cmake                 |   3 +
 include/llvm/Config/llvm-config.h.cmake            |   3 +
 include/llvm/ExecutionEngine/JITEventListener.h    |   9 +
 lib/ExecutionEngine/CMakeLists.txt                 |   4 +
 lib/ExecutionEngine/LLVMBuild.txt                  |   2 +-
 lib/ExecutionEngine/Orc/LLVMBuild.txt              |   2 +-
 lib/ExecutionEngine/PerfJITEvents/CMakeLists.txt   |   5 +
 .../{Orc => PerfJITEvents}/LLVMBuild.txt           |   8 +-
 .../PerfJITEvents/PerfJITEventListener.cpp         | 530 +++++++++++++++++++++
 tools/lli/CMakeLists.txt                           |   9 +
 tools/lli/lli.cpp                                  |   2 +
 12 files changed, 584 insertions(+), 6 deletions(-)
 create mode 100644 lib/ExecutionEngine/PerfJITEvents/CMakeLists.txt
 copy lib/ExecutionEngine/{Orc => PerfJITEvents}/LLVMBuild.txt (72%)
 create mode 100644 lib/ExecutionEngine/PerfJITEvents/PerfJITEventListener.cpp

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3e2e548df3f..dac3b817477 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -433,6 +433,16 @@ if( LLVM_USE_OPROFILE )
   endif( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
 endif( LLVM_USE_OPROFILE )
 
+option(LLVM_USE_PERF
+  "Use perf JIT interface to inform perf about JIT code" OFF)
+
+# If enabled, verify we are on a platform that supports perf.
+if( LLVM_USE_PERF )
+  if( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
+    message(FATAL_ERROR "perf support is available on Linux only.")
+  endif( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
+endif( LLVM_USE_PERF )
+
 set(LLVM_USE_SANITIZER "" CACHE STRING
   "Define the sanitizer used to build binaries and tests.")
 
@@ -639,6 +649,9 @@ endif (LLVM_USE_INTEL_JITEVENTS)
 if (LLVM_USE_OPROFILE)
   set(LLVMOPTIONALCOMPONENTS ${LLVMOPTIONALCOMPONENTS} OProfileJIT)
 endif (LLVM_USE_OPROFILE)
+if (LLVM_USE_PERF)
+  set(LLVMOPTIONALCOMPONENTS PerfJITEvents)
+endif (LLVM_USE_PERF)
 
 message(STATUS "Constructing LLVMBuild project information")
 execute_process(
diff --git a/include/llvm/Config/config.h.cmake b/include/llvm/Config/config.h.cmake
index d67148f6aa3..59a504ca3cf 100644
--- a/include/llvm/Config/config.h.cmake
+++ b/include/llvm/Config/config.h.cmake
@@ -374,6 +374,9 @@
 /* Define if we have the oprofile JIT-support library */
 #cmakedefine01 LLVM_USE_OPROFILE
 
+/* Define if we have the perf JIT-support library */
+#cmakedefine01 LLVM_USE_PERF
+
 /* LLVM version information */
 #cmakedefine LLVM_VERSION_INFO "${LLVM_VERSION_INFO}"
 
diff --git a/include/llvm/Config/llvm-config.h.cmake b/include/llvm/Config/llvm-config.h.cmake
index 4b0c5946061..4003b4d7b15 100644
--- a/include/llvm/Config/llvm-config.h.cmake
+++ b/include/llvm/Config/llvm-config.h.cmake
@@ -62,6 +62,9 @@
 /* Define if we have the oprofile JIT-support library */
 #cmakedefine01 LLVM_USE_OPROFILE
 
+/* Define if we have the perf JIT-support library */
+#cmakedefine01 LLVM_USE_PERF
+
 /* Major version of the LLVM API */
 #define LLVM_VERSION_MAJOR ${LLVM_VERSION_MAJOR}
 
diff --git a/include/llvm/ExecutionEngine/JITEventListener.h b/include/llvm/ExecutionEngine/JITEventListener.h
index ff7840f00a4..ad89599f717 100644
--- a/include/llvm/ExecutionEngine/JITEventListener.h
+++ b/include/llvm/ExecutionEngine/JITEventListener.h
@@ -115,6 +115,15 @@ public:
   }
 #endif // USE_OPROFILE
 
+#if LLVM_USE_PERF
+  static JITEventListener *createPerfJITEventListener();
+#else
+  static JITEventListener *createPerfJITEventListener()
+  {
+    return nullptr;
+  }
+#endif // USE_PERF
+
 private:
   virtual void anchor();
 };
diff --git a/lib/ExecutionEngine/CMakeLists.txt b/lib/ExecutionEngine/CMakeLists.txt
index 84b34919e44..c0dea0550fb 100644
--- a/lib/ExecutionEngine/CMakeLists.txt
+++ b/lib/ExecutionEngine/CMakeLists.txt
@@ -30,3 +30,7 @@ endif( LLVM_USE_OPROFILE )
 if( LLVM_USE_INTEL_JITEVENTS )
   add_subdirectory(IntelJITEvents)
 endif( LLVM_USE_INTEL_JITEVENTS )
+
+if( LLVM_USE_PERF )
+  add_subdirectory(PerfJITEvents)
+endif( LLVM_USE_PERF )
diff --git a/lib/ExecutionEngine/LLVMBuild.txt b/lib/ExecutionEngine/LLVMBuild.txt
index 9d29a41f504..b6e1bda6a51 100644
--- a/lib/ExecutionEngine/LLVMBuild.txt
+++ b/lib/ExecutionEngine/LLVMBuild.txt
@@ -16,7 +16,7 @@
 ;===------------------------------------------------------------------------===;
 
 [common]
-subdirectories = Interpreter MCJIT RuntimeDyld IntelJITEvents OProfileJIT Orc
+subdirectories = Interpreter MCJIT RuntimeDyld IntelJITEvents OProfileJIT Orc PerfJITEvents
 
 [component_0]
 type = Library
diff --git a/lib/ExecutionEngine/Orc/LLVMBuild.txt b/lib/ExecutionEngine/Orc/LLVMBuild.txt
index 8f05172e77a..ef4ae64e823 100644
--- a/lib/ExecutionEngine/Orc/LLVMBuild.txt
+++ b/lib/ExecutionEngine/Orc/LLVMBuild.txt
@@ -19,4 +19,4 @@
 type = Library
 name = OrcJIT
 parent = ExecutionEngine
-required_libraries = Core ExecutionEngine Object RuntimeDyld Support TransformUtils
+required_libraries = Core ExecutionEngine Object RuntimeDyld Support TransformUtils PerfJITEvents
diff --git a/lib/ExecutionEngine/PerfJITEvents/CMakeLists.txt b/lib/ExecutionEngine/PerfJITEvents/CMakeLists.txt
new file mode 100644
index 00000000000..136cc429d02
--- /dev/null
+++ b/lib/ExecutionEngine/PerfJITEvents/CMakeLists.txt
@@ -0,0 +1,5 @@
+add_llvm_library(LLVMPerfJITEvents
+  PerfJITEventListener.cpp
+  )
+
+add_dependencies(LLVMPerfJITEvents LLVMCodeGen)
diff --git a/lib/ExecutionEngine/Orc/LLVMBuild.txt b/lib/ExecutionEngine/PerfJITEvents/LLVMBuild.txt
similarity index 72%
copy from lib/ExecutionEngine/Orc/LLVMBuild.txt
copy to lib/ExecutionEngine/PerfJITEvents/LLVMBuild.txt
index 8f05172e77a..5175f9dd791 100644
--- a/lib/ExecutionEngine/Orc/LLVMBuild.txt
+++ b/lib/ExecutionEngine/PerfJITEvents/LLVMBuild.txt
@@ -1,4 +1,4 @@
-;===- ./lib/ExecutionEngine/MCJIT/LLVMBuild.txt ----------------*- Conf -*--===;
+;===- ./lib/ExecutionEngine/PerfJITEvents/LLVMBuild.txt ----------------*- Conf -*--===;
 ;
 ;                     The LLVM Compiler Infrastructure
 ;
@@ -16,7 +16,7 @@
 ;===------------------------------------------------------------------------===;
 
 [component_0]
-type = Library
-name = OrcJIT
+type = OptionalLibrary
+name = PerfJITEvents
 parent = ExecutionEngine
-required_libraries = Core ExecutionEngine Object RuntimeDyld Support TransformUtils
+required_libraries = CodeGen Core DebugInfoDWARF Support Object ExecutionEngine
diff --git a/lib/ExecutionEngine/PerfJITEvents/PerfJITEventListener.cpp b/lib/ExecutionEngine/PerfJITEvents/PerfJITEventListener.cpp
new file mode 100644
index 00000000000..d8b40e8b949
--- /dev/null
+++ b/lib/ExecutionEngine/PerfJITEvents/PerfJITEventListener.cpp
@@ -0,0 +1,530 @@
+//===-- PerfJITEventListener.cpp - Tell Linux's perf about JITted code ----===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines a JITEventListener object that tells perf JITted functions,
+// including source line information.
+//
+// Documentation for perf jit integration is available at:
+// https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/tools/perf/Documentation/jitdump-specification.txt
+// https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/tools/perf/Documentation/jit-interface.txt
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Config/config.h"
+
+#include <unistd.h> // for getpid(), sysconf()
+#include <syscall.h> // for gettid() */
+#include <time.h> // clock_gettime(), time(), localtime_r() */
+#include <sys/mman.h> // mmap() */
+#include <sys/types.h> // getpid(), open()
+#include <sys/stat.h> // open()
+#include <fcntl.h> // open()
+
+#include "llvm/ExecutionEngine/JITEventListener.h"
+
+#include "llvm/ADT/Twine.h"
+#include "llvm/DebugInfo/DWARF/DWARFContext.h"
+#include "llvm/Object/ObjectFile.h"
+#include "llvm/Object/SymbolSize.h"
+#include "llvm/Support/Debug.h"
+#include "llvm/Support/Errno.h"
+#include "llvm/Support/FileSystem.h"
+#include "llvm/Support/Mutex.h"
+#include "llvm/Support/MutexGuard.h"
+#include "llvm/Support/raw_ostream.h"
+
+using namespace llvm;
+using namespace llvm::object;
+typedef DILineInfoSpecifier::FileLineInfoKind FileLineInfoKind;
+
+namespace {
+
+// language identifier (XXX: should we generate something better from debug info?)
+#define JIT_LANG "llvm-IR"
+#define LLVM_PERF_JIT_MAGIC ((uint32_t) 'J' << 24 | (uint32_t) 'i' << 16 | (uint32_t) 'T' << 8 | (uint32_t) 'D')
+#define LLVM_PERF_JIT_VERSION 1
+
+/* bit 0: set if the jitdump file is using an architecture-specific timestamp clock source */
+#define JITDUMP_FLAGS_ARCH_TIMESTAMP  (1ULL << 0)
+
+struct LLVMPerfJitHeader;
+
+class PerfJITEventListener : public JITEventListener {
+public:
+  PerfJITEventListener();
+  ~PerfJITEventListener() {
+    if (MarkerAddr)
+      CloseMarker();
+  }
+
+  void NotifyObjectEmitted(const ObjectFile &Obj,
+                           const RuntimeDyld::LoadedObjectInfo &L) override;
+
+  void NotifyFreeingObject(const ObjectFile &Obj) override;
+
+private:
+
+  bool InitDebuggingDir();
+  bool OpenMarker();
+  void CloseMarker();
+  bool FillMachine(LLVMPerfJitHeader &hdr);
+
+  void NotifyCode(Expected<llvm::StringRef> &Symbol, uint64_t CodeAddr, uint64_t CodeSize);
+  void NotifyDebug(uint64_t CodeAddr, DILineInfoTable Lines);
+
+  // output data stream
+  std::unique_ptr<raw_fd_ostream> Dumpstream;
+
+  // output data stream, lifeliness managed via Dumpstream
+  int Fd;
+
+  // prevent concurrent dumps from messing up the output file
+  sys::Mutex Mutex;
+
+  // cache lookups
+  pid_t Pid;
+
+  // base directory for output data
+  std::string JitPath;
+
+  // perf mmap marker
+  void *MarkerAddr = NULL;
+
+  // perf support ready
+  bool SuccessfullyInitialized = false;
+};
+
+// The following are POD struct definitions from the perf jit specification
+
+enum LLVMPerfJitRecordType {
+  JIT_CODE_LOAD = 0,
+  JIT_CODE_MOVE = 1,
+  JIT_CODE_DEBUG_INFO = 2,
+  JIT_CODE_CLOSE = 3,
+  JIT_CODE_UNWINDING_INFO = 4,
+
+  JIT_CODE_MAX,
+};
+
+struct LLVMPerfJitHeader {
+  uint32_t Magic; /* characters "JiTD" */
+  uint32_t Version; /* header version */
+  uint32_t TotalSize; /* total size of header */
+  uint32_t ElfMach; /* elf mach target */
+  uint32_t Pad1; /* reserved */
+  uint32_t Pid;
+  uint64_t Timestamp; /* timestamp */
+  uint64_t Flags; /* flags */
+};
+
+/* record prefix (mandatory in each record) */
+struct LLVMPerfJitRecordPrefix {
+  uint32_t Id; /* record type identifier */
+  uint32_t TotalSize;
+  uint64_t Timestamp;
+};
+
+struct LLVMPerfJitRecordCodeLoad {
+  LLVMPerfJitRecordPrefix Prefix;
+
+  uint32_t Pid;
+  uint32_t Tid;
+  uint64_t Vma;
+  uint64_t CodeAddr;
+  uint64_t CodeSize;
+  uint64_t CodeIndex;
+};
+
+struct LLVMPerfJitRecordClose {
+  LLVMPerfJitRecordPrefix Prefix;
+};
+
+struct LLVMPerfJitRecordMoveCode {
+  LLVMPerfJitRecordPrefix Prefix;
+
+  uint32_t Pid;
+  uint32_t Tid;
+  uint64_t Vma;
+  uint64_t OldCodeAddr;
+  uint64_t NewCodeAddr;
+  uint64_t CodeSize;
+  uint64_t CodeIndex;
+};
+
+struct LLVMPerfJitDebugEntry {
+  uint64_t Addr;
+  int Lineno; /* source line number starting at 1 */
+  int Discrim; /* column discriminator, 0 is default */
+  char Name[]; /* null terminated filename, \xff\0 if same as previous entry */
+};
+
+struct LLVMPerfJitRecordDebugInfo {
+  LLVMPerfJitRecordPrefix Prefix;
+
+  uint64_t CodeAddr;
+  uint64_t NrEntry;
+  LLVMPerfJitDebugEntry Entries[];
+};
+
+struct LLVMPerfJitRecordUnwindInfo {
+  LLVMPerfJitRecordPrefix prefix;
+
+  uint64_t UnwindingSize;
+  uint64_t EhFrameHdrSize;
+  uint64_t MappedSize;
+  const char UnwindingData[];
+};
+
+// not available otherwise
+static inline pid_t gettid(void) {
+  return (pid_t)syscall(__NR_gettid);
+}
+
+static inline uint64_t
+timespec_to_ns(const struct timespec *ts) {
+  const uint64_t NanoSecPerSec = 1000000000;
+  return ((uint64_t) ts->tv_sec * NanoSecPerSec) + ts->tv_nsec;
+}
+
+static inline uint64_t
+perf_get_timestamp(void) {
+  struct timespec ts;
+  int ret;
+
+  ret = clock_gettime(CLOCK_MONOTONIC, &ts);
+  if (ret)
+    return 0;
+
+  return timespec_to_ns(&ts);
+}
+
+
+PerfJITEventListener::PerfJITEventListener()
+    : Pid(getpid()) {
+
+  LLVMPerfJitHeader Header = {0};
+  std::string Filename;
+  raw_string_ostream FilenameBuf(Filename);
+
+  // check if clock-source is supported
+  if (!perf_get_timestamp()) {
+    errs() << "kernel does not support CLOCK_MONOTONIC("<<CLOCK_MONOTONIC<<")\n";
+    return;
+  }
+
+  memset(&Header, 0, sizeof(Header));
+
+  if (!InitDebuggingDir()) {
+    errs() << "could not initialize debugging directory\n";
+    return;
+  }
+
+  FilenameBuf << JitPath << "/jit-"<<Pid<<".dump";
+
+  Fd = ::open(FilenameBuf.str().c_str(), O_CREAT|O_TRUNC|O_RDWR, 0666);
+  if (Fd == -1) {
+    errs() << "could not open JIT dump file "<<FilenameBuf.str()<<"\n";
+    return;
+  }
+
+  std::error_code EC;
+  Dumpstream = make_unique<raw_fd_ostream>(Fd, true);
+  assert(!EC);
+
+  if (!OpenMarker()) {
+    return;
+  }
+
+  if (!FillMachine(Header)) {
+    return;
+  }
+
+  Header.Magic = LLVM_PERF_JIT_MAGIC;
+  Header.Version = LLVM_PERF_JIT_VERSION;
+  Header.TotalSize = sizeof(Header);
+  Header.Pid = Pid;
+  Header.Timestamp = perf_get_timestamp();
+
+  Dumpstream->write((char *) &Header, sizeof(Header));
+
+  // Everything initialized, can do profiling now.
+  if (!Dumpstream->has_error())
+    SuccessfullyInitialized = true;
+}
+
+void PerfJITEventListener::NotifyObjectEmitted(
+    const ObjectFile &Obj,
+    const RuntimeDyld::LoadedObjectInfo &L) {
+
+  if (!SuccessfullyInitialized)
+    return;
+
+  OwningBinary<ObjectFile> DebugObjOwner = L.getObjectForDebug(Obj);
+  const ObjectFile &DebugObj = *DebugObjOwner.getBinary();
+
+  // Get the address of the object image for use as a unique identifier
+  std::unique_ptr<DIContext> Context = DWARFContext::create(DebugObj);
+
+  // Use symbol info to iterate functions in the object.
+  for (const std::pair<SymbolRef, uint64_t> &P : computeSymbolSizes(DebugObj)) {
+    SymbolRef Sym = P.first;
+    std::vector<LLVMPerfJitDebugEntry> LineInfo;
+    std::string SourceFileName;
+
+    Expected<SymbolRef::Type> SymTypeOrErr = Sym.getType();
+    if (!SymTypeOrErr) {
+      // TODO: Actually report errors helpfully.
+      consumeError(SymTypeOrErr.takeError());
+      continue;
+    }
+    SymbolRef::Type SymType = *SymTypeOrErr;
+    if (SymType != SymbolRef::ST_Function)
+      continue;
+
+    Expected<StringRef> Name = Sym.getName();
+    if (!Name) {
+      // TODO: Actually report errors helpfully.
+      consumeError(Name.takeError());
+      continue;
+    }
+
+    Expected<uint64_t> AddrOrErr = Sym.getAddress();
+    if (!AddrOrErr) {
+      // TODO: Actually report errors helpfully.
+      consumeError(AddrOrErr.takeError());
+      continue;
+    }
+    uint64_t Addr = *AddrOrErr;
+    uint64_t Size = P.second;
+
+    // According to spec debugging info has to come before loading the
+    // corresonding code load.
+    DILineInfoTable Lines = Context->getLineInfoForAddressRange(
+        Addr, Size, FileLineInfoKind::AbsoluteFilePath);
+    NotifyDebug(Addr, Lines);
+
+    NotifyCode(Name, Addr, Size);
+  }
+
+  Dumpstream->flush();
+}
+
+void PerfJITEventListener::NotifyFreeingObject(const ObjectFile &Obj) {
+  /* perf currently doesn't have an interface for unloading */
+}
+
+bool PerfJITEventListener::InitDebuggingDir() {
+  const char *BaseDir;
+  llvm::SmallString<128> TestDir;
+  time_t Time;
+  struct tm LocalTime;
+  char TimeBuffer[sizeof("YYMMDD")];
+
+  time(&Time);
+  localtime_r(&Time, &LocalTime);
+
+  /* perf specific location */
+  BaseDir = getenv("JITDUMPDIR");
+  if (!BaseDir)
+    BaseDir = getenv("HOME");
+  if (!BaseDir)
+    BaseDir = ".";
+
+  strftime(TimeBuffer, sizeof(TimeBuffer), "%Y%m%d", &LocalTime);
+
+  std::string DebugDir(BaseDir);
+  DebugDir += "/.debug/jit/";
+
+  if (sys::fs::create_directories(DebugDir)) {
+    errs() << "could not create jit cache directory "<<DebugDir<<"\n";
+    return false;
+  }
+
+  SmallString<128> UniqueDebugDir;
+
+  if (sys::fs::createUniqueDirectory(Twine(DebugDir) + JIT_LANG"-jit-" + TimeBuffer,
+                                     UniqueDebugDir)) {
+    errs() << "could not create unique jit cache directory "<<DebugDir<<"\n";
+    return false;
+  }
+
+  JitPath = UniqueDebugDir.str();
+
+  return true;
+}
+
+bool PerfJITEventListener::OpenMarker() {
+  long pgsz;
+
+  pgsz = ::sysconf(_SC_PAGESIZE);
+  if (pgsz == -1)
+    return false;
+
+  /*
+   * We mmap the jitdump to create an MMAP RECORD in perf.data file.  The mmap
+   * is captured either live (perf record running when we mmap) or in deferred
+   * mode, via /proc/PID/maps the MMAP record is used as a marker of a jitdump
+   * file for more meta data info about the jitted code. Perf report/annotate
+   * detect this special filename and process the jitdump file.
+   *
+   * Mapping must be PROT_EXEC to ensure it is captured by perf record
+   * even when not using -d option.
+   */
+  MarkerAddr = ::mmap(NULL, pgsz, PROT_READ|PROT_EXEC, MAP_PRIVATE, Fd, 0);
+
+  if (MarkerAddr == MAP_FAILED) {
+    errs() << "could not mmap JIT marker\n";
+    return false;
+  }
+  return true;
+}
+
+bool PerfJITEventListener::FillMachine(LLVMPerfJitHeader &hdr) {
+  ssize_t sret;
+  char id[16];
+  int fd;
+  struct {
+    uint16_t e_type;
+    uint16_t e_machine;
+  } info;
+
+  fd = ::open("/proc/self/exe", O_RDONLY);
+  if (fd == -1) {
+    errs() << "could not open /proc/self/exe\n";
+    return false;
+  }
+
+  sret = ::read(fd, id, sizeof(id));
+  if (sret != sizeof(id)) {
+    errs() << "could not read elf signature from /proc/self/exe\n";
+    goto error;
+  }
+
+  /* check ELF signature */
+  if (id[0] != 0x7f || id[1] != 'E' || id[2] != 'L' || id[3] != 'F') {
+    errs() << "invalid elf signature\n";
+    goto error;
+  }
+
+  sret = ::read(fd, &info, sizeof(info));
+  if (sret != sizeof(info)) {
+    errs() << "could not read machine identification\n";
+    goto error;
+  }
+
+  hdr.ElfMach = info.e_machine;
+ error:
+  close(fd);
+  return true;
+}
+
+void PerfJITEventListener::CloseMarker() {
+  long pgsz;
+
+  if (!MarkerAddr)
+    return;
+
+  pgsz = ::sysconf(_SC_PAGESIZE);
+  if (pgsz == -1)
+    return;
+
+  munmap(MarkerAddr, pgsz);
+  MarkerAddr = nullptr;
+}
+
+void PerfJITEventListener::NotifyCode(Expected<llvm::StringRef> &Symbol, uint64_t CodeAddr, uint64_t CodeSize) {
+  static int code_generation = 1;
+  LLVMPerfJitRecordCodeLoad rec;
+
+  assert(SuccessfullyInitialized);
+
+  // 0 length functions can't have samples.
+  if (CodeSize == 0)
+    return;
+
+  rec.Prefix.Id = JIT_CODE_LOAD;
+  rec.Prefix.TotalSize =
+    sizeof(rec) + // debug record itself
+    Symbol->size() + 1 + // symbol name
+    CodeSize; // and code
+  rec.Prefix.Timestamp = perf_get_timestamp();
+
+  rec.CodeSize = CodeSize;
+  rec.Vma = 0;
+  rec.CodeAddr = CodeAddr;
+  rec.Pid = Pid;
+  rec.Tid = gettid();
+
+  // get code index inside lock to avoid race condition
+  MutexGuard Guard(Mutex);
+
+  rec.CodeIndex = code_generation++;
+
+  Dumpstream->write(reinterpret_cast<const char *>(&rec), sizeof(rec));
+  Dumpstream->write(Symbol->data(), Symbol->size() + 1);
+  Dumpstream->write(reinterpret_cast<const char *>(CodeAddr), CodeSize);
+}
+
+void PerfJITEventListener::NotifyDebug(uint64_t CodeAddr, DILineInfoTable Lines) {
+  LLVMPerfJitRecordDebugInfo rec;
+
+  assert(SuccessfullyInitialized);
+
+  // Didn't get useful debug info.
+  if (Lines.empty())
+    return;
+
+  rec.Prefix.Id = JIT_CODE_DEBUG_INFO;
+  rec.Prefix.TotalSize = sizeof(rec); // will be increased further
+  rec.Prefix.Timestamp = perf_get_timestamp();
+  rec.CodeAddr = CodeAddr;
+  rec.NrEntry = Lines.size();
+
+  /* compute total size size of record (variable due to filenames) */
+  DILineInfoTable::iterator Begin = Lines.begin();
+  DILineInfoTable::iterator End = Lines.end();
+  for (DILineInfoTable::iterator It = Begin; It != End; ++It) {
+    DILineInfo &line = It->second;
+    rec.Prefix.TotalSize += sizeof(LLVMPerfJitDebugEntry);
+    rec.Prefix.TotalSize += line.FileName.size() + 1;
+  }
+
+  Dumpstream->write(reinterpret_cast<const char *>(&rec), sizeof(rec));
+
+  // The debug_entry describes the source line information. It is defined as follows in order:
+  // * uint64_t code_addr: address of function for which the debug information is generated
+  // * uint32_t line     : source file line number (starting at 1)
+  // * uint32_t discrim  : column discriminator, 0 is default
+  // * char name[n]      : source file name in ASCII, including null termination
+
+  MutexGuard Guard(Mutex);
+
+  for (DILineInfoTable::iterator It = Begin; It != End; ++It) {
+    LLVMPerfJitDebugEntry LineInfo;
+    DILineInfo &Line = It->second;
+
+    LineInfo.Addr = It->first;
+    // For reasons unknown to me either llvm offsets or perf's use of them is
+    // offset by 0x40. Inquiring.
+    LineInfo.Addr += 0x40;
+    LineInfo.Lineno = Line.Line;
+    LineInfo.Discrim = Line.Discriminator;
+
+    Dumpstream->write(reinterpret_cast<const char *>(&LineInfo), sizeof(LineInfo));
+    Dumpstream->write(Line.FileName.c_str(), Line.FileName.size() + 1);
+  }
+}
+
+} // end anonymous namespace
+
+namespace llvm {
+JITEventListener *JITEventListener::createPerfJITEventListener() {
+  return new PerfJITEventListener();
+}
+} // end llvm namespace
diff --git a/tools/lli/CMakeLists.txt b/tools/lli/CMakeLists.txt
index f02e19313b7..5f235b6f6f3 100644
--- a/tools/lli/CMakeLists.txt
+++ b/tools/lli/CMakeLists.txt
@@ -36,6 +36,15 @@ if( LLVM_USE_INTEL_JITEVENTS )
     )
 endif( LLVM_USE_INTEL_JITEVENTS )
 
+if( LLVM_USE_PERF )
+  set(LLVM_LINK_COMPONENTS
+    ${LLVM_LINK_COMPONENTS}
+    DebugInfoDWARF
+    PerfJITEvents
+    Object
+    )
+endif( LLVM_USE_PERF )
+
 add_llvm_tool(lli
   lli.cpp
   OrcLazyJIT.cpp
diff --git a/tools/lli/lli.cpp b/tools/lli/lli.cpp
index cd43e9d5791..a6c22526ea6 100644
--- a/tools/lli/lli.cpp
+++ b/tools/lli/lli.cpp
@@ -496,6 +496,8 @@ int main(int argc, char **argv, char * const *envp) {
                 JITEventListener::createOProfileJITEventListener());
   EE->RegisterJITEventListener(
                 JITEventListener::createIntelJITEventListener());
+  EE->RegisterJITEventListener(
+                JITEventListener::createPerfJITEventListener());
 
   if (!NoLazyCompilation && RemoteMCJIT) {
     errs() << "warning: remote mcjit does not support lazy compilation\n";
-- 
2.14.1.536.g6867272d5b.dirty

0006-ORC-JIT-event-listener-support.patchtext/x-diff; charset=us-asciiDownload
From c97ed210b4a3400e23639cc10e746b231729dd82 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Wed, 4 Oct 2017 15:37:27 -0700
Subject: [PATCH 6/6] [ORC] JIT event listener support.

---
 include/llvm-c/OrcBindings.h                       |  4 ++
 .../ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h | 22 +++++++++-
 lib/ExecutionEngine/Orc/OrcCBindings.cpp           | 25 ++++++++++++
 lib/ExecutionEngine/Orc/OrcCBindingsStack.h        | 47 +++++++++++++++++++++-
 4 files changed, 94 insertions(+), 4 deletions(-)

diff --git a/include/llvm-c/OrcBindings.h b/include/llvm-c/OrcBindings.h
index 4ff1f47e87d..38fa44c231d 100644
--- a/include/llvm-c/OrcBindings.h
+++ b/include/llvm-c/OrcBindings.h
@@ -180,6 +180,10 @@ LLVMOrcErrorCode LLVMOrcGetSymbolAddressIn(LLVMOrcJITStackRef JITStack,
  */
 LLVMOrcErrorCode LLVMOrcDisposeInstance(LLVMOrcJITStackRef JITStack);
 
+void LLVMOrcRegisterPerf(LLVMOrcJITStackRef JITStack);
+void LLVMOrcRegisterGDB(LLVMOrcJITStackRef JITStack);
+void LLVMOrcUnregisterPerf(LLVMOrcJITStackRef JITStack);
+
 #ifdef __cplusplus
 }
 #endif /* extern "C" */
diff --git a/include/llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h b/include/llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h
index 246c57341f3..d720f4053a3 100644
--- a/include/llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h
+++ b/include/llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h
@@ -75,6 +75,8 @@ protected:
       return JITSymbol(SymEntry->second);
     }
 
+    virtual ObjectPtr getObject() const = 0;
+
   protected:
     StringMap<JITEvaluatedSymbol> SymbolTable;
     bool Finalized = false;
@@ -106,6 +108,10 @@ public:
   /// @brief Functor for receiving finalization notifications.
   using NotifyFinalizedFtor = std::function<void(ObjHandleT)>;
 
+
+  /// @brief Functor for receiving freeing notifications.
+  using NotifyFreedFtor = std::function<void(ObjHandleT)>;
+
 private:
 
 
@@ -117,7 +123,8 @@ private:
                          SymbolResolverPtrT Resolver,
                          FinalizerFtor Finalizer,
                          bool ProcessAllSections)
-      : MemMgr(std::move(MemMgr)),
+        : MemMgr(std::move(MemMgr)),
+          Obj(Obj),
         PFC(llvm::make_unique<PreFinalizeContents>(std::move(Obj),
                                                    std::move(Resolver),
                                                    std::move(Finalizer),
@@ -168,6 +175,10 @@ private:
       PFC->RTDyld->mapSectionAddress(LocalAddress, TargetAddr);
     }
 
+    ObjectPtr getObject() const override {
+      return Obj;
+    };
+
   private:
 
     void buildInitialSymbolTable(const ObjectPtr &Obj) {
@@ -209,6 +220,7 @@ private:
     };
 
     MemoryManagerPtrT MemMgr;
+    ObjectPtr Obj;
     std::unique_ptr<PreFinalizeContents> PFC;
   };
 
@@ -238,10 +250,12 @@ public:
   RTDyldObjectLinkingLayer(
       MemoryManagerGetter GetMemMgr,
       NotifyLoadedFtor NotifyLoaded = NotifyLoadedFtor(),
-      NotifyFinalizedFtor NotifyFinalized = NotifyFinalizedFtor())
+      NotifyFinalizedFtor NotifyFinalized = NotifyFinalizedFtor(),
+      NotifyFreedFtor NotifyFreed = NotifyFreedFtor())
       : GetMemMgr(GetMemMgr),
         NotifyLoaded(std::move(NotifyLoaded)),
         NotifyFinalized(std::move(NotifyFinalized)),
+        NotifyFreed(std::move(NotifyFreed)),
         ProcessAllSections(false) {}
 
   /// @brief Set the 'ProcessAllSections' flag.
@@ -300,6 +314,9 @@ public:
   /// required to detect or resolve such issues it should be added at a higher
   /// layer.
   Error removeObject(ObjHandleT H) {
+    if (this->NotifyFreed)
+      this->NotifyFreed(H);
+
     // How do we invalidate the symbols in H?
     LinkedObjList.erase(H);
     return Error::success();
@@ -350,6 +367,7 @@ private:
   MemoryManagerGetter GetMemMgr;
   NotifyLoadedFtor NotifyLoaded;
   NotifyFinalizedFtor NotifyFinalized;
+  NotifyFreedFtor NotifyFreed;
   bool ProcessAllSections = false;
 };
 
diff --git a/lib/ExecutionEngine/Orc/OrcCBindings.cpp b/lib/ExecutionEngine/Orc/OrcCBindings.cpp
index 9b9c1512402..9c83ce2c340 100644
--- a/lib/ExecutionEngine/Orc/OrcCBindings.cpp
+++ b/lib/ExecutionEngine/Orc/OrcCBindings.cpp
@@ -10,6 +10,8 @@
 #include "OrcCBindingsStack.h"
 #include "llvm-c/OrcBindings.h"
 
+#include "llvm/ExecutionEngine/JITEventListener.h"
+
 using namespace llvm;
 
 LLVMSharedModuleRef LLVMOrcMakeSharedModule(LLVMModuleRef Mod) {
@@ -134,3 +136,26 @@ LLVMOrcErrorCode LLVMOrcDisposeInstance(LLVMOrcJITStackRef JITStack) {
   delete J;
   return Err;
 }
+
+
+static JITEventListener *perf_listener_orc = NULL;
+static JITEventListener *gdb_listener_orc = NULL;
+
+void LLVMOrcRegisterGDB(LLVMOrcJITStackRef JITStack) {
+  if (!gdb_listener_orc)
+    gdb_listener_orc = JITEventListener::createGDBRegistrationListener();
+  unwrap(JITStack)->RegisterJITEventListener(gdb_listener_orc);
+}
+
+void LLVMOrcRegisterPerf(LLVMOrcJITStackRef JITStack) {
+  if (!perf_listener_orc)
+    perf_listener_orc = JITEventListener::createPerfJITEventListener();
+  unwrap(JITStack)->RegisterJITEventListener(perf_listener_orc);
+}
+
+void LLVMOrcUnregisterPerf(LLVMOrcJITStackRef JITStack) {
+  if (perf_listener_orc) {
+    delete perf_listener_orc;
+    perf_listener_orc = NULL;
+  }
+}
diff --git a/lib/ExecutionEngine/Orc/OrcCBindingsStack.h b/lib/ExecutionEngine/Orc/OrcCBindingsStack.h
index 6eaac01d52f..b448a9c370c 100644
--- a/lib/ExecutionEngine/Orc/OrcCBindingsStack.h
+++ b/lib/ExecutionEngine/Orc/OrcCBindingsStack.h
@@ -15,6 +15,7 @@
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/ExecutionEngine/JITSymbol.h"
+#include "llvm/ExecutionEngine/JITEventListener.h"
 #include "llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h"
 #include "llvm/ExecutionEngine/Orc/CompileUtils.h"
 #include "llvm/ExecutionEngine/Orc/ExecutionUtils.h"
@@ -24,8 +25,10 @@
 #include "llvm/ExecutionEngine/RuntimeDyld.h"
 #include "llvm/ExecutionEngine/SectionMemoryManager.h"
 #include "llvm/IR/DataLayout.h"
+#include "llvm/IR/LLVMContext.h"
 #include "llvm/IR/Mangler.h"
 #include "llvm/IR/Module.h"
+#include "llvm/Object/ObjectFile.h"
 #include "llvm/Support/CBindingWrapping.h"
 #include "llvm/Support/Error.h"
 #include "llvm/Support/raw_ostream.h"
@@ -137,13 +140,18 @@ public:
         ObjectLayer(
           []() {
             return std::make_shared<SectionMemoryManager>();
-          }),
+          },
+          std::bind(&OrcCBindingsStack::notifyLoaded, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3),
+          std::bind(&OrcCBindingsStack::notifyFinalized, this, std::placeholders::_1),
+          std::bind(&OrcCBindingsStack::notifyFreed, this, std::placeholders::_1)),
         CompileLayer(ObjectLayer, orc::SimpleCompiler(TM)),
         CODLayer(CompileLayer,
                  [](Function &F) { return std::set<Function *>({&F}); },
                  *this->CCMgr, std::move(IndirectStubsMgrBuilder), false),
         CXXRuntimeOverrides(
-            [this](const std::string &S) { return mangle(S); }) {}
+            [this](const std::string &S) { return mangle(S); }) {
+    ObjectLayer.setProcessAllSections(true);
+  }
 
   LLVMOrcErrorCode shutdown() {
     // Run any destructors registered with __cxa_atexit.
@@ -378,6 +386,10 @@ public:
 
   const std::string &getErrorMessage() const { return ErrMsg; }
 
+  void RegisterJITEventListener(JITEventListener *l) {
+    EventListeners.push_back(l);
+  }
+
 private:
   template <typename LayerT, typename HandleT>
   unsigned createHandle(LayerT &Layer, HandleT Handle) {
@@ -408,6 +420,33 @@ private:
     return Result;
   }
 
+  void notifyLoaded(orc::RTDyldObjectLinkingLayerBase::ObjHandleT H,
+                    const orc::RTDyldObjectLinkingLayerBase::ObjectPtr &Obj,
+                    const RuntimeDyld::LoadedObjectInfo &LoadedObjInfo) {
+    PendingLoadedObjectInfos.push_back(&LoadedObjInfo);
+    PendingLoadedObjects.push_back(Obj->getBinary());
+  }
+
+
+  void notifyFinalized(orc::RTDyldObjectLinkingLayerBase::ObjHandleT H) {
+    for (auto &Listener : EventListeners) {
+      for (size_t I = 0, S = PendingLoadedObjects.size(); I < S; ++I) {
+        auto &Obj = PendingLoadedObjects[I];
+        auto &Info = PendingLoadedObjectInfos[I];
+        Listener->NotifyObjectEmitted(*Obj, *Info);
+      }
+    }
+
+    PendingLoadedObjects.clear();
+    PendingLoadedObjectInfos.clear();
+  }
+
+  void notifyFreed(orc::RTDyldObjectLinkingLayerBase::ObjHandleT H) {
+    for (auto &Listener : EventListeners) {
+      Listener->NotifyFreeingObject(*(*H)->getObject()->getBinary());
+    }
+  }
+
   DataLayout DL;
   SectionMemoryManager CCMgrMemMgr;
 
@@ -424,6 +463,10 @@ private:
   orc::LocalCXXRuntimeOverrides CXXRuntimeOverrides;
   std::vector<orc::CtorDtorRunner<OrcCBindingsStack>> IRStaticDestructorRunners;
   std::string ErrMsg;
+
+  std::vector<JITEventListener *> EventListeners;
+  std::vector<const RuntimeDyld::LoadedObjectInfo *> PendingLoadedObjectInfos;
+  std::vector<const object::ObjectFile*> PendingLoadedObjects;
 };
 
 } // end namespace llvm
-- 
2.14.1.536.g6867272d5b.dirty

#17David Rowley
david.rowley@2ndquadrant.com
In reply to: Andres Freund (#16)
Re: JIT compiling - v4.0

On 5 October 2017 at 19:57, Andres Freund <andres@anarazel.de> wrote:

Here's some numbers for a a TPC-H scale 5 run. Obviously the Q01 numbers
are pretty nice in partcular. But it's also visible that the shorter
query can loose, which is largely due to the JIT overhead - that can be
ameliorated to some degree, but JITing obviously isn't always going to
be a win.

It's pretty exciting to see thing being worked on.

I've not looked at the code, but I'm thinking, could you not just JIT
if the total cost of the plan is estimated to be > X ? Where X is some
JIT threshold GUC.

--
David Rowley http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#18Andres Freund
andres@anarazel.de
In reply to: David Rowley (#17)
Re: JIT compiling - v4.0

On 2017-10-05 23:43:37 +1300, David Rowley wrote:

On 5 October 2017 at 19:57, Andres Freund <andres@anarazel.de> wrote:

Here's some numbers for a a TPC-H scale 5 run. Obviously the Q01 numbers
are pretty nice in partcular. But it's also visible that the shorter
query can loose, which is largely due to the JIT overhead - that can be
ameliorated to some degree, but JITing obviously isn't always going to
be a win.

It's pretty exciting to see thing being worked on.

I've not looked at the code, but I'm thinking, could you not just JIT
if the total cost of the plan is estimated to be > X ? Where X is some
JIT threshold GUC.

Right, that's the plan. But it seems fairly important to make the
envelope in which it is beneficial as broad as possible. Also, test
coverage is more interesting for me right now ;)

Greetings,

Andres Freund

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#19Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#16)
Re: JIT compiling - v4.0

On Thu, Oct 5, 2017 at 2:57 AM, Andres Freund <andres@anarazel.de> wrote:

master q01 min: 14146.498 dev min: 11479.05 [diff -23.24] dev-jit min: 8659.961 [diff -63.36] dev-jit-deform min: 7279.395 [diff -94.34] dev-jit-deform-inline min: 6997.956 [diff -102.15]

I think this is a really strange way to display this information.
Instead of computing the percentage of time that you saved, you've
computed the negative of the percentage that you would have lost if
the patch were already committed and you reverted it. That's just
confusing.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#20Michael Paquier
michael.paquier@gmail.com
In reply to: Andres Freund (#13)
Re: [HACKERS] JIT compiling expressions/deform + inlining prototype v2.0

On Thu, Sep 21, 2017 at 2:52 AM, Andres Freund <andres@anarazel.de> wrote:

On 2017-09-19 12:57:33 +0300, Konstantin Knizhnik wrote:

On 04.09.2017 23:52, Andres Freund wrote:

Hi. That piece of code isn't particularly clear (and has a bug in the
submitted version), I'm revising it.

...

Yea, I've changed that already, although it's currently added earlier,
because the alignment is needed before, to access the column correctly.
I've also made number of efficiency improvements, primarily to access
columns with an absolute offset if all preceding ones are fixed width
not null columns - that is quite noticeable performancewise.

Should I wait for new version of your patch or continue review of this code?

I'll update the posted version later this week, sorry for the delay.

I know that you are working on this actively per the set of patches
you have sent lately, but this thread has stalled, so I am marking it
as returned with feedback. There is now only one CF entry to track
this work: https://commitfest.postgresql.org/15/1285/. Depending on
the work you are doing you may want to spawn a CF entry for each
sub-item. Just an idea.
--
Michael

#21Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#1)
1 attachment(s)
fixed tuple descs (was JIT compiling expressions/deform)

Hi,

One part of the work to make JITing worth it's while is JITing tuple
deforming. That's currently often the biggest consumer of time, and if not
most often in the top entries.

My experimentation shows that tuple deforming is primarily beneficial
when it happens as *part* of jit compiling expressions. I'd originally
tried to jit compile deforming inside heaptuple.c, and cache the
deforming program inside the tuple slot. That turns out to not work very
well, because a lot of tuple descriptors are very short lived, computed
during ExecInitNode(). Even if that were not the case, compiling for
each deforming on demand has significant downsides:
- it requires emitting code in smaller increments (whenever something
new is deformed)
- because the generated code has to be generic for all potential
deformers, the number of branches to check for that are
significant. If instead the the deforming code is generated for a
specific callsite, no branches for the number of to-be-deformed
columns has to be generated. The primary remaining branches then are
the ones checking for NULLs and the number of attributes in the
column, and those can often be optimized away if there's NOT NULL
columns present.
- the call overhead is still noticeable
- the memory / function lifetime management is awkward.

If the JITing of expressions is instead done as part of expression
evaluation we can emit all the necessary code for the whole plantree
during executor startup, in one go. And, more importantly, LLVMs
optimizer is free to inline the deforming code into the expression code,
often yielding noticeable improvements (although that still could use
some improvements).

To allow doing JITing at ExecReadyExpr() time, we need to know the tuple
descriptor a EEOP_{INNER,OUTER,SCAN}_FETCHSOME step refers to. There's
currently two major impediments to that.

1) At a lot of ExecInitExpr() callsites the tupledescs for inner, outer,
scan aren't yet known. Therefore that code needs to be reordered so
we (if applicable):
a) initialize subsidiary nodes, thereby determining the left/right
(inner/outer) tupledescs
b) initialize the scan tuple desc, often that refers to a)
c) determine the result tuple desc, required to build the projection
d) build projections
e) build expressions

Attached is a patch doing so. Currently it only applies with a few
preliminary patches applied, but that could be easily reordered.

The patch is relatively large, as I decided to try to get the
different ExecInitNode functions to look a bit more similar. There's
some judgement calls involved, but I think the result looks a good
bit better, regardless of the later need.

I'm not really happy with the, preexisting, split of functions
between execScan.c, execTuples.c, execUtils.c. I wonder if the
majority, except the low level slot ones, shouldn't be moved to
execUtils.c, I think that'd be clearer. There seems to be no
justification for execScan.c to contain
ExecAssignScanProjectionInfo[WithVarno].

2) TupleSlots need to describe whether they'll contain a fixed tupledesc
for all their lifetime, or whether they can change their nature. Most
places don't need to ever change a slot's identity, but in a few
places it's quite convenient.

I've introduced the notion that a tupledesc can be marked as "fixed",
by passing a tupledesc at its creation. That also gains a bit of
efficiency (memory management overhead, higher cache hit ratio)
because the slot, tts_values, tts_isnull can be allocated in one
chunk.

3) At expression initialization time we need to figure out what slots
(or just descs INNER/OUTER/SCAN refer to. I've solved that by looking
up inner/outer/scan via the provided parent node, which required
adding a new field to store the scan slot.

Currently no expressions initialized with a parent node have a
INNER/OUTER/SCAN slot + desc that doesn't refer to the relevant node,
but I'm not sure I like that as a requirement.

Attached is a patch that implements 1 + 2. I'd welcome a quick look
through it. It currently only applies ontop a few other recently
submitted patches, but it'd just be an hour's work or so to reorder
that.

Comments about either the outline above or the patch?

Regards,

Andres

Attachments:

0001-WIP-Allow-tupleslots-to-have-a-fixed-tupledesc-use-i.patchtext/x-diff; charset=us-asciiDownload
From cd04258d92bed57d7e8a6bbe0408c7fb31f1a182 Mon Sep 17 00:00:00 2001
From: Andres Freund <andres@anarazel.de>
Date: Tue, 3 Oct 2017 23:45:44 -0700
Subject: [PATCH] WIP: Allow tupleslots to have a fixed tupledesc, use in
 executor nodes.

The reason for doing so is that it will allow expression evaluation to
optimize based on the underlying tupledesc. In particular it allows
JITing tuple deforming together with the expression itself.

For that expression initialization needs to be moved after the
relevant slots are initialized - mostly unproblematic, except in the
case of nodeWorktablescan.c.

Author: Andres Freund
---
 src/backend/commands/copy.c                    |   5 +-
 src/backend/commands/trigger.c                 |   6 +-
 src/backend/executor/README                    |   2 +
 src/backend/executor/execExpr.c                |   2 +-
 src/backend/executor/execMain.c                |   2 +-
 src/backend/executor/execPartition.c           |   2 +-
 src/backend/executor/execScan.c                |   2 +-
 src/backend/executor/execTuples.c              | 115 ++++++++++++++++++-------
 src/backend/executor/execUtils.c               |  62 ++-----------
 src/backend/executor/nodeAgg.c                 |  68 +++++++--------
 src/backend/executor/nodeAppend.c              |  18 ++--
 src/backend/executor/nodeBitmapAnd.c           |  14 +--
 src/backend/executor/nodeBitmapHeapscan.c      |  58 ++++++-------
 src/backend/executor/nodeBitmapIndexscan.c     |  18 ++--
 src/backend/executor/nodeBitmapOr.c            |  14 +--
 src/backend/executor/nodeCtescan.c             |  32 +++----
 src/backend/executor/nodeCustom.c              |  20 ++---
 src/backend/executor/nodeForeignscan.c         |  30 +++----
 src/backend/executor/nodeFunctionscan.c        |  31 +++----
 src/backend/executor/nodeGather.c              |  31 +++----
 src/backend/executor/nodeGatherMerge.c         |  19 ++--
 src/backend/executor/nodeGroup.c               |  32 +++----
 src/backend/executor/nodeHash.c                |  23 ++---
 src/backend/executor/nodeHashjoin.c            |  45 +++++-----
 src/backend/executor/nodeIndexonlyscan.c       |  34 +++-----
 src/backend/executor/nodeIndexscan.c           |  45 +++++-----
 src/backend/executor/nodeLimit.c               |  18 ++--
 src/backend/executor/nodeLockRows.c            |   9 +-
 src/backend/executor/nodeMaterial.c            |   6 +-
 src/backend/executor/nodeMergeAppend.c         |   6 +-
 src/backend/executor/nodeMergejoin.c           |  53 ++++++------
 src/backend/executor/nodeModifyTable.c         |  25 +++---
 src/backend/executor/nodeNamedtuplestorescan.c |  21 ++---
 src/backend/executor/nodeNestloop.c            |  29 +++----
 src/backend/executor/nodeProjectSet.c          |  14 +--
 src/backend/executor/nodeRecursiveunion.c      |   9 +-
 src/backend/executor/nodeResult.c              |  25 +++---
 src/backend/executor/nodeSamplescan.c          |  73 ++++++----------
 src/backend/executor/nodeSeqscan.c             |  64 +++++---------
 src/backend/executor/nodeSetOp.c               |  11 +--
 src/backend/executor/nodeSort.c                |  18 ++--
 src/backend/executor/nodeSubplan.c             |   6 +-
 src/backend/executor/nodeSubqueryscan.c        |  28 +++---
 src/backend/executor/nodeTableFuncscan.c       |  26 +++---
 src/backend/executor/nodeTidscan.c             |  29 +++----
 src/backend/executor/nodeUnique.c              |  11 +--
 src/backend/executor/nodeValuesscan.c          |  25 ++----
 src/backend/executor/nodeWindowAgg.c           |  35 +++-----
 src/backend/executor/nodeWorktablescan.c       |  16 ++--
 src/backend/replication/logical/worker.c       |  22 ++---
 src/include/executor/executor.h                |  11 ++-
 src/include/executor/tuptable.h                |   5 +-
 52 files changed, 564 insertions(+), 761 deletions(-)

diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c
index bace390470f..47a21661173 100644
--- a/src/backend/commands/copy.c
+++ b/src/backend/commands/copy.c
@@ -2448,10 +2448,9 @@ CopyFrom(CopyState cstate)
 	estate->es_range_table = cstate->range_table;
 
 	/* Set up a tuple slot too */
-	myslot = ExecInitExtraTupleSlot(estate);
-	ExecSetSlotDescriptor(myslot, tupDesc);
+	myslot = ExecInitExtraTupleSlot(estate, tupDesc);
 	/* Triggers might need a slot as well */
-	estate->es_trig_tuple_slot = ExecInitExtraTupleSlot(estate);
+	estate->es_trig_tuple_slot = ExecInitExtraTupleSlot(estate, NULL);
 
 	/* Prepare to catch AFTER triggers. */
 	AfterTriggerBeginQuery();
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 92ae3822d8a..6a3d0a83306 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -3246,7 +3246,8 @@ TriggerEnabled(EState *estate, ResultRelInfo *relinfo,
 			if (estate->es_trig_oldtup_slot == NULL)
 			{
 				oldContext = MemoryContextSwitchTo(estate->es_query_cxt);
-				estate->es_trig_oldtup_slot = ExecInitExtraTupleSlot(estate);
+				estate->es_trig_oldtup_slot =
+					ExecInitExtraTupleSlot(estate, NULL);
 				MemoryContextSwitchTo(oldContext);
 			}
 			oldslot = estate->es_trig_oldtup_slot;
@@ -3259,7 +3260,8 @@ TriggerEnabled(EState *estate, ResultRelInfo *relinfo,
 			if (estate->es_trig_newtup_slot == NULL)
 			{
 				oldContext = MemoryContextSwitchTo(estate->es_query_cxt);
-				estate->es_trig_newtup_slot = ExecInitExtraTupleSlot(estate);
+				estate->es_trig_newtup_slot =
+					ExecInitExtraTupleSlot(estate, NULL);
 				MemoryContextSwitchTo(oldContext);
 			}
 			newslot = estate->es_trig_newtup_slot;
diff --git a/src/backend/executor/README b/src/backend/executor/README
index b3e74aa1a54..0d7cd552eb6 100644
--- a/src/backend/executor/README
+++ b/src/backend/executor/README
@@ -243,6 +243,8 @@ This is a sketch of control flow for full query processing:
 		switch to per-query context to run ExecInitNode
 		AfterTriggerBeginQuery
 		ExecInitNode --- recursively scans plan tree
+			ExecInitNode
+				recurse into subsidiary nodes
 			CreateExprContext
 				creates per-tuple context
 			ExecInitExpr
diff --git a/src/backend/executor/execExpr.c b/src/backend/executor/execExpr.c
index d3eaf8fb00f..9041cae9d66 100644
--- a/src/backend/executor/execExpr.c
+++ b/src/backend/executor/execExpr.c
@@ -2335,7 +2335,7 @@ ExecInitWholeRowVar(ExprEvalStep *scratch, Var *variable, PlanState *parent)
 				scratch->d.wholerow.junkFilter =
 					ExecInitJunkFilter(subplan->plan->targetlist,
 									   ExecGetResultType(subplan)->tdhasoid,
-									   ExecInitExtraTupleSlot(parent->state));
+									   ExecInitExtraTupleSlot(parent->state, NULL));
 			}
 		}
 	}
diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c
index dbaa47f2d30..750a83a7155 100644
--- a/src/backend/executor/execMain.c
+++ b/src/backend/executor/execMain.c
@@ -1073,7 +1073,7 @@ InitPlan(QueryDesc *queryDesc, int eflags)
 
 			j = ExecInitJunkFilter(planstate->plan->targetlist,
 								   tupType->tdhasoid,
-								   ExecInitExtraTupleSlot(estate));
+								   ExecInitExtraTupleSlot(estate, NULL));
 			estate->es_junkFilter = j;
 
 			/* Want to return the cleaned tuple type */
diff --git a/src/backend/executor/execPartition.c b/src/backend/executor/execPartition.c
index d545af2b677..ebd86607ed1 100644
--- a/src/backend/executor/execPartition.c
+++ b/src/backend/executor/execPartition.c
@@ -97,7 +97,7 @@ ExecSetupPartitionTupleRouting(ModifyTableState *mtstate,
 	 * (such as ModifyTableState) and released when the node finishes
 	 * processing.
 	 */
-	*partition_tuple_slot = MakeTupleTableSlot();
+	*partition_tuple_slot = MakeTupleTableSlot(NULL);
 
 	leaf_part_rri = (ResultRelInfo *) palloc0(*num_partitions *
 											  sizeof(ResultRelInfo));
diff --git a/src/backend/executor/execScan.c b/src/backend/executor/execScan.c
index 837abc0f017..b3f34aac980 100644
--- a/src/backend/executor/execScan.c
+++ b/src/backend/executor/execScan.c
@@ -229,7 +229,7 @@ ExecScan(ScanState *node,
  * the scan node, because the planner will preferentially generate a matching
  * tlist.
  *
- * ExecAssignScanType must have been called already.
+ * The scan slot's descriptor must have been set already.
  */
 void
 ExecAssignScanProjectionInfo(ScanState *node)
diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c
index 51d2c5d166d..2161de9e1c4 100644
--- a/src/backend/executor/execTuples.c
+++ b/src/backend/executor/execTuples.c
@@ -58,7 +58,7 @@
  *		At ExecutorStart()
  *		----------------
  *		- ExecInitSeqScan() calls ExecInitScanTupleSlot() and
- *		  ExecInitResultTupleSlot() to construct TupleTableSlots
+ *		  ExecInitResultTupleSlotTL() to construct TupleTableSlots
  *		  for the tuples returned by the access methods and the
  *		  tuples resulting from performing target list projections.
  *
@@ -104,19 +104,36 @@ static TupleDesc ExecTypeFromTLInternal(List *targetList,
 /* --------------------------------
  *		MakeTupleTableSlot
  *
- *		Basic routine to make an empty TupleTableSlot.
+ *		Basic routine to make an empty TupleTableSlot. If tupleDesc is
+ *		specified the slot's descriptor is fixed for it's lifetime, gaining
+ *		some efficiency. If that's undesirable, pass NULL.
  * --------------------------------
  */
 TupleTableSlot *
-MakeTupleTableSlot(void)
+MakeTupleTableSlot(TupleDesc tupleDesc)
 {
-	TupleTableSlot *slot = makeNode(TupleTableSlot);
+	Size		sz;
+	TupleTableSlot *slot;
 
+	/*
+	 * When a fixed descriptor is specified, we can reduce overhead a bit by
+	 * allocating the entire slot in one go.
+	 */
+	if (tupleDesc)
+		sz = MAXALIGN(sizeof(TupleTableSlot)) +
+			MAXALIGN(tupleDesc->natts * sizeof(Datum)) +
+			MAXALIGN(tupleDesc->natts * sizeof(bool));
+	else
+		sz = sizeof(TupleTableSlot);
+
+	slot = palloc0(sz);
+	slot->type = T_TupleTableSlot;
 	slot->tts_isempty = true;
 	slot->tts_shouldFree = false;
 	slot->tts_shouldFreeMin = false;
 	slot->tts_tuple = NULL;
-	slot->tts_tupleDescriptor = NULL;
+	slot->tts_fixedTupleDescriptor = tupleDesc != NULL;
+	slot->tts_tupleDescriptor = tupleDesc;
 	slot->tts_mcxt = CurrentMemoryContext;
 	slot->tts_buffer = InvalidBuffer;
 	slot->tts_nvalid = 0;
@@ -124,6 +141,20 @@ MakeTupleTableSlot(void)
 	slot->tts_isnull = NULL;
 	slot->tts_mintuple = NULL;
 
+	if (tupleDesc != NULL)
+	{
+		slot->tts_values = (Datum * )
+			(((char *) slot)
+			 + MAXALIGN(sizeof(TupleTableSlot)));
+		slot->tts_isnull = (bool * )
+			(((char *) slot)
+			 + MAXALIGN(sizeof(TupleTableSlot))
+			 + MAXALIGN(tupleDesc->natts * sizeof(Datum)));
+		slot->tts_fixedTupleDescriptor = true;
+
+		PinTupleDesc(tupleDesc);
+	}
+
 	return slot;
 }
 
@@ -134,9 +165,9 @@ MakeTupleTableSlot(void)
  * --------------------------------
  */
 TupleTableSlot *
-ExecAllocTableSlot(List **tupleTable)
+ExecAllocTableSlot(List **tupleTable, TupleDesc desc)
 {
-	TupleTableSlot *slot = MakeTupleTableSlot();
+	TupleTableSlot *slot = MakeTupleTableSlot(desc);
 
 	*tupleTable = lappend(*tupleTable, slot);
 
@@ -173,10 +204,13 @@ ExecResetTupleTable(List *tupleTable,	/* tuple table */
 		/* If shouldFree, release memory occupied by the slot itself */
 		if (shouldFree)
 		{
-			if (slot->tts_values)
-				pfree(slot->tts_values);
-			if (slot->tts_isnull)
-				pfree(slot->tts_isnull);
+			if (!slot->tts_fixedTupleDescriptor)
+			{
+				if (slot->tts_values)
+					pfree(slot->tts_values);
+				if (slot->tts_isnull)
+					pfree(slot->tts_isnull);
+			}
 			pfree(slot);
 		}
 	}
@@ -198,9 +232,7 @@ ExecResetTupleTable(List *tupleTable,	/* tuple table */
 TupleTableSlot *
 MakeSingleTupleTableSlot(TupleDesc tupdesc)
 {
-	TupleTableSlot *slot = MakeTupleTableSlot();
-
-	ExecSetSlotDescriptor(slot, tupdesc);
+	TupleTableSlot *slot = MakeTupleTableSlot(tupdesc);
 
 	return slot;
 }
@@ -220,10 +252,13 @@ ExecDropSingleTupleTableSlot(TupleTableSlot *slot)
 	ExecClearTuple(slot);
 	if (slot->tts_tupleDescriptor)
 		ReleaseTupleDesc(slot->tts_tupleDescriptor);
-	if (slot->tts_values)
-		pfree(slot->tts_values);
-	if (slot->tts_isnull)
-		pfree(slot->tts_isnull);
+	if (!slot->tts_fixedTupleDescriptor)
+	{
+		if (slot->tts_values)
+			pfree(slot->tts_values);
+		if (slot->tts_isnull)
+			pfree(slot->tts_isnull);
+	}
 	pfree(slot);
 }
 
@@ -247,6 +282,8 @@ void
 ExecSetSlotDescriptor(TupleTableSlot *slot, /* slot to change */
 					  TupleDesc tupdesc)	/* new tuple descriptor */
 {
+	Assert(!slot->tts_fixedTupleDescriptor);
+
 	/* For safety, make sure slot is empty before changing it */
 	ExecClearTuple(slot);
 
@@ -816,7 +853,7 @@ ExecCopySlot(TupleTableSlot *dstslot, TupleTableSlot *srcslot)
  */
 
 /* --------------------------------
- *		ExecInit{Result,Scan,Extra}TupleSlot
+ *		ExecInit{Result,Scan,Extra}TupleSlot[TL]
  *
  *		These are convenience routines to initialize the specified slot
  *		in nodes inheriting the appropriate state.  ExecInitExtraTupleSlot
@@ -825,13 +862,30 @@ ExecCopySlot(TupleTableSlot *dstslot, TupleTableSlot *srcslot)
  */
 
 /* ----------------
- *		ExecInitResultTupleSlot
+ *		ExecInitResultTupleSlotTL
+ *
+ *		Initialize result tuple slot, using the plan node's targetlist.
  * ----------------
  */
 void
-ExecInitResultTupleSlot(EState *estate, PlanState *planstate)
+ExecInitResultTupleSlotTL(EState *estate, PlanState *planstate)
 {
-	planstate->ps_ResultTupleSlot = ExecAllocTableSlot(&estate->es_tupleTable);
+	bool		hasoid;
+	TupleDesc	tupDesc;
+
+	if (ExecContextForcesOids(planstate, &hasoid))
+	{
+		/* context forces OID choice; hasoid is now set correctly */
+	}
+	else
+	{
+		/* given free choice, don't leave space for OIDs in result tuples */
+		hasoid = false;
+	}
+
+	tupDesc = ExecTypeFromTL(planstate->plan->targetlist, hasoid);
+
+	planstate->ps_ResultTupleSlot = ExecAllocTableSlot(&estate->es_tupleTable, tupDesc);
 }
 
 /* ----------------
@@ -839,19 +893,24 @@ ExecInitResultTupleSlot(EState *estate, PlanState *planstate)
  * ----------------
  */
 void
-ExecInitScanTupleSlot(EState *estate, ScanState *scanstate)
+ExecInitScanTupleSlot(EState *estate, ScanState *scanstate, TupleDesc tupledesc)
 {
-	scanstate->ss_ScanTupleSlot = ExecAllocTableSlot(&estate->es_tupleTable);
+	scanstate->ss_ScanTupleSlot = ExecAllocTableSlot(&estate->es_tupleTable,
+													 tupledesc);
 }
 
 /* ----------------
  *		ExecInitExtraTupleSlot
+ *
+ * Return a newly created slot. If tupledesc is non-NULL it'll have that as a
+ * fixed tupledesc. Otherwise the caller needs to use ExecSetSlotDescriptor()
+ * to set the descriptor before use.
  * ----------------
  */
 TupleTableSlot *
-ExecInitExtraTupleSlot(EState *estate)
+ExecInitExtraTupleSlot(EState *estate, TupleDesc tupledesc)
 {
-	return ExecAllocTableSlot(&estate->es_tupleTable);
+	return ExecAllocTableSlot(&estate->es_tupleTable, tupledesc);
 }
 
 /* ----------------
@@ -865,9 +924,7 @@ ExecInitExtraTupleSlot(EState *estate)
 TupleTableSlot *
 ExecInitNullTupleSlot(EState *estate, TupleDesc tupType)
 {
-	TupleTableSlot *slot = ExecInitExtraTupleSlot(estate);
-
-	ExecSetSlotDescriptor(slot, tupType);
+	TupleTableSlot *slot = ExecInitExtraTupleSlot(estate, tupType);
 
 	return ExecStoreAllNullTuple(slot);
 }
diff --git a/src/backend/executor/execUtils.c b/src/backend/executor/execUtils.c
index 876439835a3..50ccd8d6560 100644
--- a/src/backend/executor/execUtils.c
+++ b/src/backend/executor/execUtils.c
@@ -22,7 +22,6 @@
  *		ReScanExprContext
  *
  *		ExecAssignExprContext	Common code for plan node init routines.
- *		ExecAssignResultType
  *		etc
  *
  *		ExecOpenScanRelation	Common code for scan node init routines.
@@ -428,47 +427,6 @@ ExecAssignExprContext(EState *estate, PlanState *planstate)
 	planstate->ps_ExprContext = CreateExprContext(estate);
 }
 
-/* ----------------
- *		ExecAssignResultType
- * ----------------
- */
-void
-ExecAssignResultType(PlanState *planstate, TupleDesc tupDesc)
-{
-	TupleTableSlot *slot = planstate->ps_ResultTupleSlot;
-
-	ExecSetSlotDescriptor(slot, tupDesc);
-}
-
-/* ----------------
- *		ExecAssignResultTypeFromTL
- * ----------------
- */
-void
-ExecAssignResultTypeFromTL(PlanState *planstate)
-{
-	bool		hasoid;
-	TupleDesc	tupDesc;
-
-	if (ExecContextForcesOids(planstate, &hasoid))
-	{
-		/* context forces OID choice; hasoid is now set correctly */
-	}
-	else
-	{
-		/* given free choice, don't leave space for OIDs in result tuples */
-		hasoid = false;
-	}
-
-	/*
-	 * ExecTypeFromTL needs the parse-time representation of the tlist, not a
-	 * list of ExprStates.  This is good because some plan nodes don't bother
-	 * to set up planstate->targetlist ...
-	 */
-	tupDesc = ExecTypeFromTL(planstate->plan->targetlist, hasoid);
-	ExecAssignResultType(planstate, tupDesc);
-}
-
 /* ----------------
  *		ExecGetResultType
  * ----------------
@@ -609,13 +567,9 @@ ExecFreeExprContext(PlanState *planstate)
 	planstate->ps_ExprContext = NULL;
 }
 
+
 /* ----------------------------------------------------------------
- *		the following scan type support functions are for
- *		those nodes which are stubborn and return tuples in
- *		their Scan tuple slot instead of their Result tuple
- *		slot..  luck fur us, these nodes do not do projections
- *		so we don't have to worry about getting the ProjectionInfo
- *		right for them...  -cim 6/3/91
+ *				  Scan node support
  * ----------------------------------------------------------------
  */
 
@@ -632,11 +586,11 @@ ExecAssignScanType(ScanState *scanstate, TupleDesc tupDesc)
 }
 
 /* ----------------
- *		ExecAssignScanTypeFromOuterPlan
+ *		ExecCreateSlotFromOuterPlan
  * ----------------
  */
 void
-ExecAssignScanTypeFromOuterPlan(ScanState *scanstate)
+ExecCreateScanSlotFromOuterPlan(EState *estate, ScanState *scanstate)
 {
 	PlanState  *outerPlan;
 	TupleDesc	tupDesc;
@@ -644,15 +598,9 @@ ExecAssignScanTypeFromOuterPlan(ScanState *scanstate)
 	outerPlan = outerPlanState(scanstate);
 	tupDesc = ExecGetResultType(outerPlan);
 
-	ExecAssignScanType(scanstate, tupDesc);
+	ExecInitScanTupleSlot(estate, scanstate, tupDesc);
 }
 
-
-/* ----------------------------------------------------------------
- *				  Scan node support
- * ----------------------------------------------------------------
- */
-
 /* ----------------------------------------------------------------
  *		ExecRelationIsTargetRelation
  *
diff --git a/src/backend/executor/nodeAgg.c b/src/backend/executor/nodeAgg.c
index a964b3caf0b..f6469e42d62 100644
--- a/src/backend/executor/nodeAgg.c
+++ b/src/backend/executor/nodeAgg.c
@@ -1390,8 +1390,8 @@ find_hash_columns(AggState *aggstate)
 							  perhash->aggnode->grpOperators,
 							  &perhash->eqfunctions,
 							  &perhash->hashfunctions);
-		perhash->hashslot = ExecAllocTableSlot(&estate->es_tupleTable);
-		ExecSetSlotDescriptor(perhash->hashslot, hashDesc);
+		perhash->hashslot =
+			ExecAllocTableSlot(&estate->es_tupleTable, hashDesc);
 
 		list_free(hashTlist);
 		bms_free(colnos);
@@ -2174,13 +2174,33 @@ ExecInitAgg(Agg *node, EState *estate, int eflags)
 	ExecAssignExprContext(estate, &aggstate->ss.ps);
 
 	/*
-	 * tuple table initialization.
+	 * Initialize child nodes.
 	 *
-	 * For hashtables, we create some additional slots below.
+	 * If we are doing a hashed aggregation then the child plan does not need
+	 * to handle REWIND efficiently; see ExecReScanAgg.
 	 */
-	ExecInitScanTupleSlot(estate, &aggstate->ss);
-	ExecInitResultTupleSlot(estate, &aggstate->ss.ps);
-	aggstate->sort_slot = ExecInitExtraTupleSlot(estate);
+	if (node->aggstrategy == AGG_HASHED)
+		eflags &= ~EXEC_FLAG_REWIND;
+	outerPlan = outerPlan(node);
+	outerPlanState(aggstate) = ExecInitNode(outerPlan, estate, eflags);
+
+	/*
+	 * initialize source tuple type.
+	 */
+	ExecCreateScanSlotFromOuterPlan(estate, &aggstate->ss);
+	if (node->chain)
+	{
+		TupleDesc scandesc;
+
+		scandesc = aggstate->ss.ss_ScanTupleSlot->tts_tupleDescriptor;
+		aggstate->sort_slot = ExecInitExtraTupleSlot(estate, scandesc);
+	}
+
+	/*
+	 * Initialize result type, slot and projection.
+	 */
+	ExecInitResultTupleSlotTL(estate, &aggstate->ss.ps);
+	ExecAssignProjectionInfo(&aggstate->ss.ps, NULL);
 
 	/*
 	 * initialize child expressions
@@ -2198,31 +2218,6 @@ ExecInitAgg(Agg *node, EState *estate, int eflags)
 	aggstate->ss.ps.qual =
 		ExecInitQual(node->plan.qual, (PlanState *) aggstate);
 
-	/*
-	 * Initialize child nodes.
-	 *
-	 * If we are doing a hashed aggregation then the child plan does not need
-	 * to handle REWIND efficiently; see ExecReScanAgg.
-	 */
-	if (node->aggstrategy == AGG_HASHED)
-		eflags &= ~EXEC_FLAG_REWIND;
-	outerPlan = outerPlan(node);
-	outerPlanState(aggstate) = ExecInitNode(outerPlan, estate, eflags);
-
-	/*
-	 * initialize source tuple type.
-	 */
-	ExecAssignScanTypeFromOuterPlan(&aggstate->ss);
-	if (node->chain)
-		ExecSetSlotDescriptor(aggstate->sort_slot,
-							  aggstate->ss.ss_ScanTupleSlot->tts_tupleDescriptor);
-
-	/*
-	 * Initialize result tuple type and projection info.
-	 */
-	ExecAssignResultTypeFromTL(&aggstate->ss.ps);
-	ExecAssignProjectionInfo(&aggstate->ss.ps, NULL);
-
 	/*
 	 * We should now have found all Aggrefs in the targetlist and quals.
 	 */
@@ -3026,8 +3021,8 @@ build_pertrans_for_aggref(AggStatePerTrans pertrans,
 	if (numSortCols > 0 || aggref->aggfilter)
 	{
 		pertrans->sortdesc = ExecTypeFromTL(aggref->args, false);
-		pertrans->sortslot = ExecInitExtraTupleSlot(estate);
-		ExecSetSlotDescriptor(pertrans->sortslot, pertrans->sortdesc);
+		pertrans->sortslot =
+			ExecInitExtraTupleSlot(estate, pertrans->sortdesc);
 	}
 
 	if (numSortCols > 0)
@@ -3048,9 +3043,8 @@ build_pertrans_for_aggref(AggStatePerTrans pertrans,
 		else if (numDistinctCols > 0)
 		{
 			/* we will need an extra slot to store prior values */
-			pertrans->uniqslot = ExecInitExtraTupleSlot(estate);
-			ExecSetSlotDescriptor(pertrans->uniqslot,
-								  pertrans->sortdesc);
+			pertrans->uniqslot =
+				ExecInitExtraTupleSlot(estate, pertrans->sortdesc);
 		}
 
 		/* Extract the sort information for use later */
diff --git a/src/backend/executor/nodeAppend.c b/src/backend/executor/nodeAppend.c
index 246a0b2d852..25cd942f9a3 100644
--- a/src/backend/executor/nodeAppend.c
+++ b/src/backend/executor/nodeAppend.c
@@ -129,17 +129,9 @@ ExecInitAppend(Append *node, EState *estate, int eflags)
 	appendstate->as_nplans = nplans;
 
 	/*
-	 * Miscellaneous initialization
-	 *
-	 * Append plans don't have expression contexts because they never call
-	 * ExecQual or ExecProject.
+	 * Initialize result tuple type and slot.
 	 */
-
-	/*
-	 * append nodes still have Result slots, which hold pointers to tuples, so
-	 * we have to initialize them.
-	 */
-	ExecInitResultTupleSlot(estate, &appendstate->ps);
+	ExecInitResultTupleSlotTL(estate, &appendstate->ps);
 
 	/*
 	 * call ExecInitNode on each of the plans to be executed and save the
@@ -155,9 +147,11 @@ ExecInitAppend(Append *node, EState *estate, int eflags)
 	}
 
 	/*
-	 * initialize output tuple type
+	 * Miscellaneous initialization
+	 *
+	 * Append plans don't have expression contexts because they never call
+	 * ExecQual or ExecProject.
 	 */
-	ExecAssignResultTypeFromTL(&appendstate->ps);
 	appendstate->ps.ps_ProjInfo = NULL;
 
 	/*
diff --git a/src/backend/executor/nodeBitmapAnd.c b/src/backend/executor/nodeBitmapAnd.c
index 1c5c312c954..b2b30842c6a 100644
--- a/src/backend/executor/nodeBitmapAnd.c
+++ b/src/backend/executor/nodeBitmapAnd.c
@@ -80,13 +80,6 @@ ExecInitBitmapAnd(BitmapAnd *node, EState *estate, int eflags)
 	bitmapandstate->bitmapplans = bitmapplanstates;
 	bitmapandstate->nplans = nplans;
 
-	/*
-	 * Miscellaneous initialization
-	 *
-	 * BitmapAnd plans don't have expression contexts because they never call
-	 * ExecQual or ExecProject.  They don't need any tuple slots either.
-	 */
-
 	/*
 	 * call ExecInitNode on each of the plans to be executed and save the
 	 * results into the array "bitmapplanstates".
@@ -99,6 +92,13 @@ ExecInitBitmapAnd(BitmapAnd *node, EState *estate, int eflags)
 		i++;
 	}
 
+	/*
+	 * Miscellaneous initialization
+	 *
+	 * BitmapAnd plans don't have expression contexts because they never call
+	 * ExecQual or ExecProject.  They don't need any tuple slots either.
+	 */
+
 	return bitmapandstate;
 }
 
diff --git a/src/backend/executor/nodeBitmapHeapscan.c b/src/backend/executor/nodeBitmapHeapscan.c
index eb5bbb57ef1..5872096979c 100644
--- a/src/backend/executor/nodeBitmapHeapscan.c
+++ b/src/backend/executor/nodeBitmapHeapscan.c
@@ -911,6 +911,33 @@ ExecInitBitmapHeapScan(BitmapHeapScan *node, EState *estate, int eflags)
 	 */
 	ExecAssignExprContext(estate, &scanstate->ss.ps);
 
+	/*
+	 * open the base relation and acquire appropriate lock on it.
+	 */
+	currentRelation = ExecOpenScanRelation(estate, node->scan.scanrelid, eflags);
+
+	/*
+	 * initialize child nodes
+	 *
+	 * We do this after ExecOpenScanRelation because the child nodes will open
+	 * indexscans on our relation's indexes, and we want to be sure we have
+	 * acquired a lock on the relation first.
+	 */
+	outerPlanState(scanstate) = ExecInitNode(outerPlan(node), estate, eflags);
+
+	/*
+	 * get the scan type from the relation descriptor.
+	 */
+	ExecInitScanTupleSlot(estate, &scanstate->ss,
+						  RelationGetDescr(currentRelation));
+
+
+	/*
+	 * Initialize result slot, type and projection.
+	 */
+	ExecInitResultTupleSlotTL(estate, &scanstate->ss.ps);
+	ExecAssignScanProjectionInfo(&scanstate->ss);
+
 	/*
 	 * initialize child expressions
 	 */
@@ -919,17 +946,6 @@ ExecInitBitmapHeapScan(BitmapHeapScan *node, EState *estate, int eflags)
 	scanstate->bitmapqualorig =
 		ExecInitQual(node->bitmapqualorig, (PlanState *) scanstate);
 
-	/*
-	 * tuple table initialization
-	 */
-	ExecInitResultTupleSlot(estate, &scanstate->ss.ps);
-	ExecInitScanTupleSlot(estate, &scanstate->ss);
-
-	/*
-	 * open the base relation and acquire appropriate lock on it.
-	 */
-	currentRelation = ExecOpenScanRelation(estate, node->scan.scanrelid, eflags);
-
 	/*
 	 * Determine the maximum for prefetch_target.  If the tablespace has a
 	 * specific IO concurrency set, use that to compute the corresponding
@@ -957,26 +973,6 @@ ExecInitBitmapHeapScan(BitmapHeapScan *node, EState *estate, int eflags)
 														 0,
 														 NULL);
 
-	/*
-	 * get the scan type from the relation descriptor.
-	 */
-	ExecAssignScanType(&scanstate->ss, RelationGetDescr(currentRelation));
-
-	/*
-	 * Initialize result tuple type and projection info.
-	 */
-	ExecAssignResultTypeFromTL(&scanstate->ss.ps);
-	ExecAssignScanProjectionInfo(&scanstate->ss);
-
-	/*
-	 * initialize child nodes
-	 *
-	 * We do this last because the child nodes will open indexscans on our
-	 * relation's indexes, and we want to be sure we have acquired a lock on
-	 * the relation first.
-	 */
-	outerPlanState(scanstate) = ExecInitNode(outerPlan(node), estate, eflags);
-
 	/*
 	 * all done.
 	 */
diff --git a/src/backend/executor/nodeBitmapIndexscan.c b/src/backend/executor/nodeBitmapIndexscan.c
index 6feb70f4ae3..ab95c944833 100644
--- a/src/backend/executor/nodeBitmapIndexscan.c
+++ b/src/backend/executor/nodeBitmapIndexscan.c
@@ -226,6 +226,15 @@ ExecInitBitmapIndexScan(BitmapIndexScan *node, EState *estate, int eflags)
 	/* normally we don't make the result bitmap till runtime */
 	indexstate->biss_result = NULL;
 
+	/*
+	 * We do not open or lock the base relation here.  We assume that an
+	 * ancestor BitmapHeapScan node is holding AccessShareLock (or better) on
+	 * the heap relation throughout the execution of the plan tree.
+	 */
+
+	indexstate->ss.ss_currentRelation = NULL;
+	indexstate->ss.ss_currentScanDesc = NULL;
+
 	/*
 	 * Miscellaneous initialization
 	 *
@@ -242,15 +251,6 @@ ExecInitBitmapIndexScan(BitmapIndexScan *node, EState *estate, int eflags)
 	 * sub-parts corresponding to runtime keys (see below).
 	 */
 
-	/*
-	 * We do not open or lock the base relation here.  We assume that an
-	 * ancestor BitmapHeapScan node is holding AccessShareLock (or better) on
-	 * the heap relation throughout the execution of the plan tree.
-	 */
-
-	indexstate->ss.ss_currentRelation = NULL;
-	indexstate->ss.ss_currentScanDesc = NULL;
-
 	/*
 	 * If we are just doing EXPLAIN (ie, aren't going to run the plan), stop
 	 * here.  This allows an index-advisor plugin to EXPLAIN a plan containing
diff --git a/src/backend/executor/nodeBitmapOr.c b/src/backend/executor/nodeBitmapOr.c
index 66a7a89a8b7..73c08e46523 100644
--- a/src/backend/executor/nodeBitmapOr.c
+++ b/src/backend/executor/nodeBitmapOr.c
@@ -81,13 +81,6 @@ ExecInitBitmapOr(BitmapOr *node, EState *estate, int eflags)
 	bitmaporstate->bitmapplans = bitmapplanstates;
 	bitmaporstate->nplans = nplans;
 
-	/*
-	 * Miscellaneous initialization
-	 *
-	 * BitmapOr plans don't have expression contexts because they never call
-	 * ExecQual or ExecProject.  They don't need any tuple slots either.
-	 */
-
 	/*
 	 * call ExecInitNode on each of the plans to be executed and save the
 	 * results into the array "bitmapplanstates".
@@ -100,6 +93,13 @@ ExecInitBitmapOr(BitmapOr *node, EState *estate, int eflags)
 		i++;
 	}
 
+	/*
+	 * Miscellaneous initialization
+	 *
+	 * BitmapOr plans don't have expression contexts because they never call
+	 * ExecQual or ExecProject.  They don't need any tuple slots either.
+	 */
+
 	return bitmaporstate;
 }
 
diff --git a/src/backend/executor/nodeCtescan.c b/src/backend/executor/nodeCtescan.c
index 79676ca9787..a349c8a6455 100644
--- a/src/backend/executor/nodeCtescan.c
+++ b/src/backend/executor/nodeCtescan.c
@@ -242,31 +242,25 @@ ExecInitCteScan(CteScan *node, EState *estate, int eflags)
 	 */
 	ExecAssignExprContext(estate, &scanstate->ss.ps);
 
+	/*
+	 * The scan tuple type (ie, the rowtype we expect to find in the work
+	 * table) is the same as the result rowtype of the CTE query.
+	 */
+	ExecInitScanTupleSlot(estate, &scanstate->ss,
+						  ExecGetResultType(scanstate->cteplanstate));
+
+	/*
+	 * Initialize result slot, type and projection.
+	 */
+	ExecInitResultTupleSlotTL(estate, &scanstate->ss.ps);
+	ExecAssignScanProjectionInfo(&scanstate->ss);
+
 	/*
 	 * initialize child expressions
 	 */
 	scanstate->ss.ps.qual =
 		ExecInitQual(node->scan.plan.qual, (PlanState *) scanstate);
 
-	/*
-	 * tuple table initialization
-	 */
-	ExecInitResultTupleSlot(estate, &scanstate->ss.ps);
-	ExecInitScanTupleSlot(estate, &scanstate->ss);
-
-	/*
-	 * The scan tuple type (ie, the rowtype we expect to find in the work
-	 * table) is the same as the result rowtype of the CTE query.
-	 */
-	ExecAssignScanType(&scanstate->ss,
-					   ExecGetResultType(scanstate->cteplanstate));
-
-	/*
-	 * Initialize result tuple type and projection info.
-	 */
-	ExecAssignResultTypeFromTL(&scanstate->ss.ps);
-	ExecAssignScanProjectionInfo(&scanstate->ss);
-
 	return scanstate;
 }
 
diff --git a/src/backend/executor/nodeCustom.c b/src/backend/executor/nodeCustom.c
index 5f1732d6ac0..9e398ea3133 100644
--- a/src/backend/executor/nodeCustom.c
+++ b/src/backend/executor/nodeCustom.c
@@ -54,14 +54,6 @@ ExecInitCustomScan(CustomScan *cscan, EState *estate, int eflags)
 	/* create expression context for node */
 	ExecAssignExprContext(estate, &css->ss.ps);
 
-	/* initialize child expressions */
-	css->ss.ps.qual =
-		ExecInitQual(cscan->scan.plan.qual, (PlanState *) css);
-
-	/* tuple table initialization */
-	ExecInitScanTupleSlot(estate, &css->ss);
-	ExecInitResultTupleSlot(estate, &css->ss.ps);
-
 	/*
 	 * open the base relation, if any, and acquire an appropriate lock on it
 	 */
@@ -81,23 +73,27 @@ ExecInitCustomScan(CustomScan *cscan, EState *estate, int eflags)
 		TupleDesc	scan_tupdesc;
 
 		scan_tupdesc = ExecTypeFromTL(cscan->custom_scan_tlist, false);
-		ExecAssignScanType(&css->ss, scan_tupdesc);
+		ExecInitScanTupleSlot(estate, &css->ss, scan_tupdesc);
 		/* Node's targetlist will contain Vars with varno = INDEX_VAR */
 		tlistvarno = INDEX_VAR;
 	}
 	else
 	{
-		ExecAssignScanType(&css->ss, RelationGetDescr(scan_rel));
+		ExecInitScanTupleSlot(estate, &css->ss, RelationGetDescr(scan_rel));
 		/* Node's targetlist will contain Vars with varno = scanrelid */
 		tlistvarno = scanrelid;
 	}
 
 	/*
-	 * Initialize result tuple type and projection info.
+	 * Initialize result slot, type and projection.
 	 */
-	ExecAssignResultTypeFromTL(&css->ss.ps);
+	ExecInitResultTupleSlotTL(estate, &css->ss.ps);
 	ExecAssignScanProjectionInfoWithVarno(&css->ss, tlistvarno);
 
+	/* initialize child expressions */
+	css->ss.ps.qual =
+		ExecInitQual(cscan->scan.plan.qual, (PlanState *) css);
+
 	/*
 	 * The callback of custom-scan provider applies the final initialization
 	 * of the custom-scan-state node according to its logic.
diff --git a/src/backend/executor/nodeForeignscan.c b/src/backend/executor/nodeForeignscan.c
index dc6cfcfa66b..37e23708510 100644
--- a/src/backend/executor/nodeForeignscan.c
+++ b/src/backend/executor/nodeForeignscan.c
@@ -155,20 +155,6 @@ ExecInitForeignScan(ForeignScan *node, EState *estate, int eflags)
 	 */
 	ExecAssignExprContext(estate, &scanstate->ss.ps);
 
-	/*
-	 * initialize child expressions
-	 */
-	scanstate->ss.ps.qual =
-		ExecInitQual(node->scan.plan.qual, (PlanState *) scanstate);
-	scanstate->fdw_recheck_quals =
-		ExecInitQual(node->fdw_recheck_quals, (PlanState *) scanstate);
-
-	/*
-	 * tuple table initialization
-	 */
-	ExecInitResultTupleSlot(estate, &scanstate->ss.ps);
-	ExecInitScanTupleSlot(estate, &scanstate->ss);
-
 	/*
 	 * open the base relation, if any, and acquire an appropriate lock on it;
 	 * also acquire function pointers from the FDW's handler
@@ -194,23 +180,31 @@ ExecInitForeignScan(ForeignScan *node, EState *estate, int eflags)
 		TupleDesc	scan_tupdesc;
 
 		scan_tupdesc = ExecTypeFromTL(node->fdw_scan_tlist, false);
-		ExecAssignScanType(&scanstate->ss, scan_tupdesc);
+		ExecInitScanTupleSlot(estate, &scanstate->ss, scan_tupdesc);
 		/* Node's targetlist will contain Vars with varno = INDEX_VAR */
 		tlistvarno = INDEX_VAR;
 	}
 	else
 	{
-		ExecAssignScanType(&scanstate->ss, RelationGetDescr(currentRelation));
+		ExecInitScanTupleSlot(estate, &scanstate->ss, RelationGetDescr(currentRelation));
 		/* Node's targetlist will contain Vars with varno = scanrelid */
 		tlistvarno = scanrelid;
 	}
 
 	/*
-	 * Initialize result tuple type and projection info.
+	 * Initialize result slot, type and projection.
 	 */
-	ExecAssignResultTypeFromTL(&scanstate->ss.ps);
+	ExecInitResultTupleSlotTL(estate, &scanstate->ss.ps);
 	ExecAssignScanProjectionInfoWithVarno(&scanstate->ss, tlistvarno);
 
+	/*
+	 * initialize child expressions
+	 */
+	scanstate->ss.ps.qual =
+		ExecInitQual(node->scan.plan.qual, (PlanState *) scanstate);
+	scanstate->fdw_recheck_quals =
+		ExecInitQual(node->fdw_recheck_quals, (PlanState *) scanstate);
+
 	/*
 	 * Initialize FDW-related state.
 	 */
diff --git a/src/backend/executor/nodeFunctionscan.c b/src/backend/executor/nodeFunctionscan.c
index de476ac75c4..e7e82203a50 100644
--- a/src/backend/executor/nodeFunctionscan.c
+++ b/src/backend/executor/nodeFunctionscan.c
@@ -334,18 +334,6 @@ ExecInitFunctionScan(FunctionScan *node, EState *estate, int eflags)
 	 */
 	ExecAssignExprContext(estate, &scanstate->ss.ps);
 
-	/*
-	 * tuple table initialization
-	 */
-	ExecInitResultTupleSlot(estate, &scanstate->ss.ps);
-	ExecInitScanTupleSlot(estate, &scanstate->ss);
-
-	/*
-	 * initialize child expressions
-	 */
-	scanstate->ss.ps.qual =
-		ExecInitQual(node->scan.plan.qual, (PlanState *) scanstate);
-
 	scanstate->funcstates = palloc(nfuncs * sizeof(FunctionScanPerFuncState));
 
 	natts = 0;
@@ -436,8 +424,7 @@ ExecInitFunctionScan(FunctionScan *node, EState *estate, int eflags)
 		 */
 		if (!scanstate->simple)
 		{
-			fs->func_slot = ExecInitExtraTupleSlot(estate);
-			ExecSetSlotDescriptor(fs->func_slot, fs->tupdesc);
+			fs->func_slot = ExecInitExtraTupleSlot(estate, fs->tupdesc);
 		}
 		else
 			fs->func_slot = NULL;
@@ -492,14 +479,24 @@ ExecInitFunctionScan(FunctionScan *node, EState *estate, int eflags)
 		Assert(attno == natts);
 	}
 
-	ExecAssignScanType(&scanstate->ss, scan_tupdesc);
+	/*
+	 * tuple table initialization
+	 */
+	ExecInitResultTupleSlotTL(estate, &scanstate->ss.ps);
+	ExecInitScanTupleSlot(estate, &scanstate->ss, scan_tupdesc);
 
 	/*
-	 * Initialize result tuple type and projection info.
+	 * Initialize projection.
 	 */
-	ExecAssignResultTypeFromTL(&scanstate->ss.ps);
 	ExecAssignScanProjectionInfo(&scanstate->ss);
 
+	/*
+	 * initialize child expressions
+	 */
+	scanstate->ss.ps.qual =
+		ExecInitQual(node->scan.plan.qual, (PlanState *) scanstate);
+
+
 	/*
 	 * Create a memory context that ExecMakeTableFunctionResult can use to
 	 * evaluate function arguments in.  We can't use the per-tuple context for
diff --git a/src/backend/executor/nodeGather.c b/src/backend/executor/nodeGather.c
index a44cf8409af..65daba4d026 100644
--- a/src/backend/executor/nodeGather.c
+++ b/src/backend/executor/nodeGather.c
@@ -59,7 +59,6 @@ ExecInitGather(Gather *node, EState *estate, int eflags)
 {
 	GatherState *gatherstate;
 	Plan	   *outerNode;
-	bool		hasoid;
 	TupleDesc	tupDesc;
 
 	/* Gather node doesn't have innerPlan node. */
@@ -85,37 +84,29 @@ ExecInitGather(Gather *node, EState *estate, int eflags)
 	 */
 	ExecAssignExprContext(estate, &gatherstate->ps);
 
-	/*
-	 * Gather doesn't support checking a qual (it's always more efficient to
-	 * do it in the child node).
-	 */
-	Assert(!node->plan.qual);
-
-	/*
-	 * tuple table initialization
-	 */
-	gatherstate->funnel_slot = ExecInitExtraTupleSlot(estate);
-	ExecInitResultTupleSlot(estate, &gatherstate->ps);
-
 	/*
 	 * now initialize outer plan
 	 */
 	outerNode = outerPlan(node);
 	outerPlanState(gatherstate) = ExecInitNode(outerNode, estate, eflags);
+	tupDesc = ExecGetResultType(outerPlanState(gatherstate));
+
+	/*
+	 * Initialize result slot, type and projection.
+	 */
+	ExecInitResultTupleSlotTL(estate, &gatherstate->ps);
+	ExecConditionalAssignProjectionInfo(&gatherstate->ps, tupDesc, OUTER_VAR);
 
 	/*
 	 * Initialize funnel slot to same tuple descriptor as outer plan.
 	 */
-	if (!ExecContextForcesOids(outerPlanState(gatherstate), &hasoid))
-		hasoid = false;
-	tupDesc = ExecTypeFromTL(outerNode->targetlist, hasoid);
-	ExecSetSlotDescriptor(gatherstate->funnel_slot, tupDesc);
+	gatherstate->funnel_slot = ExecInitExtraTupleSlot(estate, tupDesc);
 
 	/*
-	 * Initialize result tuple type and projection info.
+	 * Gather doesn't support checking a qual (it's always more efficient to
+	 * do it in the child node).
 	 */
-	ExecAssignResultTypeFromTL(&gatherstate->ps);
-	ExecConditionalAssignProjectionInfo(&gatherstate->ps, tupDesc, OUTER_VAR);
+	Assert(!node->plan.qual);
 
 	return gatherstate;
 }
diff --git a/src/backend/executor/nodeGatherMerge.c b/src/backend/executor/nodeGatherMerge.c
index 4a8a59eabf1..aaa595351d1 100644
--- a/src/backend/executor/nodeGatherMerge.c
+++ b/src/backend/executor/nodeGatherMerge.c
@@ -73,7 +73,6 @@ ExecInitGatherMerge(GatherMerge *node, EState *estate, int eflags)
 {
 	GatherMergeState *gm_state;
 	Plan	   *outerNode;
-	bool		hasoid;
 	TupleDesc	tupDesc;
 
 	/* Gather merge node doesn't have innerPlan node. */
@@ -104,11 +103,6 @@ ExecInitGatherMerge(GatherMerge *node, EState *estate, int eflags)
 	 */
 	Assert(!node->plan.qual);
 
-	/*
-	 * tuple table initialization
-	 */
-	ExecInitResultTupleSlot(estate, &gm_state->ps);
-
 	/*
 	 * now initialize outer plan
 	 */
@@ -119,15 +113,13 @@ ExecInitGatherMerge(GatherMerge *node, EState *estate, int eflags)
 	 * Store the tuple descriptor into gather merge state, so we can use it
 	 * while initializing the gather merge slots.
 	 */
-	if (!ExecContextForcesOids(outerPlanState(gm_state), &hasoid))
-		hasoid = false;
-	tupDesc = ExecTypeFromTL(outerNode->targetlist, hasoid);
+	tupDesc = ExecGetResultType(outerPlanState(gm_state));
 	gm_state->tupDesc = tupDesc;
 
 	/*
-	 * Initialize result tuple type and projection info.
+	 * Initialize result slot, type and projection.
 	 */
-	ExecAssignResultTypeFromTL(&gm_state->ps);
+	ExecInitResultTupleSlotTL(estate, &gm_state->ps);
 	ExecConditionalAssignProjectionInfo(&gm_state->ps, tupDesc, OUTER_VAR);
 
 	/*
@@ -410,9 +402,8 @@ gather_merge_setup(GatherMergeState *gm_state)
 			(HeapTuple *) palloc0(sizeof(HeapTuple) * MAX_TUPLE_STORE);
 
 		/* Initialize tuple slot for worker */
-		gm_state->gm_slots[i + 1] = ExecInitExtraTupleSlot(gm_state->ps.state);
-		ExecSetSlotDescriptor(gm_state->gm_slots[i + 1],
-							  gm_state->tupDesc);
+		gm_state->gm_slots[i + 1] =
+			ExecInitExtraTupleSlot(gm_state->ps.state, gm_state->tupDesc);
 	}
 
 	/* Allocate the resources for the merge */
diff --git a/src/backend/executor/nodeGroup.c b/src/backend/executor/nodeGroup.c
index b9ba0f7c702..a30f6f15278 100644
--- a/src/backend/executor/nodeGroup.c
+++ b/src/backend/executor/nodeGroup.c
@@ -181,10 +181,20 @@ ExecInitGroup(Group *node, EState *estate, int eflags)
 	ExecAssignExprContext(estate, &grpstate->ss.ps);
 
 	/*
-	 * tuple table initialization
+	 * initialize child nodes
 	 */
-	ExecInitScanTupleSlot(estate, &grpstate->ss);
-	ExecInitResultTupleSlot(estate, &grpstate->ss.ps);
+	outerPlanState(grpstate) = ExecInitNode(outerPlan(node), estate, eflags);
+
+	/*
+	 * Initialize scan slot and type.
+	 */
+	ExecCreateScanSlotFromOuterPlan(estate, &grpstate->ss);
+
+	/*
+	 * Initialize result slot, type and projection.
+	 */
+	ExecInitResultTupleSlotTL(estate, &grpstate->ss.ps);
+	ExecAssignProjectionInfo(&grpstate->ss.ps, NULL);
 
 	/*
 	 * initialize child expressions
@@ -192,22 +202,6 @@ ExecInitGroup(Group *node, EState *estate, int eflags)
 	grpstate->ss.ps.qual =
 		ExecInitQual(node->plan.qual, (PlanState *) grpstate);
 
-	/*
-	 * initialize child nodes
-	 */
-	outerPlanState(grpstate) = ExecInitNode(outerPlan(node), estate, eflags);
-
-	/*
-	 * initialize tuple type.
-	 */
-	ExecAssignScanTypeFromOuterPlan(&grpstate->ss);
-
-	/*
-	 * Initialize result tuple type and projection info.
-	 */
-	ExecAssignResultTypeFromTL(&grpstate->ss.ps);
-	ExecAssignProjectionInfo(&grpstate->ss.ps, NULL);
-
 	/*
 	 * Precompute fmgr lookup data for inner loop
 	 */
diff --git a/src/backend/executor/nodeHash.c b/src/backend/executor/nodeHash.c
index 6fe5d69d558..8f9b7dd51ea 100644
--- a/src/backend/executor/nodeHash.c
+++ b/src/backend/executor/nodeHash.c
@@ -184,9 +184,16 @@ ExecInitHash(Hash *node, EState *estate, int eflags)
 	ExecAssignExprContext(estate, &hashstate->ps);
 
 	/*
-	 * initialize our result slot
+	 * initialize child nodes
 	 */
-	ExecInitResultTupleSlot(estate, &hashstate->ps);
+	outerPlanState(hashstate) = ExecInitNode(outerPlan(node), estate, eflags);
+
+	/*
+	 * initialize our result slot and type. No need to build projection
+	 * because this node doesn't do projections.
+	 */
+	ExecInitResultTupleSlotTL(estate, &hashstate->ps);
+	hashstate->ps.ps_ProjInfo = NULL;
 
 	/*
 	 * initialize child expressions
@@ -194,18 +201,6 @@ ExecInitHash(Hash *node, EState *estate, int eflags)
 	hashstate->ps.qual =
 		ExecInitQual(node->plan.qual, (PlanState *) hashstate);
 
-	/*
-	 * initialize child nodes
-	 */
-	outerPlanState(hashstate) = ExecInitNode(outerPlan(node), estate, eflags);
-
-	/*
-	 * initialize tuple type. no need to initialize projection info because
-	 * this node doesn't do projections
-	 */
-	ExecAssignResultTypeFromTL(&hashstate->ps);
-	hashstate->ps.ps_ProjInfo = NULL;
-
 	return hashstate;
 }
 
diff --git a/src/backend/executor/nodeHashjoin.c b/src/backend/executor/nodeHashjoin.c
index ab1632cc13d..d9efbff77e3 100644
--- a/src/backend/executor/nodeHashjoin.c
+++ b/src/backend/executor/nodeHashjoin.c
@@ -389,6 +389,7 @@ ExecInitHashJoin(HashJoin *node, EState *estate, int eflags)
 	List	   *lclauses;
 	List	   *rclauses;
 	List	   *hoperators;
+	TupleDesc	outerDesc, innerDesc;
 	ListCell   *l;
 
 	/* check for unsupported flags */
@@ -401,6 +402,7 @@ ExecInitHashJoin(HashJoin *node, EState *estate, int eflags)
 	hjstate->js.ps.plan = (Plan *) node;
 	hjstate->js.ps.state = estate;
 	hjstate->js.ps.ExecProcNode = ExecHashJoin;
+	hjstate->js.jointype = node->join.jointype;
 
 	/*
 	 * Miscellaneous initialization
@@ -409,17 +411,6 @@ ExecInitHashJoin(HashJoin *node, EState *estate, int eflags)
 	 */
 	ExecAssignExprContext(estate, &hjstate->js.ps);
 
-	/*
-	 * initialize child expressions
-	 */
-	hjstate->js.ps.qual =
-		ExecInitQual(node->join.plan.qual, (PlanState *) hjstate);
-	hjstate->js.jointype = node->join.jointype;
-	hjstate->js.joinqual =
-		ExecInitQual(node->join.joinqual, (PlanState *) hjstate);
-	hjstate->hashclauses =
-		ExecInitQual(node->hashclauses, (PlanState *) hjstate);
-
 	/*
 	 * initialize child nodes
 	 *
@@ -431,13 +422,15 @@ ExecInitHashJoin(HashJoin *node, EState *estate, int eflags)
 	hashNode = (Hash *) innerPlan(node);
 
 	outerPlanState(hjstate) = ExecInitNode(outerNode, estate, eflags);
+	outerDesc = ExecGetResultType(outerPlanState(hjstate));
 	innerPlanState(hjstate) = ExecInitNode((Plan *) hashNode, estate, eflags);
+	innerDesc = ExecGetResultType(innerPlanState(hjstate));
 
 	/*
 	 * tuple table initialization
 	 */
-	ExecInitResultTupleSlot(estate, &hjstate->js.ps);
-	hjstate->hj_OuterTupleSlot = ExecInitExtraTupleSlot(estate);
+	ExecInitResultTupleSlotTL(estate, &hjstate->js.ps);
+	hjstate->hj_OuterTupleSlot = ExecInitExtraTupleSlot(estate, outerDesc);
 
 	/*
 	 * detect whether we need only consider the first matching inner tuple
@@ -454,21 +447,17 @@ ExecInitHashJoin(HashJoin *node, EState *estate, int eflags)
 		case JOIN_LEFT:
 		case JOIN_ANTI:
 			hjstate->hj_NullInnerTupleSlot =
-				ExecInitNullTupleSlot(estate,
-									  ExecGetResultType(innerPlanState(hjstate)));
+				ExecInitNullTupleSlot(estate, innerDesc);
 			break;
 		case JOIN_RIGHT:
 			hjstate->hj_NullOuterTupleSlot =
-				ExecInitNullTupleSlot(estate,
-									  ExecGetResultType(outerPlanState(hjstate)));
+				ExecInitNullTupleSlot(estate, outerDesc);
 			break;
 		case JOIN_FULL:
 			hjstate->hj_NullOuterTupleSlot =
-				ExecInitNullTupleSlot(estate,
-									  ExecGetResultType(outerPlanState(hjstate)));
+				ExecInitNullTupleSlot(estate, outerDesc);
 			hjstate->hj_NullInnerTupleSlot =
-				ExecInitNullTupleSlot(estate,
-									  ExecGetResultType(innerPlanState(hjstate)));
+				ExecInitNullTupleSlot(estate, innerDesc);
 			break;
 		default:
 			elog(ERROR, "unrecognized join type: %d",
@@ -490,13 +479,19 @@ ExecInitHashJoin(HashJoin *node, EState *estate, int eflags)
 	}
 
 	/*
-	 * initialize tuple type and projection info
+	 * initialize projection info
 	 */
-	ExecAssignResultTypeFromTL(&hjstate->js.ps);
 	ExecAssignProjectionInfo(&hjstate->js.ps, NULL);
 
-	ExecSetSlotDescriptor(hjstate->hj_OuterTupleSlot,
-						  ExecGetResultType(outerPlanState(hjstate)));
+	/*
+	 * initialize child expressions
+	 */
+	hjstate->js.ps.qual =
+		ExecInitQual(node->join.plan.qual, (PlanState *) hjstate);
+	hjstate->js.joinqual =
+		ExecInitQual(node->join.joinqual, (PlanState *) hjstate);
+	hjstate->hashclauses =
+		ExecInitQual(node->hashclauses, (PlanState *) hjstate);
 
 	/*
 	 * initialize hash-specific info
diff --git a/src/backend/executor/nodeIndexonlyscan.c b/src/backend/executor/nodeIndexonlyscan.c
index c54c5aa6591..4f9db40cbcd 100644
--- a/src/backend/executor/nodeIndexonlyscan.c
+++ b/src/backend/executor/nodeIndexonlyscan.c
@@ -474,23 +474,6 @@ ExecInitIndexOnlyScan(IndexOnlyScan *node, EState *estate, int eflags)
 	 */
 	ExecAssignExprContext(estate, &indexstate->ss.ps);
 
-	/*
-	 * initialize child expressions
-	 *
-	 * Note: we don't initialize all of the indexorderby expression, only the
-	 * sub-parts corresponding to runtime keys (see below).
-	 */
-	indexstate->ss.ps.qual =
-		ExecInitQual(node->scan.plan.qual, (PlanState *) indexstate);
-	indexstate->indexqual =
-		ExecInitQual(node->indexqual, (PlanState *) indexstate);
-
-	/*
-	 * tuple table initialization
-	 */
-	ExecInitResultTupleSlot(estate, &indexstate->ss.ps);
-	ExecInitScanTupleSlot(estate, &indexstate->ss);
-
 	/*
 	 * open the base relation and acquire appropriate lock on it.
 	 */
@@ -507,16 +490,27 @@ ExecInitIndexOnlyScan(IndexOnlyScan *node, EState *estate, int eflags)
 	 * suitable data anyway.)
 	 */
 	tupDesc = ExecTypeFromTL(node->indextlist, false);
-	ExecAssignScanType(&indexstate->ss, tupDesc);
+	ExecInitScanTupleSlot(estate, &indexstate->ss, tupDesc);
 
 	/*
-	 * Initialize result tuple type and projection info.  The node's
+	 * Initialize result slot, type and projection info.  The node's
 	 * targetlist will contain Vars with varno = INDEX_VAR, referencing the
 	 * scan tuple.
 	 */
-	ExecAssignResultTypeFromTL(&indexstate->ss.ps);
+	ExecInitResultTupleSlotTL(estate, &indexstate->ss.ps);
 	ExecAssignScanProjectionInfoWithVarno(&indexstate->ss, INDEX_VAR);
 
+	/*
+	 * initialize child expressions
+	 *
+	 * Note: we don't initialize all of the indexorderby expression, only the
+	 * sub-parts corresponding to runtime keys (see below).
+	 */
+	indexstate->ss.ps.qual =
+		ExecInitQual(node->scan.plan.qual, (PlanState *) indexstate);
+	indexstate->indexqual =
+		ExecInitQual(node->indexqual, (PlanState *) indexstate);
+
 	/*
 	 * If we are just doing EXPLAIN (ie, aren't going to run the plan), stop
 	 * here.  This allows an index-advisor plugin to EXPLAIN a plan containing
diff --git a/src/backend/executor/nodeIndexscan.c b/src/backend/executor/nodeIndexscan.c
index 2ffef231077..ca1458f6b9c 100644
--- a/src/backend/executor/nodeIndexscan.c
+++ b/src/backend/executor/nodeIndexscan.c
@@ -900,6 +900,26 @@ ExecInitIndexScan(IndexScan *node, EState *estate, int eflags)
 	 */
 	ExecAssignExprContext(estate, &indexstate->ss.ps);
 
+	/*
+	 * open the base relation and acquire appropriate lock on it.
+	 */
+	currentRelation = ExecOpenScanRelation(estate, node->scan.scanrelid, eflags);
+
+	indexstate->ss.ss_currentRelation = currentRelation;
+	indexstate->ss.ss_currentScanDesc = NULL;	/* no heap scan here */
+
+	/*
+	 * get the scan type from the relation descriptor.
+	 */
+	ExecInitScanTupleSlot(estate, &indexstate->ss,
+						  RelationGetDescr(currentRelation));
+
+	/*
+	 * Initialize result slot, type and projection.
+	 */
+	ExecInitResultTupleSlotTL(estate, &indexstate->ss.ps);
+	ExecAssignScanProjectionInfo(&indexstate->ss);
+
 	/*
 	 * initialize child expressions
 	 *
@@ -917,31 +937,6 @@ ExecInitIndexScan(IndexScan *node, EState *estate, int eflags)
 	indexstate->indexorderbyorig =
 		ExecInitExprList(node->indexorderbyorig, (PlanState *) indexstate);
 
-	/*
-	 * tuple table initialization
-	 */
-	ExecInitResultTupleSlot(estate, &indexstate->ss.ps);
-	ExecInitScanTupleSlot(estate, &indexstate->ss);
-
-	/*
-	 * open the base relation and acquire appropriate lock on it.
-	 */
-	currentRelation = ExecOpenScanRelation(estate, node->scan.scanrelid, eflags);
-
-	indexstate->ss.ss_currentRelation = currentRelation;
-	indexstate->ss.ss_currentScanDesc = NULL;	/* no heap scan here */
-
-	/*
-	 * get the scan type from the relation descriptor.
-	 */
-	ExecAssignScanType(&indexstate->ss, RelationGetDescr(currentRelation));
-
-	/*
-	 * Initialize result tuple type and projection info.
-	 */
-	ExecAssignResultTypeFromTL(&indexstate->ss.ps);
-	ExecAssignScanProjectionInfo(&indexstate->ss);
-
 	/*
 	 * If we are just doing EXPLAIN (ie, aren't going to run the plan), stop
 	 * here.  This allows an index-advisor plugin to EXPLAIN a plan containing
diff --git a/src/backend/executor/nodeLimit.c b/src/backend/executor/nodeLimit.c
index 883f46ce7c9..fcd0967f54a 100644
--- a/src/backend/executor/nodeLimit.c
+++ b/src/backend/executor/nodeLimit.c
@@ -353,6 +353,12 @@ ExecInitLimit(Limit *node, EState *estate, int eflags)
 	 */
 	ExecAssignExprContext(estate, &limitstate->ps);
 
+	/*
+	 * initialize outer plan
+	 */
+	outerPlan = outerPlan(node);
+	outerPlanState(limitstate) = ExecInitNode(outerPlan, estate, eflags);
+
 	/*
 	 * initialize child expressions
 	 */
@@ -362,21 +368,15 @@ ExecInitLimit(Limit *node, EState *estate, int eflags)
 										  (PlanState *) limitstate);
 
 	/*
-	 * Tuple table initialization (XXX not actually used...)
+	 * Tuple table initialization (XXX not actually used, but upper nodes
+	 * access it to get this node's result tupledesc...)
 	 */
-	ExecInitResultTupleSlot(estate, &limitstate->ps);
-
-	/*
-	 * then initialize outer plan
-	 */
-	outerPlan = outerPlan(node);
-	outerPlanState(limitstate) = ExecInitNode(outerPlan, estate, eflags);
+	ExecInitResultTupleSlotTL(estate, &limitstate->ps);
 
 	/*
 	 * limit nodes do no projections, so initialize projection info for this
 	 * node appropriately
 	 */
-	ExecAssignResultTypeFromTL(&limitstate->ps);
 	limitstate->ps.ps_ProjInfo = NULL;
 
 	return limitstate;
diff --git a/src/backend/executor/nodeLockRows.c b/src/backend/executor/nodeLockRows.c
index 93895600a5d..9999437bef3 100644
--- a/src/backend/executor/nodeLockRows.c
+++ b/src/backend/executor/nodeLockRows.c
@@ -370,13 +370,15 @@ ExecInitLockRows(LockRows *node, EState *estate, int eflags)
 	/*
 	 * Miscellaneous initialization
 	 *
-	 * LockRows nodes never call ExecQual or ExecProject.
+	 * LockRows nodes never call ExecQual or ExecProject, therefore no
+	 * ExprContext is needed.
 	 */
 
 	/*
-	 * Tuple table initialization (XXX not actually used...)
+	 * Tuple table initialization (XXX not actually used, but upper nodes
+	 * access it to get this node's result tupledesc...)
 	 */
-	ExecInitResultTupleSlot(estate, &lrstate->ps);
+	ExecInitResultTupleSlotTL(estate, &lrstate->ps);
 
 	/*
 	 * then initialize outer plan
@@ -387,7 +389,6 @@ ExecInitLockRows(LockRows *node, EState *estate, int eflags)
 	 * LockRows nodes do no projections, so initialize projection info for
 	 * this node appropriately
 	 */
-	ExecAssignResultTypeFromTL(&lrstate->ps);
 	lrstate->ps.ps_ProjInfo = NULL;
 
 	/*
diff --git a/src/backend/executor/nodeMaterial.c b/src/backend/executor/nodeMaterial.c
index 91178f10198..d69d548ac18 100644
--- a/src/backend/executor/nodeMaterial.c
+++ b/src/backend/executor/nodeMaterial.c
@@ -211,8 +211,7 @@ ExecInitMaterial(Material *node, EState *estate, int eflags)
 	 *
 	 * material nodes only return tuples from their materialized relation.
 	 */
-	ExecInitResultTupleSlot(estate, &matstate->ss.ps);
-	ExecInitScanTupleSlot(estate, &matstate->ss);
+	ExecInitResultTupleSlotTL(estate, &matstate->ss.ps);
 
 	/*
 	 * initialize child nodes
@@ -229,8 +228,7 @@ ExecInitMaterial(Material *node, EState *estate, int eflags)
 	 * initialize tuple type.  no need to initialize projection info because
 	 * this node doesn't do projections.
 	 */
-	ExecAssignResultTypeFromTL(&matstate->ss.ps);
-	ExecAssignScanTypeFromOuterPlan(&matstate->ss);
+	ExecCreateScanSlotFromOuterPlan(estate, &matstate->ss);
 	matstate->ss.ps.ps_ProjInfo = NULL;
 
 	return matstate;
diff --git a/src/backend/executor/nodeMergeAppend.c b/src/backend/executor/nodeMergeAppend.c
index 6bf490bd700..00bc2c47f0c 100644
--- a/src/backend/executor/nodeMergeAppend.c
+++ b/src/backend/executor/nodeMergeAppend.c
@@ -109,7 +109,7 @@ ExecInitMergeAppend(MergeAppend *node, EState *estate, int eflags)
 	 * MergeAppend nodes do have Result slots, which hold pointers to tuples,
 	 * so we have to initialize them.
 	 */
-	ExecInitResultTupleSlot(estate, &mergestate->ps);
+	ExecInitResultTupleSlotTL(estate, &mergestate->ps);
 
 	/*
 	 * call ExecInitNode on each of the plans to be executed and save the
@@ -124,10 +124,6 @@ ExecInitMergeAppend(MergeAppend *node, EState *estate, int eflags)
 		i++;
 	}
 
-	/*
-	 * initialize output tuple type
-	 */
-	ExecAssignResultTypeFromTL(&mergestate->ps);
 	mergestate->ps.ps_ProjInfo = NULL;
 
 	/*
diff --git a/src/backend/executor/nodeMergejoin.c b/src/backend/executor/nodeMergejoin.c
index ef9e1ee4710..d405b113894 100644
--- a/src/backend/executor/nodeMergejoin.c
+++ b/src/backend/executor/nodeMergejoin.c
@@ -1436,6 +1436,7 @@ MergeJoinState *
 ExecInitMergeJoin(MergeJoin *node, EState *estate, int eflags)
 {
 	MergeJoinState *mergestate;
+	TupleDesc	outerDesc, innerDesc;
 
 	/* check for unsupported flags */
 	Assert(!(eflags & (EXEC_FLAG_BACKWARD | EXEC_FLAG_MARK)));
@@ -1450,6 +1451,8 @@ ExecInitMergeJoin(MergeJoin *node, EState *estate, int eflags)
 	mergestate->js.ps.plan = (Plan *) node;
 	mergestate->js.ps.state = estate;
 	mergestate->js.ps.ExecProcNode = ExecMergeJoin;
+	mergestate->js.jointype = node->join.jointype;
+	mergestate->mj_ConstFalseJoin = false;
 
 	/*
 	 * Miscellaneous initialization
@@ -1466,17 +1469,6 @@ ExecInitMergeJoin(MergeJoin *node, EState *estate, int eflags)
 	mergestate->mj_OuterEContext = CreateExprContext(estate);
 	mergestate->mj_InnerEContext = CreateExprContext(estate);
 
-	/*
-	 * initialize child expressions
-	 */
-	mergestate->js.ps.qual =
-		ExecInitQual(node->join.plan.qual, (PlanState *) mergestate);
-	mergestate->js.jointype = node->join.jointype;
-	mergestate->js.joinqual =
-		ExecInitQual(node->join.joinqual, (PlanState *) mergestate);
-	mergestate->mj_ConstFalseJoin = false;
-	/* mergeclauses are handled below */
-
 	/*
 	 * initialize child nodes
 	 *
@@ -1488,10 +1480,12 @@ ExecInitMergeJoin(MergeJoin *node, EState *estate, int eflags)
 	mergestate->mj_SkipMarkRestore = node->skip_mark_restore;
 
 	outerPlanState(mergestate) = ExecInitNode(outerPlan(node), estate, eflags);
+	outerDesc = ExecGetResultType(outerPlanState(mergestate));
 	innerPlanState(mergestate) = ExecInitNode(innerPlan(node), estate,
 											  mergestate->mj_SkipMarkRestore ?
 											  eflags :
 											  (eflags | EXEC_FLAG_MARK));
+	innerDesc = ExecGetResultType(innerPlanState(mergestate));
 
 	/*
 	 * For certain types of inner child nodes, it is advantageous to issue
@@ -1510,14 +1504,25 @@ ExecInitMergeJoin(MergeJoin *node, EState *estate, int eflags)
 	else
 		mergestate->mj_ExtraMarks = false;
 
+	/*
+	 * Initialize result slot, type and projection.
+	 */
+	ExecInitResultTupleSlotTL(estate, &mergestate->js.ps);
+	ExecAssignProjectionInfo(&mergestate->js.ps, NULL);
+
 	/*
 	 * tuple table initialization
 	 */
-	ExecInitResultTupleSlot(estate, &mergestate->js.ps);
+	mergestate->mj_MarkedTupleSlot = ExecInitExtraTupleSlot(estate, innerDesc);
 
-	mergestate->mj_MarkedTupleSlot = ExecInitExtraTupleSlot(estate);
-	ExecSetSlotDescriptor(mergestate->mj_MarkedTupleSlot,
-						  ExecGetResultType(innerPlanState(mergestate)));
+	/*
+	 * initialize child expressions
+	 */
+	mergestate->js.ps.qual =
+		ExecInitQual(node->join.plan.qual, (PlanState *) mergestate);
+	mergestate->js.joinqual =
+		ExecInitQual(node->join.joinqual, (PlanState *) mergestate);
+	/* mergeclauses are handled below */
 
 	/*
 	 * detect whether we need only consider the first matching inner tuple
@@ -1538,15 +1543,13 @@ ExecInitMergeJoin(MergeJoin *node, EState *estate, int eflags)
 			mergestate->mj_FillOuter = true;
 			mergestate->mj_FillInner = false;
 			mergestate->mj_NullInnerTupleSlot =
-				ExecInitNullTupleSlot(estate,
-									  ExecGetResultType(innerPlanState(mergestate)));
+				ExecInitNullTupleSlot(estate, innerDesc);
 			break;
 		case JOIN_RIGHT:
 			mergestate->mj_FillOuter = false;
 			mergestate->mj_FillInner = true;
 			mergestate->mj_NullOuterTupleSlot =
-				ExecInitNullTupleSlot(estate,
-									  ExecGetResultType(outerPlanState(mergestate)));
+				ExecInitNullTupleSlot(estate, outerDesc);
 
 			/*
 			 * Can't handle right or full join with non-constant extra
@@ -1562,11 +1565,9 @@ ExecInitMergeJoin(MergeJoin *node, EState *estate, int eflags)
 			mergestate->mj_FillOuter = true;
 			mergestate->mj_FillInner = true;
 			mergestate->mj_NullOuterTupleSlot =
-				ExecInitNullTupleSlot(estate,
-									  ExecGetResultType(outerPlanState(mergestate)));
+				ExecInitNullTupleSlot(estate, outerDesc);
 			mergestate->mj_NullInnerTupleSlot =
-				ExecInitNullTupleSlot(estate,
-									  ExecGetResultType(innerPlanState(mergestate)));
+				ExecInitNullTupleSlot(estate, innerDesc);
 
 			/*
 			 * Can't handle right or full join with non-constant extra
@@ -1583,12 +1584,6 @@ ExecInitMergeJoin(MergeJoin *node, EState *estate, int eflags)
 				 (int) node->join.jointype);
 	}
 
-	/*
-	 * initialize tuple type and projection info
-	 */
-	ExecAssignResultTypeFromTL(&mergestate->js.ps);
-	ExecAssignProjectionInfo(&mergestate->js.ps, NULL);
-
 	/*
 	 * preprocess the merge clauses
 	 */
diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c
index 82cd4462a3e..105b03c92d7 100644
--- a/src/backend/executor/nodeModifyTable.c
+++ b/src/backend/executor/nodeModifyTable.c
@@ -2070,8 +2070,7 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
 		mtstate->ps.plan->targetlist = (List *) linitial(node->returningLists);
 
 		/* Set up a slot for the output of the RETURNING projection(s) */
-		ExecInitResultTupleSlot(estate, &mtstate->ps);
-		ExecAssignResultTypeFromTL(&mtstate->ps);
+		ExecInitResultTupleSlotTL(estate, &mtstate->ps);
 		slot = mtstate->ps.ps_ResultTupleSlot;
 
 		/* Need an econtext too */
@@ -2125,8 +2124,7 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
 		 * expects one (maybe should change that?).
 		 */
 		mtstate->ps.plan->targetlist = NIL;
-		ExecInitResultTupleSlot(estate, &mtstate->ps);
-		ExecAssignResultTypeFromTL(&mtstate->ps);
+		ExecInitResultTupleSlotTL(estate, &mtstate->ps);
 
 		mtstate->ps.ps_ExprContext = NULL;
 	}
@@ -2143,6 +2141,7 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
 	if (node->onConflictAction == ONCONFLICT_UPDATE)
 	{
 		ExprContext *econtext;
+		TupleDesc	relationDesc;
 		TupleDesc	tupDesc;
 
 		/* insert may only have one plan, inheritance is not expanded */
@@ -2153,26 +2152,26 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
 			ExecAssignExprContext(estate, &mtstate->ps);
 
 		econtext = mtstate->ps.ps_ExprContext;
+		relationDesc = resultRelInfo->ri_RelationDesc->rd_att;
 
 		/* initialize slot for the existing tuple */
-		mtstate->mt_existing = ExecInitExtraTupleSlot(mtstate->ps.state);
-		ExecSetSlotDescriptor(mtstate->mt_existing,
-							  resultRelInfo->ri_RelationDesc->rd_att);
+		mtstate->mt_existing =
+			ExecInitExtraTupleSlot(mtstate->ps.state, relationDesc);
 
 		/* carried forward solely for the benefit of explain */
 		mtstate->mt_excludedtlist = node->exclRelTlist;
 
 		/* create target slot for UPDATE SET projection */
 		tupDesc = ExecTypeFromTL((List *) node->onConflictSet,
-								 resultRelInfo->ri_RelationDesc->rd_rel->relhasoids);
-		mtstate->mt_conflproj = ExecInitExtraTupleSlot(mtstate->ps.state);
-		ExecSetSlotDescriptor(mtstate->mt_conflproj, tupDesc);
+								 relationDesc->tdhasoid);
+		mtstate->mt_conflproj =
+			ExecInitExtraTupleSlot(mtstate->ps.state, tupDesc);
 
 		/* build UPDATE SET projection state */
 		resultRelInfo->ri_onConflictSetProj =
 			ExecBuildProjectionInfo(node->onConflictSet, econtext,
 									mtstate->mt_conflproj, &mtstate->ps,
-									resultRelInfo->ri_RelationDesc->rd_att);
+									relationDesc);
 
 		/* build DO UPDATE WHERE clause expression */
 		if (node->onConflictWhere)
@@ -2277,7 +2276,7 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
 
 				j = ExecInitJunkFilter(subplan->targetlist,
 									   resultRelInfo->ri_RelationDesc->rd_att->tdhasoid,
-									   ExecInitExtraTupleSlot(estate));
+									   ExecInitExtraTupleSlot(estate, NULL));
 
 				if (operation == CMD_UPDATE || operation == CMD_DELETE)
 				{
@@ -2327,7 +2326,7 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
 	 * we keep it in the estate.
 	 */
 	if (estate->es_trig_tuple_slot == NULL)
-		estate->es_trig_tuple_slot = ExecInitExtraTupleSlot(estate);
+		estate->es_trig_tuple_slot = ExecInitExtraTupleSlot(estate, NULL);
 
 	/*
 	 * Lastly, if this is not the primary (canSetTag) ModifyTable node, add it
diff --git a/src/backend/executor/nodeNamedtuplestorescan.c b/src/backend/executor/nodeNamedtuplestorescan.c
index 3a65b9f5dc9..e3c17d8613b 100644
--- a/src/backend/executor/nodeNamedtuplestorescan.c
+++ b/src/backend/executor/nodeNamedtuplestorescan.c
@@ -132,6 +132,13 @@ ExecInitNamedTuplestoreScan(NamedTuplestoreScan *node, EState *estate, int eflag
 	 */
 	ExecAssignExprContext(estate, &scanstate->ss.ps);
 
+	/*
+	 * Tuple table and result type initialization. The scan tuple type is
+	 * specified for the tuplestore.
+	 */
+	ExecInitResultTupleSlotTL(estate, &scanstate->ss.ps);
+	ExecInitScanTupleSlot(estate, &scanstate->ss, scanstate->tupdesc);
+
 	/*
 	 * initialize child expressions
 	 */
@@ -139,20 +146,8 @@ ExecInitNamedTuplestoreScan(NamedTuplestoreScan *node, EState *estate, int eflag
 		ExecInitQual(node->scan.plan.qual, (PlanState *) scanstate);
 
 	/*
-	 * tuple table initialization
+	 * Initialize projection.
 	 */
-	ExecInitResultTupleSlot(estate, &scanstate->ss.ps);
-	ExecInitScanTupleSlot(estate, &scanstate->ss);
-
-	/*
-	 * The scan tuple type is specified for the tuplestore.
-	 */
-	ExecAssignScanType(&scanstate->ss, scanstate->tupdesc);
-
-	/*
-	 * Initialize result tuple type and projection info.
-	 */
-	ExecAssignResultTypeFromTL(&scanstate->ss.ps);
 	ExecAssignScanProjectionInfo(&scanstate->ss);
 
 	return scanstate;
diff --git a/src/backend/executor/nodeNestloop.c b/src/backend/executor/nodeNestloop.c
index 4447b7c051a..540bd249fe3 100644
--- a/src/backend/executor/nodeNestloop.c
+++ b/src/backend/executor/nodeNestloop.c
@@ -285,15 +285,6 @@ ExecInitNestLoop(NestLoop *node, EState *estate, int eflags)
 	 */
 	ExecAssignExprContext(estate, &nlstate->js.ps);
 
-	/*
-	 * initialize child expressions
-	 */
-	nlstate->js.ps.qual =
-		ExecInitQual(node->join.plan.qual, (PlanState *) nlstate);
-	nlstate->js.jointype = node->join.jointype;
-	nlstate->js.joinqual =
-		ExecInitQual(node->join.joinqual, (PlanState *) nlstate);
-
 	/*
 	 * initialize child nodes
 	 *
@@ -311,9 +302,19 @@ ExecInitNestLoop(NestLoop *node, EState *estate, int eflags)
 	innerPlanState(nlstate) = ExecInitNode(innerPlan(node), estate, eflags);
 
 	/*
-	 * tuple table initialization
+	 * Initialize result slot, type and projection.
 	 */
-	ExecInitResultTupleSlot(estate, &nlstate->js.ps);
+	ExecInitResultTupleSlotTL(estate, &nlstate->js.ps);
+	ExecAssignProjectionInfo(&nlstate->js.ps, NULL);
+
+	/*
+	 * initialize child expressions
+	 */
+	nlstate->js.ps.qual =
+		ExecInitQual(node->join.plan.qual, (PlanState *) nlstate);
+	nlstate->js.jointype = node->join.jointype;
+	nlstate->js.joinqual =
+		ExecInitQual(node->join.joinqual, (PlanState *) nlstate);
 
 	/*
 	 * detect whether we need only consider the first matching inner tuple
@@ -338,12 +339,6 @@ ExecInitNestLoop(NestLoop *node, EState *estate, int eflags)
 				 (int) node->join.jointype);
 	}
 
-	/*
-	 * initialize tuple type and projection info
-	 */
-	ExecAssignResultTypeFromTL(&nlstate->js.ps);
-	ExecAssignProjectionInfo(&nlstate->js.ps, NULL);
-
 	/*
 	 * finally, wipe the current outer tuple clean.
 	 */
diff --git a/src/backend/executor/nodeProjectSet.c b/src/backend/executor/nodeProjectSet.c
index 30789bcce4d..f3186c51446 100644
--- a/src/backend/executor/nodeProjectSet.c
+++ b/src/backend/executor/nodeProjectSet.c
@@ -243,14 +243,6 @@ ExecInitProjectSet(ProjectSet *node, EState *estate, int eflags)
 	 */
 	ExecAssignExprContext(estate, &state->ps);
 
-	/*
-	 * tuple table initialization
-	 */
-	ExecInitResultTupleSlot(estate, &state->ps);
-
-	/* We don't support any qual on ProjectSet nodes */
-	Assert(node->plan.qual == NIL);
-
 	/*
 	 * initialize child nodes
 	 */
@@ -262,9 +254,9 @@ ExecInitProjectSet(ProjectSet *node, EState *estate, int eflags)
 	Assert(innerPlan(node) == NULL);
 
 	/*
-	 * initialize tuple type and projection info
+	 * tuple table and result type initialization
 	 */
-	ExecAssignResultTypeFromTL(&state->ps);
+	ExecInitResultTupleSlotTL(estate, &state->ps);
 
 	/* Create workspace for per-tlist-entry expr state & SRF-is-done state */
 	state->nelems = list_length(node->plan.targetlist);
@@ -301,6 +293,8 @@ ExecInitProjectSet(ProjectSet *node, EState *estate, int eflags)
 		off++;
 	}
 
+	/* We don't support any qual on ProjectSet nodes */
+	Assert(node->plan.qual == NIL);
 
 	/*
 	 * Create a memory context that ExecMakeFunctionResult can use to evaluate
diff --git a/src/backend/executor/nodeRecursiveunion.c b/src/backend/executor/nodeRecursiveunion.c
index ed229158038..86110cb7707 100644
--- a/src/backend/executor/nodeRecursiveunion.c
+++ b/src/backend/executor/nodeRecursiveunion.c
@@ -229,14 +229,13 @@ ExecInitRecursiveUnion(RecursiveUnion *node, EState *estate, int eflags)
 	 * RecursiveUnion nodes still have Result slots, which hold pointers to
 	 * tuples, so we have to initialize them.
 	 */
-	ExecInitResultTupleSlot(estate, &rustate->ps);
+	ExecInitResultTupleSlotTL(estate, &rustate->ps);
 
 	/*
-	 * Initialize result tuple type and projection info.  (Note: we have to
-	 * set up the result type before initializing child nodes, because
-	 * nodeWorktablescan.c expects it to be valid.)
+	 * Initialize result tuple type.  (Note: we have to set up the result type
+	 * before initializing child nodes, because nodeWorktablescan.c expects it
+	 * to be valid.)
 	 */
-	ExecAssignResultTypeFromTL(&rustate->ps);
 	rustate->ps.ps_ProjInfo = NULL;
 
 	/*
diff --git a/src/backend/executor/nodeResult.c b/src/backend/executor/nodeResult.c
index 4c879d87655..40bcefb50a9 100644
--- a/src/backend/executor/nodeResult.c
+++ b/src/backend/executor/nodeResult.c
@@ -204,19 +204,6 @@ ExecInitResult(Result *node, EState *estate, int eflags)
 	 */
 	ExecAssignExprContext(estate, &resstate->ps);
 
-	/*
-	 * tuple table initialization
-	 */
-	ExecInitResultTupleSlot(estate, &resstate->ps);
-
-	/*
-	 * initialize child expressions
-	 */
-	resstate->ps.qual =
-		ExecInitQual(node->plan.qual, (PlanState *) resstate);
-	resstate->resconstantqual =
-		ExecInitQual((List *) node->resconstantqual, (PlanState *) resstate);
-
 	/*
 	 * initialize child nodes
 	 */
@@ -228,11 +215,19 @@ ExecInitResult(Result *node, EState *estate, int eflags)
 	Assert(innerPlan(node) == NULL);
 
 	/*
-	 * initialize tuple type and projection info
+	 * Initialize result slot, type and projection.
 	 */
-	ExecAssignResultTypeFromTL(&resstate->ps);
+	ExecInitResultTupleSlotTL(estate, &resstate->ps);
 	ExecAssignProjectionInfo(&resstate->ps, NULL);
 
+	/*
+	 * initialize child expressions
+	 */
+	resstate->ps.qual =
+		ExecInitQual(node->plan.qual, (PlanState *) resstate);
+	resstate->resconstantqual =
+		ExecInitQual((List *) node->resconstantqual, (PlanState *) resstate);
+
 	return resstate;
 }
 
diff --git a/src/backend/executor/nodeSamplescan.c b/src/backend/executor/nodeSamplescan.c
index 9c74a836e40..c40bb2735cf 100644
--- a/src/backend/executor/nodeSamplescan.c
+++ b/src/backend/executor/nodeSamplescan.c
@@ -26,7 +26,6 @@
 #include "utils/rel.h"
 #include "utils/tqual.h"
 
-static void InitScanRelation(SampleScanState *node, EState *estate, int eflags);
 static TupleTableSlot *SampleNext(SampleScanState *node);
 static void tablesample_init(SampleScanState *scanstate);
 static HeapTuple tablesample_getnext(SampleScanState *scanstate);
@@ -106,35 +105,6 @@ ExecSampleScan(PlanState *pstate)
 					(ExecScanRecheckMtd) SampleRecheck);
 }
 
-/* ----------------------------------------------------------------
- *		InitScanRelation
- *
- *		Set up to access the scan relation.
- * ----------------------------------------------------------------
- */
-static void
-InitScanRelation(SampleScanState *node, EState *estate, int eflags)
-{
-	Relation	currentRelation;
-
-	/*
-	 * get the relation object id from the relid'th entry in the range table,
-	 * open that relation and acquire appropriate lock on it.
-	 */
-	currentRelation = ExecOpenScanRelation(estate,
-										   ((SampleScan *) node->ss.ps.plan)->scan.scanrelid,
-										   eflags);
-
-	node->ss.ss_currentRelation = currentRelation;
-
-	/* we won't set up the HeapScanDesc till later */
-	node->ss.ss_currentScanDesc = NULL;
-
-	/* and report the scan tuple slot's rowtype */
-	ExecAssignScanType(&node->ss, RelationGetDescr(currentRelation));
-}
-
-
 /* ----------------------------------------------------------------
  *		ExecInitSampleScan
  * ----------------------------------------------------------------
@@ -164,6 +134,32 @@ ExecInitSampleScan(SampleScan *node, EState *estate, int eflags)
 	 */
 	ExecAssignExprContext(estate, &scanstate->ss.ps);
 
+	/*
+	 * Initialize scan relation.
+	 *
+	 * Get the relation object id from the relid'th entry in the range table,
+	 * open that relation and acquire appropriate lock on it.
+	 */
+	scanstate->ss.ss_currentRelation =
+		ExecOpenScanRelation(estate,
+							 node->scan.scanrelid,
+							 eflags);
+
+	/* we won't set up the HeapScanDesc till later */
+	scanstate->ss.ss_currentScanDesc = NULL;
+
+	/* and create slot with appropriate rowtype */
+	ExecInitScanTupleSlot(estate, &scanstate->ss,
+						  RelationGetDescr(scanstate->ss.ss_currentRelation));
+
+
+	/*
+	 * Initialize result slot, type and projection.
+	 * tuple table and result tuple initialization
+	 */
+	ExecInitResultTupleSlotTL(estate, &scanstate->ss.ps);
+	ExecAssignScanProjectionInfo(&scanstate->ss);
+
 	/*
 	 * initialize child expressions
 	 */
@@ -174,23 +170,6 @@ ExecInitSampleScan(SampleScan *node, EState *estate, int eflags)
 	scanstate->repeatable =
 		ExecInitExpr(tsc->repeatable, (PlanState *) scanstate);
 
-	/*
-	 * tuple table initialization
-	 */
-	ExecInitResultTupleSlot(estate, &scanstate->ss.ps);
-	ExecInitScanTupleSlot(estate, &scanstate->ss);
-
-	/*
-	 * initialize scan relation
-	 */
-	InitScanRelation(scanstate, estate, eflags);
-
-	/*
-	 * Initialize result tuple type and projection info.
-	 */
-	ExecAssignResultTypeFromTL(&scanstate->ss.ps);
-	ExecAssignScanProjectionInfo(&scanstate->ss);
-
 	/*
 	 * If we don't have a REPEATABLE clause, select a random seed.  We want to
 	 * do this just once, since the seed shouldn't change over rescans.
diff --git a/src/backend/executor/nodeSeqscan.c b/src/backend/executor/nodeSeqscan.c
index a5bd60e5795..59b759db533 100644
--- a/src/backend/executor/nodeSeqscan.c
+++ b/src/backend/executor/nodeSeqscan.c
@@ -32,7 +32,6 @@
 #include "executor/nodeSeqscan.h"
 #include "utils/rel.h"
 
-static void InitScanRelation(SeqScanState *node, EState *estate, int eflags);
 static TupleTableSlot *SeqNext(SeqScanState *node);
 
 /* ----------------------------------------------------------------
@@ -132,31 +131,6 @@ ExecSeqScan(PlanState *pstate)
 					(ExecScanRecheckMtd) SeqRecheck);
 }
 
-/* ----------------------------------------------------------------
- *		InitScanRelation
- *
- *		Set up to access the scan relation.
- * ----------------------------------------------------------------
- */
-static void
-InitScanRelation(SeqScanState *node, EState *estate, int eflags)
-{
-	Relation	currentRelation;
-
-	/*
-	 * get the relation object id from the relid'th entry in the range table,
-	 * open that relation and acquire appropriate lock on it.
-	 */
-	currentRelation = ExecOpenScanRelation(estate,
-										   ((SeqScan *) node->ss.ps.plan)->scanrelid,
-										   eflags);
-
-	node->ss.ss_currentRelation = currentRelation;
-
-	/* and report the scan tuple slot's rowtype */
-	ExecAssignScanType(&node->ss, RelationGetDescr(currentRelation));
-}
-
 
 /* ----------------------------------------------------------------
  *		ExecInitSeqScan
@@ -189,29 +163,33 @@ ExecInitSeqScan(SeqScan *node, EState *estate, int eflags)
 	 */
 	ExecAssignExprContext(estate, &scanstate->ss.ps);
 
+	/*
+	 * Initialize scan relation.
+	 *
+	 * Get the relation object id from the relid'th entry in the range table,
+	 * open that relation and acquire appropriate lock on it.
+	 */
+	scanstate->ss.ss_currentRelation =
+		ExecOpenScanRelation(estate,
+							 node->scanrelid,
+							 eflags);
+
+	/* and create slot with the appropriate rowtype */
+	ExecInitScanTupleSlot(estate, &scanstate->ss,
+						  RelationGetDescr(scanstate->ss.ss_currentRelation));
+
+	/*
+	 * Initialize result slot, type and projection.
+	 */
+	ExecInitResultTupleSlotTL(estate, &scanstate->ss.ps);
+	ExecAssignScanProjectionInfo(&scanstate->ss);
+
 	/*
 	 * initialize child expressions
 	 */
 	scanstate->ss.ps.qual =
 		ExecInitQual(node->plan.qual, (PlanState *) scanstate);
 
-	/*
-	 * tuple table initialization
-	 */
-	ExecInitResultTupleSlot(estate, &scanstate->ss.ps);
-	ExecInitScanTupleSlot(estate, &scanstate->ss);
-
-	/*
-	 * initialize scan relation
-	 */
-	InitScanRelation(scanstate, estate, eflags);
-
-	/*
-	 * Initialize result tuple type and projection info.
-	 */
-	ExecAssignResultTypeFromTL(&scanstate->ss.ps);
-	ExecAssignScanProjectionInfo(&scanstate->ss);
-
 	return scanstate;
 }
 
diff --git a/src/backend/executor/nodeSetOp.c b/src/backend/executor/nodeSetOp.c
index e5300c20692..56a412aeea4 100644
--- a/src/backend/executor/nodeSetOp.c
+++ b/src/backend/executor/nodeSetOp.c
@@ -520,11 +520,6 @@ ExecInitSetOp(SetOp *node, EState *estate, int eflags)
 								  "SetOp hash table",
 								  ALLOCSET_DEFAULT_SIZES);
 
-	/*
-	 * Tuple table initialization
-	 */
-	ExecInitResultTupleSlot(estate, &setopstate->ps);
-
 	/*
 	 * initialize child nodes
 	 *
@@ -536,10 +531,10 @@ ExecInitSetOp(SetOp *node, EState *estate, int eflags)
 	outerPlanState(setopstate) = ExecInitNode(outerPlan(node), estate, eflags);
 
 	/*
-	 * setop nodes do no projections, so initialize projection info for this
-	 * node appropriately
+	 * Initialize result slot and type. Setop nodes do no projections, so
+	 * initialize projection info for this node appropriately.
 	 */
-	ExecAssignResultTypeFromTL(&setopstate->ps);
+	ExecInitResultTupleSlotTL(estate, &setopstate->ps);
 	setopstate->ps.ps_ProjInfo = NULL;
 
 	/*
diff --git a/src/backend/executor/nodeSort.c b/src/backend/executor/nodeSort.c
index 73aa3715e6d..e0d1b08bcba 100644
--- a/src/backend/executor/nodeSort.c
+++ b/src/backend/executor/nodeSort.c
@@ -198,14 +198,6 @@ ExecInitSort(Sort *node, EState *estate, int eflags)
 	 * ExecQual or ExecProject.
 	 */
 
-	/*
-	 * tuple table initialization
-	 *
-	 * sort nodes only return scan tuples from their sorted relation.
-	 */
-	ExecInitResultTupleSlot(estate, &sortstate->ss.ps);
-	ExecInitScanTupleSlot(estate, &sortstate->ss);
-
 	/*
 	 * initialize child nodes
 	 *
@@ -217,11 +209,15 @@ ExecInitSort(Sort *node, EState *estate, int eflags)
 	outerPlanState(sortstate) = ExecInitNode(outerPlan(node), estate, eflags);
 
 	/*
-	 * initialize tuple type.  no need to initialize projection info because
+	 * Initialize scan slot and type.
+	 */
+	ExecCreateScanSlotFromOuterPlan(estate, &sortstate->ss);
+
+	/*
+	 * Initialize return slot and type. No need to initialize projection info because
 	 * this node doesn't do projections.
 	 */
-	ExecAssignResultTypeFromTL(&sortstate->ss.ps);
-	ExecAssignScanTypeFromOuterPlan(&sortstate->ss);
+	ExecInitResultTupleSlotTL(estate, &sortstate->ss.ps);
 	sortstate->ss.ps.ps_ProjInfo = NULL;
 
 	SO1_printf("ExecInitSort: %s\n",
diff --git a/src/backend/executor/nodeSubplan.c b/src/backend/executor/nodeSubplan.c
index 499bd5c5b2a..16de639b82d 100644
--- a/src/backend/executor/nodeSubplan.c
+++ b/src/backend/executor/nodeSubplan.c
@@ -957,8 +957,7 @@ ExecInitSubPlan(SubPlan *subplan, PlanState *parent)
 		 * own innerecontext.
 		 */
 		tupDesc = ExecTypeFromTL(lefttlist, false);
-		slot = ExecInitExtraTupleSlot(estate);
-		ExecSetSlotDescriptor(slot, tupDesc);
+		slot = ExecInitExtraTupleSlot(estate, tupDesc);
 		sstate->projLeft = ExecBuildProjectionInfo(lefttlist,
 												   NULL,
 												   slot,
@@ -967,8 +966,7 @@ ExecInitSubPlan(SubPlan *subplan, PlanState *parent)
 
 		tupDesc = ExecTypeFromTL(righttlist, false);
 		sstate->descRight = tupDesc;
-		slot = ExecInitExtraTupleSlot(estate);
-		ExecSetSlotDescriptor(slot, tupDesc);
+		slot = ExecInitExtraTupleSlot(estate, tupDesc);
 		sstate->projRight = ExecBuildProjectionInfo(righttlist,
 													sstate->innerecontext,
 													slot,
diff --git a/src/backend/executor/nodeSubqueryscan.c b/src/backend/executor/nodeSubqueryscan.c
index 088c92992ec..0b029fc104a 100644
--- a/src/backend/executor/nodeSubqueryscan.c
+++ b/src/backend/executor/nodeSubqueryscan.c
@@ -120,35 +120,29 @@ ExecInitSubqueryScan(SubqueryScan *node, EState *estate, int eflags)
 	 */
 	ExecAssignExprContext(estate, &subquerystate->ss.ps);
 
-	/*
-	 * initialize child expressions
-	 */
-	subquerystate->ss.ps.qual =
-		ExecInitQual(node->scan.plan.qual, (PlanState *) subquerystate);
-
-	/*
-	 * tuple table initialization
-	 */
-	ExecInitResultTupleSlot(estate, &subquerystate->ss.ps);
-	ExecInitScanTupleSlot(estate, &subquerystate->ss);
-
 	/*
 	 * initialize subquery
 	 */
 	subquerystate->subplan = ExecInitNode(node->subplan, estate, eflags);
 
 	/*
-	 * Initialize scan tuple type (needed by ExecAssignScanProjectionInfo)
+	 * Initialize scan slot and type (needed by ExecAssignScanProjectionInfo)
 	 */
-	ExecAssignScanType(&subquerystate->ss,
-					   ExecGetResultType(subquerystate->subplan));
+	ExecInitScanTupleSlot(estate, &subquerystate->ss,
+						  ExecGetResultType(subquerystate->subplan));
 
 	/*
-	 * Initialize result tuple type and projection info.
+	 * Initialize result slot, type and projection.
 	 */
-	ExecAssignResultTypeFromTL(&subquerystate->ss.ps);
+	ExecInitResultTupleSlotTL(estate, &subquerystate->ss.ps);
 	ExecAssignScanProjectionInfo(&subquerystate->ss);
 
+	/*
+	 * initialize child expressions
+	 */
+	subquerystate->ss.ps.qual =
+		ExecInitQual(node->scan.plan.qual, (PlanState *) subquerystate);
+
 	return subquerystate;
 }
 
diff --git a/src/backend/executor/nodeTableFuncscan.c b/src/backend/executor/nodeTableFuncscan.c
index 165fae8c83b..af84ec30b70 100644
--- a/src/backend/executor/nodeTableFuncscan.c
+++ b/src/backend/executor/nodeTableFuncscan.c
@@ -139,18 +139,6 @@ ExecInitTableFuncScan(TableFuncScan *node, EState *estate, int eflags)
 	 */
 	ExecAssignExprContext(estate, &scanstate->ss.ps);
 
-	/*
-	 * initialize child expressions
-	 */
-	scanstate->ss.ps.qual =
-		ExecInitQual(node->scan.plan.qual, &scanstate->ss.ps);
-
-	/*
-	 * tuple table initialization
-	 */
-	ExecInitResultTupleSlot(estate, &scanstate->ss.ps);
-	ExecInitScanTupleSlot(estate, &scanstate->ss);
-
 	/*
 	 * initialize source tuple type
 	 */
@@ -158,15 +146,21 @@ ExecInitTableFuncScan(TableFuncScan *node, EState *estate, int eflags)
 								 tf->coltypes,
 								 tf->coltypmods,
 								 tf->colcollations);
-
-	ExecAssignScanType(&scanstate->ss, tupdesc);
+	/* and the corresponding scan slot */
+	ExecInitScanTupleSlot(estate, &scanstate->ss, tupdesc);
 
 	/*
-	 * Initialize result tuple type and projection info.
+	 * Initialize result slot, type and projection.
 	 */
-	ExecAssignResultTypeFromTL(&scanstate->ss.ps);
+	ExecInitResultTupleSlotTL(estate, &scanstate->ss.ps);
 	ExecAssignScanProjectionInfo(&scanstate->ss);
 
+	/*
+	 * initialize child expressions
+	 */
+	scanstate->ss.ps.qual =
+		ExecInitQual(node->scan.plan.qual, &scanstate->ss.ps);
+
 	/* Only XMLTABLE is supported currently */
 	scanstate->routine = &XmlTableRoutine;
 
diff --git a/src/backend/executor/nodeTidscan.c b/src/backend/executor/nodeTidscan.c
index 0ee76e7d252..24bf0f7cb69 100644
--- a/src/backend/executor/nodeTidscan.c
+++ b/src/backend/executor/nodeTidscan.c
@@ -530,20 +530,6 @@ ExecInitTidScan(TidScan *node, EState *estate, int eflags)
 	 */
 	ExecAssignExprContext(estate, &tidstate->ss.ps);
 
-	/*
-	 * initialize child expressions
-	 */
-	tidstate->ss.ps.qual =
-		ExecInitQual(node->scan.plan.qual, (PlanState *) tidstate);
-
-	TidExprListCreate(tidstate);
-
-	/*
-	 * tuple table initialization
-	 */
-	ExecInitResultTupleSlot(estate, &tidstate->ss.ps);
-	ExecInitScanTupleSlot(estate, &tidstate->ss);
-
 	/*
 	 * mark tid list as not computed yet
 	 */
@@ -562,14 +548,23 @@ ExecInitTidScan(TidScan *node, EState *estate, int eflags)
 	/*
 	 * get the scan type from the relation descriptor.
 	 */
-	ExecAssignScanType(&tidstate->ss, RelationGetDescr(currentRelation));
+	ExecInitScanTupleSlot(estate, &tidstate->ss,
+						  RelationGetDescr(currentRelation));
 
 	/*
-	 * Initialize result tuple type and projection info.
+	 * Initialize result slot, type and projection.
 	 */
-	ExecAssignResultTypeFromTL(&tidstate->ss.ps);
+	ExecInitResultTupleSlotTL(estate, &tidstate->ss.ps);
 	ExecAssignScanProjectionInfo(&tidstate->ss);
 
+	/*
+	 * initialize child expressions
+	 */
+	tidstate->ss.ps.qual =
+		ExecInitQual(node->scan.plan.qual, (PlanState *) tidstate);
+
+	TidExprListCreate(tidstate);
+
 	/*
 	 * all done.
 	 */
diff --git a/src/backend/executor/nodeUnique.c b/src/backend/executor/nodeUnique.c
index 7baaf3847f2..54572b3643d 100644
--- a/src/backend/executor/nodeUnique.c
+++ b/src/backend/executor/nodeUnique.c
@@ -136,21 +136,16 @@ ExecInitUnique(Unique *node, EState *estate, int eflags)
 	 */
 	ExecAssignExprContext(estate, &uniquestate->ps);
 
-	/*
-	 * Tuple table initialization
-	 */
-	ExecInitResultTupleSlot(estate, &uniquestate->ps);
-
 	/*
 	 * then initialize outer plan
 	 */
 	outerPlanState(uniquestate) = ExecInitNode(outerPlan(node), estate, eflags);
 
 	/*
-	 * unique nodes do no projections, so initialize projection info for this
-	 * node appropriately
+	 * Initialize result slot and type. Unique nodes do no projections, so
+	 * initialize projection info for this node appropriately.
 	 */
-	ExecAssignResultTypeFromTL(&uniquestate->ps);
+	ExecInitResultTupleSlotTL(estate, &uniquestate->ps);
 	uniquestate->ps.ps_ProjInfo = NULL;
 
 	/*
diff --git a/src/backend/executor/nodeValuesscan.c b/src/backend/executor/nodeValuesscan.c
index 47ba9faa78e..a39a4134b3b 100644
--- a/src/backend/executor/nodeValuesscan.c
+++ b/src/backend/executor/nodeValuesscan.c
@@ -248,10 +248,16 @@ ExecInitValuesScan(ValuesScan *node, EState *estate, int eflags)
 	ExecAssignExprContext(estate, planstate);
 
 	/*
-	 * tuple table initialization
+	 * get info about values list
 	 */
-	ExecInitResultTupleSlot(estate, &scanstate->ss.ps);
-	ExecInitScanTupleSlot(estate, &scanstate->ss);
+	tupdesc = ExecTypeFromExprList((List *) linitial(node->values_lists));
+	ExecInitScanTupleSlot(estate, &scanstate->ss, tupdesc);
+
+	/*
+	 * Initialize result slot, type and projection.
+	 */
+	ExecInitResultTupleSlotTL(estate, &scanstate->ss.ps);
+	ExecAssignScanProjectionInfo(&scanstate->ss);
 
 	/*
 	 * initialize child expressions
@@ -259,13 +265,6 @@ ExecInitValuesScan(ValuesScan *node, EState *estate, int eflags)
 	scanstate->ss.ps.qual =
 		ExecInitQual(node->scan.plan.qual, (PlanState *) scanstate);
 
-	/*
-	 * get info about values list
-	 */
-	tupdesc = ExecTypeFromExprList((List *) linitial(node->values_lists));
-
-	ExecAssignScanType(&scanstate->ss, tupdesc);
-
 	/*
 	 * Other node-specific setup
 	 */
@@ -281,12 +280,6 @@ ExecInitValuesScan(ValuesScan *node, EState *estate, int eflags)
 		scanstate->exprlists[i++] = (List *) lfirst(vtl);
 	}
 
-	/*
-	 * Initialize result tuple type and projection info.
-	 */
-	ExecAssignResultTypeFromTL(&scanstate->ss.ps);
-	ExecAssignScanProjectionInfo(&scanstate->ss);
-
 	return scanstate;
 }
 
diff --git a/src/backend/executor/nodeWindowAgg.c b/src/backend/executor/nodeWindowAgg.c
index 75de7728a46..c7022cf2ceb 100644
--- a/src/backend/executor/nodeWindowAgg.c
+++ b/src/backend/executor/nodeWindowAgg.c
@@ -1785,6 +1785,7 @@ ExecInitWindowAgg(WindowAgg *node, EState *estate, int eflags)
 				numaggs,
 				aggno;
 	ListCell   *l;
+	TupleDesc	scandesc;
 
 	/* check for unsupported flags */
 	Assert(!(eflags & (EXEC_FLAG_BACKWARD | EXEC_FLAG_MARK)));
@@ -1824,16 +1825,6 @@ ExecInitWindowAgg(WindowAgg *node, EState *estate, int eflags)
 							  "WindowAgg Aggregates",
 							  ALLOCSET_DEFAULT_SIZES);
 
-	/*
-	 * tuple table initialization
-	 */
-	ExecInitScanTupleSlot(estate, &winstate->ss);
-	ExecInitResultTupleSlot(estate, &winstate->ss.ps);
-	winstate->first_part_slot = ExecInitExtraTupleSlot(estate);
-	winstate->agg_row_slot = ExecInitExtraTupleSlot(estate);
-	winstate->temp_slot_1 = ExecInitExtraTupleSlot(estate);
-	winstate->temp_slot_2 = ExecInitExtraTupleSlot(estate);
-
 	/*
 	 * WindowAgg nodes never have quals, since they can only occur at the
 	 * logical top level of a query (ie, after any WHERE or HAVING filters)
@@ -1851,21 +1842,21 @@ ExecInitWindowAgg(WindowAgg *node, EState *estate, int eflags)
 	 * initialize source tuple type (which is also the tuple type that we'll
 	 * store in the tuplestore and use in all our working slots).
 	 */
-	ExecAssignScanTypeFromOuterPlan(&winstate->ss);
-
-	ExecSetSlotDescriptor(winstate->first_part_slot,
-						  winstate->ss.ss_ScanTupleSlot->tts_tupleDescriptor);
-	ExecSetSlotDescriptor(winstate->agg_row_slot,
-						  winstate->ss.ss_ScanTupleSlot->tts_tupleDescriptor);
-	ExecSetSlotDescriptor(winstate->temp_slot_1,
-						  winstate->ss.ss_ScanTupleSlot->tts_tupleDescriptor);
-	ExecSetSlotDescriptor(winstate->temp_slot_2,
-						  winstate->ss.ss_ScanTupleSlot->tts_tupleDescriptor);
+	ExecCreateScanSlotFromOuterPlan(estate, &winstate->ss);
+	scandesc = winstate->ss.ss_ScanTupleSlot->tts_tupleDescriptor;
 
 	/*
-	 * Initialize result tuple type and projection info.
+	 * tuple table initialization
 	 */
-	ExecAssignResultTypeFromTL(&winstate->ss.ps);
+	winstate->first_part_slot = ExecInitExtraTupleSlot(estate, scandesc);
+	winstate->agg_row_slot = ExecInitExtraTupleSlot(estate, scandesc);
+	winstate->temp_slot_1 = ExecInitExtraTupleSlot(estate, scandesc);
+	winstate->temp_slot_2 = ExecInitExtraTupleSlot(estate, scandesc);
+
+	/*
+	 * Initialize result slot, type and projection.
+	 */
+	ExecInitResultTupleSlotTL(estate, &winstate->ss.ps);
 	ExecAssignProjectionInfo(&winstate->ss.ps, NULL);
 
 	/* Set up data for comparing tuples */
diff --git a/src/backend/executor/nodeWorktablescan.c b/src/backend/executor/nodeWorktablescan.c
index d5ffadda3e8..2900087b40b 100644
--- a/src/backend/executor/nodeWorktablescan.c
+++ b/src/backend/executor/nodeWorktablescan.c
@@ -156,6 +156,12 @@ ExecInitWorkTableScan(WorkTableScan *node, EState *estate, int eflags)
 	 */
 	ExecAssignExprContext(estate, &scanstate->ss.ps);
 
+	/*
+	 * tuple table initialization
+	 */
+	ExecInitResultTupleSlotTL(estate, &scanstate->ss.ps);
+	ExecInitScanTupleSlot(estate, &scanstate->ss, NULL);
+
 	/*
 	 * initialize child expressions
 	 */
@@ -163,15 +169,9 @@ ExecInitWorkTableScan(WorkTableScan *node, EState *estate, int eflags)
 		ExecInitQual(node->scan.plan.qual, (PlanState *) scanstate);
 
 	/*
-	 * tuple table initialization
+	 * Do not yet initialize projection info, see ExecWorkTableScan() for
+	 * details.
 	 */
-	ExecInitResultTupleSlot(estate, &scanstate->ss.ps);
-	ExecInitScanTupleSlot(estate, &scanstate->ss);
-
-	/*
-	 * Initialize result tuple type, but not yet projection info.
-	 */
-	ExecAssignResultTypeFromTL(&scanstate->ss.ps);
 
 	return scanstate;
 }
diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c
index fa5d9bb1201..36a41c386a4 100644
--- a/src/backend/replication/logical/worker.c
+++ b/src/backend/replication/logical/worker.c
@@ -208,7 +208,7 @@ create_estate_for_relation(LogicalRepRelMapEntry *rel)
 
 	/* Triggers might need a slot */
 	if (resultRelInfo->ri_TrigDesc)
-		estate->es_trig_tuple_slot = ExecInitExtraTupleSlot(estate);
+		estate->es_trig_tuple_slot = ExecInitExtraTupleSlot(estate, NULL);
 
 	/* Prepare to catch AFTER triggers. */
 	AfterTriggerBeginQuery();
@@ -585,8 +585,8 @@ apply_handle_insert(StringInfo s)
 
 	/* Initialize the executor state. */
 	estate = create_estate_for_relation(rel);
-	remoteslot = ExecInitExtraTupleSlot(estate);
-	ExecSetSlotDescriptor(remoteslot, RelationGetDescr(rel->localrel));
+	remoteslot = ExecInitExtraTupleSlot(estate,
+										RelationGetDescr(rel->localrel));
 
 	/* Process and store remote tuple in the slot */
 	oldctx = MemoryContextSwitchTo(GetPerTupleMemoryContext(estate));
@@ -689,10 +689,10 @@ apply_handle_update(StringInfo s)
 
 	/* Initialize the executor state. */
 	estate = create_estate_for_relation(rel);
-	remoteslot = ExecInitExtraTupleSlot(estate);
-	ExecSetSlotDescriptor(remoteslot, RelationGetDescr(rel->localrel));
-	localslot = ExecInitExtraTupleSlot(estate);
-	ExecSetSlotDescriptor(localslot, RelationGetDescr(rel->localrel));
+	remoteslot = ExecInitExtraTupleSlot(estate,
+										RelationGetDescr(rel->localrel));
+	localslot = ExecInitExtraTupleSlot(estate,
+									   RelationGetDescr(rel->localrel));
 	EvalPlanQualInit(&epqstate, estate, NULL, NIL, -1);
 
 	PushActiveSnapshot(GetTransactionSnapshot());
@@ -807,10 +807,10 @@ apply_handle_delete(StringInfo s)
 
 	/* Initialize the executor state. */
 	estate = create_estate_for_relation(rel);
-	remoteslot = ExecInitExtraTupleSlot(estate);
-	ExecSetSlotDescriptor(remoteslot, RelationGetDescr(rel->localrel));
-	localslot = ExecInitExtraTupleSlot(estate);
-	ExecSetSlotDescriptor(localslot, RelationGetDescr(rel->localrel));
+	remoteslot = ExecInitExtraTupleSlot(estate,
+										RelationGetDescr(rel->localrel));
+	localslot = ExecInitExtraTupleSlot(estate,
+									   RelationGetDescr(rel->localrel));
 	EvalPlanQualInit(&epqstate, estate, NULL, NIL, -1);
 
 	PushActiveSnapshot(GetTransactionSnapshot());
diff --git a/src/include/executor/executor.h b/src/include/executor/executor.h
index d9f4059c6ee..f9971863d19 100644
--- a/src/include/executor/executor.h
+++ b/src/include/executor/executor.h
@@ -409,9 +409,10 @@ extern void ExecScanReScan(ScanState *node);
 /*
  * prototypes from functions in execTuples.c
  */
-extern void ExecInitResultTupleSlot(EState *estate, PlanState *planstate);
-extern void ExecInitScanTupleSlot(EState *estate, ScanState *scanstate);
-extern TupleTableSlot *ExecInitExtraTupleSlot(EState *estate);
+extern void ExecInitResultTupleSlotTL(EState *estate, PlanState *planstate);
+extern void ExecInitScanTupleSlot(EState *estate, ScanState *scanstate, TupleDesc tupleDesc);
+extern TupleTableSlot *ExecInitExtraTupleSlot(EState *estate,
+					  TupleDesc tupleDesc);
 extern TupleTableSlot *ExecInitNullTupleSlot(EState *estate,
 					  TupleDesc tupType);
 extern TupleDesc ExecTypeFromTL(List *targetList, bool hasoid);
@@ -480,8 +481,6 @@ extern ExprContext *MakePerTupleExprContext(EState *estate);
 	} while (0)
 
 extern void ExecAssignExprContext(EState *estate, PlanState *planstate);
-extern void ExecAssignResultType(PlanState *planstate, TupleDesc tupDesc);
-extern void ExecAssignResultTypeFromTL(PlanState *planstate);
 extern TupleDesc ExecGetResultType(PlanState *planstate);
 extern void ExecAssignProjectionInfo(PlanState *planstate,
 						 TupleDesc inputDesc);
@@ -489,7 +488,7 @@ extern void ExecConditionalAssignProjectionInfo(PlanState *planstate,
 									TupleDesc inputDesc, Index varno);
 extern void ExecFreeExprContext(PlanState *planstate);
 extern void ExecAssignScanType(ScanState *scanstate, TupleDesc tupDesc);
-extern void ExecAssignScanTypeFromOuterPlan(ScanState *scanstate);
+extern void ExecCreateScanSlotFromOuterPlan(EState *estate, ScanState *scanstate);
 
 extern bool ExecRelationIsTargetRelation(EState *estate, Index scanrelid);
 
diff --git a/src/include/executor/tuptable.h b/src/include/executor/tuptable.h
index db2a42af5e9..7258ce80bee 100644
--- a/src/include/executor/tuptable.h
+++ b/src/include/executor/tuptable.h
@@ -127,6 +127,7 @@ typedef struct TupleTableSlot
 	MinimalTuple tts_mintuple;	/* minimal tuple, or NULL if none */
 	HeapTupleData tts_minhdr;	/* workspace for minimal-tuple-only case */
 	long		tts_off;		/* saved state for slot_deform_tuple */
+	bool		tts_fixedTupleDescriptor; /* descriptor can't be changed */
 } TupleTableSlot;
 
 #define TTS_HAS_PHYSICAL_TUPLE(slot)  \
@@ -139,8 +140,8 @@ typedef struct TupleTableSlot
 	((slot) == NULL || (slot)->tts_isempty)
 
 /* in executor/execTuples.c */
-extern TupleTableSlot *MakeTupleTableSlot(void);
-extern TupleTableSlot *ExecAllocTableSlot(List **tupleTable);
+extern TupleTableSlot *MakeTupleTableSlot(TupleDesc desc);
+extern TupleTableSlot *ExecAllocTableSlot(List **tupleTable, TupleDesc desc);
 extern void ExecResetTupleTable(List *tupleTable, bool shouldFree);
 extern TupleTableSlot *MakeSingleTupleTableSlot(TupleDesc tupdesc);
 extern void ExecDropSingleTupleTableSlot(TupleTableSlot *slot);
-- 
2.14.1.536.g6867272d5b.dirty

#22Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#1)
JIT compiling with LLVM v9.0

Hi,

I've spent the last weeks working on my LLVM compilation patchset. In
the course of that I *heavily* revised it. While still a good bit away
from committable, it's IMO definitely not a prototype anymore.

There's too many small changes, so I'm only going to list the major
things. A good bit of that is new. The actual LLVM IR emissions itself
hasn't changed that drastically. Since I've not described them in
detail before I'll describe from scratch in a few cases, even if things
haven't fully changed.

== JIT Interface ==

To avoid emitting code in very small increments (increases mmap/mremap
rw vs exec remapping, compile/optimization time), code generation
doesn't happen for every single expression individually, but in batches.

The basic object to emit code via is a jit context created with:
extern LLVMJitContext *llvm_create_context(bool optimize);
which in case of expression is stored on-demand in the EState. For other
usecases that might not be the right location.

To emit LLVM IR (ie. the portabe code that LLVM then optimizes and
generates native code for), one gets a module from that with:
extern LLVMModuleRef llvm_mutable_module(LLVMJitContext *context);

to which "arbitrary" numbers of functions can be added. In case of
expression evaluation, we get the module once for every expression, and
emit one function for the expression itself, and one for every
applicable/referenced deform function.

As explained above, we do not want to emit code immediately from within
ExecInitExpr()/ExecReadyExpr(). To facilitate that readying a JITed
expression sets the function to callback, which gets the actual native
function on the first actual call. That allows to batch together the
generation of all native functions that are defined before the first
expression is evaluated - in a lot of queries that'll be all.

Said callback then calls
extern void *llvm_get_function(LLVMJitContext *context, const char *funcname);
which'll emit code for the "in progress" mutable module if necessary,
and then searches all generated functions for the name. The names are
created via
extern void *llvm_get_function(LLVMJitContext *context, const char *funcname);
currently "evalexpr" and deform" with a generation and counter suffix.

Currently expression which do not have access to an EState, basically
all "parent" less expressions, aren't JIT compiled. That could be
changed, but I so far do not see a huge need.

== Error handling ==

There's two aspects to error handling.

Firstly, generated (LLVM IR) and emitted functions (mmap()ed segments)
need to be cleaned up both after a successful query execution and after
an error. I've settled on a fairly boring resowner based mechanism. On
errors all expressions owned by a resowner are released, upon success
expressions are reassigned to the parent / released on commit (unless
executor shutdown has cleaned them up of course).

A second, less pretty and newly developed, aspect of error handling is
OOM handling inside LLVM itself. The above resowner based mechanism
takes care of cleaning up emitted code upon ERROR, but there's also the
chance that LLVM itself runs out of memory. LLVM by default does *not*
use any C++ exceptions. It's allocations are primarily funneled through
the standard "new" handlers, and some direct use of malloc() and
mmap(). For the former a 'new handler' exists
http://en.cppreference.com/w/cpp/memory/new/set_new_handler for the
latter LLVM provides callback that get called upon failure
(unfortunately mmap() failures are treated as fatal rather than OOM
errors).
What I've chosen to do, and I'd be interested to get some input about
that, is to have two functions that LLVM using code must use:
extern void llvm_enter_fatal_on_oom(void);
extern void llvm_leave_fatal_on_oom(void);
before interacting with LLVM code (ie. emitting IR, or using the above
functions) llvm_enter_fatal_on_oom() needs to be called.

When a libstdc++ new or LLVM error occurs, the handlers set up by the
above functions trigger a FATAL error. We have to use FATAL rather than
ERROR, as we *cannot* reliably throw ERROR inside a foreign library
without risking corrupting its internal state.

Users of the above sections do *not* have to use PG_TRY/CATCH blocks,
the handlers instead are reset on toplevel sigsetjmp() level.

Using a relatively small enter/leave protected section of code, rather
than setting up these handlers globally, avoids negative interactions
with extensions that might use C++ like e.g. postgis. As LLVM code
generation should never execute arbitrary code, just setting these
handlers temporarily ought to suffice.

== LLVM Interface / patches ==

Unfortunately a bit of required LLVM functionality, particularly around
error handling but also initialization, aren't currently fully exposed
via LLVM's C-API. A bit more *optional* API isn't exposed either.

Instead of requiring a brand-new version of LLVM that has exposed this
functionality I decided it's better to have a small C++ wrapper that can
provide this functionality. Due to that new wrapper significantly older
LLVM versions can now be used (for now I've only runtime tested 5.0 and
master, 4.0 would be possible with a few ifdefs, a bit older probably
doable as well). Given that LLVM is written in C++ itself, and optional
dependency to a C++ compiler for one file doesn't seem to be too bad.

== Inlining ==

One big advantage of JITing expressions is that it can significantly
reduce the overhead of postgres' extensible function/operator mechanism,
by inlining the body of called operators.

This is the part of code that I've worked on most significantly. While I
think JITing is an entirely viable project without committed inlining, I
felt that we definitely need to know how exactly we want to do inlining
before merging other parts. 3 different implementations later, I'm
fairly confident that I have a good concept, even though a few corners
still need to be smoothed.

As a quick background, LLVM works on the basis of a high-level
"abstract" assembly representation (llvm.org/docs/LangRef.html). This
can be generated in memory, stored in binary form (bitcode files ending
in .bc) or text representation (.ll files). The clang compiler always
generates the in-memory representation and the -emit-llvm flag tells it
to write that out to disk, rather than .o files/binaries.

This facility allows us to get the bitcode for all operators
(e.g. int8eq, float8pl etc), without maintaining two copies. The way
I've currently set it up is that, if --with-llvm is passed to configure,
all backend files are also compiled to bitcode files. These bitcode
files get installed into the server's
$pkglibdir/bitcode/postgres/
under their original subfolder, eg.
~/build/postgres/dev-assert/install/lib/bitcode/postgres/utils/adt/float.bc
Using existing LLVM functionality (for parallel LTO compilation),
additionally an index is over these is stored to
$pkglibdir/bitcode/postgres.index.bc

When deciding to JIT for the first time, $pkglibdir/bitcode/ is scanned
for all .index.bc files and a *combined* index over all these files is
built in memory. The reason for doing so is that that allows "easy"
access to inlining access for extensions - they can install code into
$pkglibdir/bitcode/[extension]/
accompanied by
$pkglibdir/bitcode/[extension].index.bc
just alongside the actual library.

The inlining implementation, I had to write my own LLVM's isn't suitable
for a number of reasons, can then use the combined in-memory index to
look up all 'extern' function references, judge their size, and then
open just the file containing its implementation (ie. the above
float.bc). Currently there's a limit of 150 instructions for functions
to be inlined, functions used by inlined functions have a budget of 0.5
* limit, and so on. This gets rid of most operators I in queries I
tested, although there's a few that resist inlining due to references to
file-local static variables - but those largely don't seem to be
performance relevant.

== Type Synchronization ==

For my current two main avenues of performance optimizations due to
JITing, expression eval and tuple deforming, it's obviously required
that code generation knows about at least a few postgres types (tuple
slots, heap tuples, expr context/state, etc).

Initially I'd provided LLVM by emitting types manually like:
{
LLVMTypeRef members[15];

members[ 0] = LLVMInt32Type(); /* type */
members[ 1] = LLVMInt8Type(); /* isempty */
members[ 2] = LLVMInt8Type(); /* shouldFree */
members[ 3] = LLVMInt8Type(); /* shouldFreeMin */
members[ 4] = LLVMInt8Type(); /* slow */
members[ 5] = LLVMPointerType(StructHeapTupleData, 0); /* tuple */
members[ 6] = LLVMPointerType(StructtupleDesc, 0); /* tupleDescriptor */
members[ 7] = TypeMemoryContext; /* mcxt */
members[ 8] = LLVMInt32Type(); /* buffer */
members[ 9] = LLVMInt32Type(); /* nvalid */
members[10] = LLVMPointerType(TypeSizeT, 0); /* values */
members[11] = LLVMPointerType(LLVMInt8Type(), 0); /* nulls */
members[12] = LLVMPointerType(StructMinimalTupleData, 0); /* mintuple */
members[13] = StructHeapTupleData; /* minhdr */
members[14] = LLVMInt64Type(); /* off */

StructTupleTableSlot = LLVMStructCreateNamed(LLVMGetGlobalContext(),
"struct.TupleTableSlot");
LLVMStructSetBody(StructTupleTableSlot, members, lengthof(members), false);
}
and then using numeric offset when emitting code like:
LLVMBuildStructGEP(builder, v_slot, 9, "")
to compute the address of nvalid field of a slot at runtime.

but that obviously duplicates a lot of information and is incredibly
failure prone. Doesn't seem acceptable.

What I've now instead done is have one small file (llvmjit_types.c)
which references each of the types required for JITing. That file is
translated to bitcode at compile time, and loaded when LLVM is
initialized in a backend. That works very well to synchronize the type
definition, unfortunately it does *not* synchronize offsets as the IR
level representation doesn't know field names.

Instead I've added defines to the original struct definition that
provide access to the relevant offsets. Eg.
#define FIELDNO_TUPLETABLESLOT_NVALID 9
int tts_nvalid; /* # of valid values in tts_values */
while that still needs to be defined, it's only required for a
relatively small number of fields, and it's bunched together with the
struct definition, so it's easily kept synchronized.

A significant downside for this is that clang needs to be around to
create that bitcode file, but that doesn't seem that bad as an optional
*build*-time, *not* runtime, dependency.

Not a perfect solution, but I don't quite see a better approach.

== Minimal cost based planning & config ==

Currently there's a number of GUCs that influence JITing:

- jit_above_cost = -1, 0-DBL_MAX - all queries with a higher total cost
get JITed, *without* optimization (expensive part), corresponding to
-O0. This commonly already results in significant speedups if
expression/deforming is a bottleneck (removing dynamic branches
mostly).
- jit_optimize_above_cost = -1, 0-DBL_MAX - all queries with a higher total cost
get JITed, *with* optimization (expensive part).
- jit_inline_above_cost = -1, 0-DBL_MAX - inlining is tried if query has
higher cost.

For all of these -1 is a hard disable.

There currently also exist:
- jit_expressions = 0/1
- jit_deform = 0/1
- jit_perform_inlining = 0/1
but I think they could just be removed in favor of the above.

Additionally there's a few debugging/other GUCs:

- jit_debugging_support = 0/1 - register generated functions with the
debugger. Unfortunately GDBs JIT integration scales O(#functions^2),
albeit with a very small constant, so it cannot always be enabled :(
- jit_profiling_support = 0/1 - emit information so perf gets notified
about JITed functions. As this logs data to disk that is not
automatically cleaned up (otherwise it'd be useless), this definitely
cannot be enabled by default.
- jit_dump_bitcode = 0/1 - log generated pre/post optimization bitcode
to disk. This is quite useful for development, so I'd want to keep it.
- jit_log_ir = 0/1 - dump generated IR to the logfile. I found this to
be too verbose, and I think it should be yanked.

Do people feel these should be hidden behind #ifdefs, always present but
prevent from being set to a meaningful, or unrestricted?

=== Remaining work ==

These I'm planning to tackle in the near future and need to be tackled
before mergin.

- Add a big readme
- Add docs
- Add / check LLVM 4.0 support
- reconsider location of JITing code (lib/ and heaptuple.c specifically)
- Split llvmjit_wrap.cpp into three files (error handling, inlining,
temporary LLVM C API extensions)
- Split the bigger commit, improve commit messages
- Significant amounts of local code cleanup and comments
- duplicated code in expression emission for very related step types
- more consistent LLVM variable naming
- pgindent
- timing information about JITing needs to be fewer messages, and hidden
behind a GUC.
- improve logging (mostly remove)

== Future Todo (some already in-progress) ==

- JITed hash computation for nodeAgg & nodeHash. That's currently a
major bottleneck.
- Increase quality of generated code. There's a *lot* left still on the
table. The generated code currently spills far too much into memory,
and LLVM only can optimize that away to a limited degree. I've
experimented some and for TPCH Q01 it's possible to get at least
another x1.8 due to that, with expression eval *still* being the
bottleneck afterwards...
- Caching of the generated code, drastically reducing overhead and
allowing JITing to be beneficial in OLTP cases. Currently the biggest
obstacle to that is the number of specific memory locations referenced
in the expression representation, but that definitely can be improved
(a lot of it by the above point alone).
- More elaborate planning model
- The cloning of modules could e reduced to only cloning required
parts. As that's the most expensive part of inlining and most of the
time only a few functions are used, this should probably be done soon.

== Code ==

As the patchset is large (500kb) and I'm still quickly evolving it, I do
not yet want to attach it. The git tree is at
https://git.postgresql.org/git/users/andresfreund/postgres.git
in the jit branch
https://git.postgresql.org/gitweb/?p=users/andresfreund/postgres.git;a=shortlog;h=refs/heads/jit

to build --with-llvm has to be passed to configure, llvm-config either
needs to be in PATH or provided with LLVM_CONFIG to make. A c++ compiler
and clang need to be available under common names or provided via CXX /
CLANG respectively.

Regards,

Andres Freund

#23Pierre Ducroquet
p.psql@pinaraf.info
In reply to: Andres Freund (#22)
1 attachment(s)
Re: JIT compiling with LLVM v9.0

On Wednesday, January 24, 2018 8:20:38 AM CET Andres Freund wrote:

As the patchset is large (500kb) and I'm still quickly evolving it, I do
not yet want to attach it. The git tree is at
https://git.postgresql.org/git/users/andresfreund/postgres.git
in the jit branch

https://git.postgresql.org/gitweb/?p=users/andresfreund/postgres.git;a=shor
tlog;h=refs/heads/jit

to build --with-llvm has to be passed to configure, llvm-config either
needs to be in PATH or provided with LLVM_CONFIG to make. A c++ compiler
and clang need to be available under common names or provided via CXX /
CLANG respectively.

Regards,

Andres Freund

Hi

I tried to build on Debian sid, using GCC 7 and LLVM 5. I used the following
to compile, using your branch @3195c2821d :

$ export LLVM_CONFIG=/usr/bin/llvm-config-5.0
$ ./configure --with-llvm
$ make

And I had the following build error :
llvmjit_wrap.cpp:32:10: fatal error: llvm-c/DebugInfo.h: No such file or
directory
#include "llvm-c/DebugInfo.h"
^~~~~~~~~~~~~~~~~~~~
compilation terminated.

In LLVM 5.0, it looks like DebugInfo.h is not available in llvm-c, only as a C
++ API in llvm/IR/DebugInfo.h.

For 'sport' (I have not played with LLVM API since more than one year), I
tried to fix it, changing it to the C++ include.

The DebugInfo related one was easy, only one function was used.
But I still could not build because the LLVM API changed between 5.0 and 6.0
regarding value info SummaryList.

llvmjit_wrap.cpp: In function
‘std::unique_ptr<llvm::StringMap<llvm::StringSet<> > >
llvm_build_inline_plan(llvm::Module*)’:
llvmjit_wrap.cpp:285:48: error: ‘class llvm::GlobalValueSummary’ has no member
named ‘getBaseObject’
fs = llvm::cast<llvm::FunctionSummary>(gvs->getBaseObject());
^~~~~~~~~~~~~

That one was a bit uglier.

I'm not sure how to test everything properly, so the patch is attached for
both these issues, do as you wish with it… :)

Regards

Pierre Ducroquet

Attachments:

0001-Allow-building-with-LLVM-5.0.patchtext/x-patch; charset=utf-8; name=0001-Allow-building-with-LLVM-5.0.patchDownload
From fdfea09dd7410d6ed7ad54df1ba3092bd0eecb92 Mon Sep 17 00:00:00 2001
From: Pierre Ducroquet <pinaraf@pinaraf.info>
Date: Wed, 24 Jan 2018 22:28:34 +0100
Subject: [PATCH] Allow building with LLVM 5.0

---
 src/backend/lib/llvmjit_wrap.cpp | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/src/backend/lib/llvmjit_wrap.cpp b/src/backend/lib/llvmjit_wrap.cpp
index b745aec4fe..7961148a85 100644
--- a/src/backend/lib/llvmjit_wrap.cpp
+++ b/src/backend/lib/llvmjit_wrap.cpp
@@ -29,7 +29,6 @@ extern "C"
 
 #include "llvm-c/Core.h"
 #include "llvm-c/BitReader.h"
-#include "llvm-c/DebugInfo.h"
 
 #include <fcntl.h>
 #include <sys/mman.h>
@@ -50,6 +49,7 @@ extern "C"
 #include "llvm/Analysis/ModuleSummaryAnalysis.h"
 #include "llvm/Bitcode/BitcodeReader.h"
 #include "llvm/IR/CallSite.h"
+#include "llvm/IR/DebugInfo.h"
 #include "llvm/IR/IntrinsicInst.h"
 #include "llvm/IR/ModuleSummaryIndex.h"
 #include "llvm/Linker/IRMover.h"
@@ -218,6 +218,13 @@ llvm_inline(LLVMModuleRef M)
 	llvm_execute_inline_plan(mod, globalsToInline.get());
 }
 
+
+inline llvm::GlobalValueSummary *GlobalValueSummary__getBaseObject(llvm::GlobalValueSummary *gvs) {
+  if (auto *AS = llvm::dyn_cast<llvm::AliasSummary>(gvs))
+    return &AS->getAliasee();
+  return gvs;
+}
+
 /*
  * Build information necessary for inlining external function references in
  * mod.
@@ -282,7 +289,7 @@ llvm_build_inline_plan(llvm::Module *mod)
 			const llvm::Module *defMod;
 			llvm::Function *funcDef;
 
-			fs = llvm::cast<llvm::FunctionSummary>(gvs->getBaseObject());
+			fs = llvm::cast<llvm::FunctionSummary>(GlobalValueSummary__getBaseObject(gvs.get()));
 			elog(DEBUG2, "func %s might be in %s",
 				 funcName.data(),
 				 modPath.data());
@@ -476,7 +483,7 @@ load_module(llvm::StringRef Identifier)
 	 * code. Until that changes, not much point in wasting memory and cycles
 	 * on processing debuginfo.
 	 */
-	LLVMStripModuleDebugInfo(mod);
+	llvm::StripDebugInfo(*llvm::unwrap(mod));
 
 	return std::unique_ptr<llvm::Module>(llvm::unwrap(mod));
 }
-- 
2.15.1

#24Andres Freund
andres@anarazel.de
In reply to: Pierre Ducroquet (#23)
Re: JIT compiling with LLVM v9.0

Hi,

On 2018-01-24 22:35:08 +0100, Pierre Ducroquet wrote:

I tried to build on Debian sid, using GCC 7 and LLVM 5. I used the following
to compile, using your branch @3195c2821d :

Thanks!

$ export LLVM_CONFIG=/usr/bin/llvm-config-5.0
$ ./configure --with-llvm
$ make

And I had the following build error :
llvmjit_wrap.cpp:32:10: fatal error: llvm-c/DebugInfo.h: No such file or
directory
#include "llvm-c/DebugInfo.h"
^~~~~~~~~~~~~~~~~~~~
compilation terminated.

In LLVM 5.0, it looks like DebugInfo.h is not available in llvm-c, only as a C
++ API in llvm/IR/DebugInfo.h.

Hm, I compiled against 5.0 quite recently, but added the stripping of
debuginfo lateron. I'll add a fallback method, thanks for pointing that
out!

But I still could not build because the LLVM API changed between 5.0 and 6.0
regarding value info SummaryList.

Hm, thought these changes were from before my 5.0 test. But the code
evolved heavily, so I might misremember. Let me see.

Thanks, I'll try to push fixes into the tree soon-ish..

I'm not sure how to test everything properly, so the patch is attached for
both these issues, do as you wish with it… :)

What I do for testing is running postgres' tests against a started
server that has all cost based behaviour turned off (which makes no
sense from a runtime optimization perspective, but increases
coverage...).

The flags I pass to the server are:
-c jit_expressions=1 -c jit_tuple_deforming=1 -c jit_perform_inlining=1 -c jit_above_cost=0 -c jit_optimize_above_cost=0
then I run
make -s installcheck-parallel
to see whether things pass. The flags makes the tests slow-ish, but
tests everything under jit. In particular errors.sql's recursion check
takes a while...

Obviously none of the standard tests are interesting from a performance
perspective...

FWIW, here's an shortened excerpt of the debugging output of TPCH query:

DEBUG: checking inlinability of ExecAggInitGroup
DEBUG: considering extern function datumCopy at 75 for inlining
DEBUG: inline top function ExecAggInitGroup total_instcount: 24, partial: 21

so the inliner found a reference to ExecAggInitGroup, inlined it, and
scheduled to checkout datumCopy, externally referenced from
ExecAggInitGroup, later.

DEBUG: uneligible to import errstart due to early threshold: 150 vs 37

elog stuff wasn't inlined because errstart has 150 insn, but at this
point the limit was 37 (aka 150 / 2 / 2). Early means this was decided
based on the summary. There's also 'late' checks preventing inlining if
dependencies of the inlined variable (local static functions, constant
static global variables) make it bigger than the summary knows about.

Then we get to execute the importing:
DEBUG: performing import of postgres/utils/fmgr/fmgr.bc pg_detoast_datum, pg_detoast_datum_packed
DEBUG: performing import of postgres/utils/adt/arrayfuncs.bc construct_array
DEBUG: performing import of postgres/utils/error/assert.bc ExceptionalCondition, .str.1, .str
DEBUG: performing import of postgres/utils/adt/expandeddatum.bc EOH_flatten_into, DeleteExpandedObject, .str.1, .str.2, .str.4, EOH_get_flat_size
DEBUG: performing import of postgres/utils/adt/int8.bc __func__.overflowerr, .str, .str.12, int8inc, overflowerr, pg_add_s64_overflow
...
DEBUG: performing import of postgres/utils/adt/date.bc date_le_timestamp, date2timestamp, .str, __func__.date2timestamp, .str.26

And there's a timing summary (debugging build)
DEBUG: time to inline: 0.145s
DEBUG: time to opt: 0.156s
DEBUG: time to emit: 0.078s

Same debugging build:

tpch_10[6930][1]=# set jit_expressions = 1;
tpch_10[6930][1]=# \i ~/tmp/tpch/pg-tpch/queries/q01.sql
...
Time: 28442.870 ms (00:28.443)

tpch_10[6930][1]=# set jit_expressions = 0;
tpch_10[6930][1]=# \i ~/tmp/tpch/pg-tpch/queries/q01.sql
...
Time: 70357.830 ms (01:10.358)
tpch_10[6930][1]=# show max_parallel_workers_per_gather;
┌─────────────────────────────────┐
│ max_parallel_workers_per_gather │
├─────────────────────────────────┤
│ 0 │
└─────────────────────────────────┘

Now admittedly a debugging/assertion enabled build isn't quite a fair
fight, but it's not that much smaller a win without that.

- Andres

#25Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#24)
Re: JIT compiling with LLVM v9.0

Hi,

On 2018-01-24 14:06:30 -0800, Andres Freund wrote:

In LLVM 5.0, it looks like DebugInfo.h is not available in llvm-c, only as a C
++ API in llvm/IR/DebugInfo.h.

Hm, I compiled against 5.0 quite recently, but added the stripping of
debuginfo lateron. I'll add a fallback method, thanks for pointing that
out!

Went more with your fix, there's not much point in using the C API
here. Should probably remove the use of it nearly entirely from the .cpp
file (save for wrap/unwrap() use). But man, the 'class Error' usage is
one major ugly pain.

But I still could not build because the LLVM API changed between 5.0 and 6.0
regarding value info SummaryList.

Hm, thought these changes were from before my 5.0 test. But the code
evolved heavily, so I might misremember. Let me see.

Ah, that one was actually easier to fix. There's no need to get the base
object at all, so it's just a one-line change.

Thanks, I'll try to push fixes into the tree soon-ish..

Pushed.

Thanks again for looking!

- Andres

#26Jeff Davis
pgsql@j-davis.com
In reply to: Pierre Ducroquet (#23)
Re: JIT compiling with LLVM v9.0

On Wed, Jan 24, 2018 at 1:35 PM, Pierre Ducroquet <p.psql@pinaraf.info> wrote:

In LLVM 5.0, it looks like DebugInfo.h is not available in llvm-c, only as a C
++ API in llvm/IR/DebugInfo.h.

The LLVM APIs don't seem to be very stable; won't there just be a
continuous stream of similar issues?

Pinning major postgresql versions to specific LLVM versions doesn't
seem very appealing. Even if you aren't interested in the latest
changes in LLVM, trying to get the right version on your machine will
be annoying.

Regards,
Jeff Davis

#27Andres Freund
andres@anarazel.de
In reply to: Jeff Davis (#26)
Re: JIT compiling with LLVM v9.0

Hi,

On 2018-01-24 22:33:30 -0800, Jeff Davis wrote:

On Wed, Jan 24, 2018 at 1:35 PM, Pierre Ducroquet <p.psql@pinaraf.info> wrote:

In LLVM 5.0, it looks like DebugInfo.h is not available in llvm-c, only as a C
++ API in llvm/IR/DebugInfo.h.

The LLVM APIs don't seem to be very stable; won't there just be a
continuous stream of similar issues?

There'll be some of that yes. But the entire difference between 5 and
what will be 6 was not including one header, and not calling one unneded
function. That doesn't seem like a crazy amount of adaption that needs
to be done. From a quick look about porting to 4, it'll be a bit, but
not much more effort.

The reason I'm using the C-API where possible is that it's largely
forward compatible (i.e. new features added, but seldomly things are
removed). The C++ code changes a bit more, but it's not that much code
we're interfacing with either.

I think we'll have to make do with a number of ifdefs - I don't really
see an alternative. Unless you've a better idea?

Greetings,

Andres Freund

#28Jeff Davis
pgsql@j-davis.com
In reply to: Andres Freund (#22)
Re: JIT compiling with LLVM v9.0

On Tue, Jan 23, 2018 at 11:20 PM, Andres Freund <andres@anarazel.de> wrote:

Hi,

I've spent the last weeks working on my LLVM compilation patchset. In
the course of that I *heavily* revised it. While still a good bit away
from committable, it's IMO definitely not a prototype anymore.

Great!

A couple high-level questions:

1. I notice a lot of use of the LLVM builder, for example, in
slot_compile_deform(). Why can't you do the same thing you did with
function code, where you create the ".bc" at build time from plain C
code, and then load it at runtime?
2. I'm glad you considered extensions. How far can we go with this in
the future? Can we have bitcode-only extensions that don't need a .so
file? Can we store the bitcode in pg_proc, simplifying deployment and
allowing extensions to travel over replication? I am not asking for
this now, of course, but I'd like to get the idea out there so we
leave room.

Regards,
Jeff Davis

#29Andres Freund
andres@anarazel.de
In reply to: Jeff Davis (#28)
Re: JIT compiling with LLVM v9.0

Hi!

On 2018-01-24 22:51:36 -0800, Jeff Davis wrote:

A couple high-level questions:

1. I notice a lot of use of the LLVM builder, for example, in
slot_compile_deform(). Why can't you do the same thing you did with
function code, where you create the ".bc" at build time from plain C
code, and then load it at runtime?

Not entirely sure what you mean. You mean why I don't inline
slot_getsomeattrs() etc and instead generate code manually? The reason
is that the generated code is a *lot* smarter due to knowing the
specific tupledesc.

2. I'm glad you considered extensions. How far can we go with this in
the future?

Can we have bitcode-only extensions that don't need a .so
file?

Hm. I don't see a big problem introducing this. There'd be some
complexity in how to manage the lifetime of JITed functions generated
that way, but that should be solvable.

Can we store the bitcode in pg_proc, simplifying deployment and
allowing extensions to travel over replication?

Yes, we could. You'd need to be a bit careful that all the machines have
similar-ish cpu generations or compile with defensive settings, but that
seems okay.

Greetings,

Andres Freund

#30Pierre Ducroquet
p.psql@pinaraf.info
In reply to: Andres Freund (#27)
Re: JIT compiling with LLVM v9.0

On Thursday, January 25, 2018 7:38:16 AM CET Andres Freund wrote:

Hi,

On 2018-01-24 22:33:30 -0800, Jeff Davis wrote:

On Wed, Jan 24, 2018 at 1:35 PM, Pierre Ducroquet <p.psql@pinaraf.info>

wrote:

In LLVM 5.0, it looks like DebugInfo.h is not available in llvm-c, only
as a C ++ API in llvm/IR/DebugInfo.h.

The LLVM APIs don't seem to be very stable; won't there just be a
continuous stream of similar issues?

There'll be some of that yes. But the entire difference between 5 and
what will be 6 was not including one header, and not calling one unneded
function. That doesn't seem like a crazy amount of adaption that needs
to be done. From a quick look about porting to 4, it'll be a bit, but
not much more effort.

I don't know when this would be released, but the minimal supported LLVM
version will have a strong influence on the availability of that feature. If
today this JIT compiling was released with only LLVM 5/6 support, it would be
unusable for most Debian users (llvm-5 is only available in sid). Even llvm 4
is not available in latest stable.
I'm already trying to build with llvm-4 and I'm going to try further with llvm
3.9 (Debian Stretch doesn't have a more recent than this one, and I won't have
something better to play with my data), I'll keep you informed. For sport, I
may also try llvm 3.5 (for Debian Jessie).

Pierre

#31Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Andres Freund (#22)
Re: JIT compiling with LLVM v9.0

On 24.01.2018 10:20, Andres Freund wrote:

Hi,

I've spent the last weeks working on my LLVM compilation patchset. In
the course of that I *heavily* revised it. While still a good bit away
from committable, it's IMO definitely not a prototype anymore.

There's too many small changes, so I'm only going to list the major
things. A good bit of that is new. The actual LLVM IR emissions itself
hasn't changed that drastically. Since I've not described them in
detail before I'll describe from scratch in a few cases, even if things
haven't fully changed.

== JIT Interface ==

To avoid emitting code in very small increments (increases mmap/mremap
rw vs exec remapping, compile/optimization time), code generation
doesn't happen for every single expression individually, but in batches.

The basic object to emit code via is a jit context created with:
extern LLVMJitContext *llvm_create_context(bool optimize);
which in case of expression is stored on-demand in the EState. For other
usecases that might not be the right location.

To emit LLVM IR (ie. the portabe code that LLVM then optimizes and
generates native code for), one gets a module from that with:
extern LLVMModuleRef llvm_mutable_module(LLVMJitContext *context);

to which "arbitrary" numbers of functions can be added. In case of
expression evaluation, we get the module once for every expression, and
emit one function for the expression itself, and one for every
applicable/referenced deform function.

As explained above, we do not want to emit code immediately from within
ExecInitExpr()/ExecReadyExpr(). To facilitate that readying a JITed
expression sets the function to callback, which gets the actual native
function on the first actual call. That allows to batch together the
generation of all native functions that are defined before the first
expression is evaluated - in a lot of queries that'll be all.

Said callback then calls
extern void *llvm_get_function(LLVMJitContext *context, const char *funcname);
which'll emit code for the "in progress" mutable module if necessary,
and then searches all generated functions for the name. The names are
created via
extern void *llvm_get_function(LLVMJitContext *context, const char *funcname);
currently "evalexpr" and deform" with a generation and counter suffix.

Currently expression which do not have access to an EState, basically
all "parent" less expressions, aren't JIT compiled. That could be
changed, but I so far do not see a huge need.

Hi,

As far as I understand generation of native code is now always done for
all supported expressions and individually by each backend.
I wonder it will be useful to do more efforts to understand when
compilation to native code should be done and when interpretation is better.
For example many JIT-able languages like Lua are using traces, i.e.
query is first interpreted  and trace is generated. If the same trace is
followed more than N times, then native code is generated for it.

In context of DBMS executor it is obvious that only frequently executed
or expensive queries have to be compiled.
So we can use estimated plan cost and number of query executions as
simple criteria for JIT-ing the query.
May be compilation of simple queries (with small cost) should be done
only for prepared statements...

Another question is whether it is sensible to redundantly do expensive
work (llvm compilation) in all backends.
This question refers to shared prepared statement cache. But even
without such cache, it seems to be possible to use for library name some
signature of the compiled expression and allow
to share this libraries between backends. So before starting code
generation, ExecReadyCompiledExpr can first build signature and check if
correspondent library is already present.
Also it will be easier to control space used by compiled libraries in
this case.

--
Konstantin Knizhnik
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

#32Andres Freund
andres@anarazel.de
In reply to: Pierre Ducroquet (#30)
Re: JIT compiling with LLVM v9.0

Hi,

On 2018-01-25 10:00:14 +0100, Pierre Ducroquet wrote:

I don't know when this would be released,

August-October range.

but the minimal supported LLVM
version will have a strong influence on the availability of that feature. If
today this JIT compiling was released with only LLVM 5/6 support, it would be
unusable for most Debian users (llvm-5 is only available in sid). Even llvm 4
is not available in latest stable.
I'm already trying to build with llvm-4 and I'm going to try further with llvm
3.9 (Debian Stretch doesn't have a more recent than this one, and I won't have
something better to play with my data), I'll keep you informed. For sport, I
may also try llvm 3.5 (for Debian Jessie).

I don't think it's unreasonable to not support super old llvm
versions. This is a complex feature, and will take some time to
mature. Supporting too many LLVM versions at the outset will have some
cost. Versions before 3.8 would require supporting mcjit rather than
orc, and I don't think that'd be worth doing. I think 3.9 might be a
reasonable baseline...

Greetings,

Andres Freund

#33Andres Freund
andres@anarazel.de
In reply to: Konstantin Knizhnik (#31)
Re: JIT compiling with LLVM v9.0

Hi,

On 2018-01-25 18:40:53 +0300, Konstantin Knizhnik wrote:

As far as I understand generation of native code is now always done for all
supported expressions and individually by each backend.

Mostly, yes. It's done "always" done, because there's cost based checks
whether to do so or not.

I wonder it will be useful to do more efforts to understand when compilation
to native code should be done and when interpretation is better.
For example many JIT-able languages like Lua are using traces, i.e. query is
first interpreted� and trace is generated. If the same trace is followed
more than N times, then native code is generated for it.

Right. That's where I actually had started out, but my experimentation
showed that that's not that interesting a path to pursue. Emitting code
in much smaller increments (as you'd do so for individual expressions)
has considerable overhead. We also have a planner that allows us
reasonable guesses when to JIT and when not - something not available in
many other languages.

That said, nothing in the infrastructure would preent you from pursuing
that, it'd just be a wrapper function for the generated exprs that
tracks infocations.

Another question is whether it is sensible to redundantly do expensive work
(llvm compilation) in all backends.

Right now we kinda have to, but I really want to get rid of
that. There's some pointers included as constants in the generated
code. I plan to work on getting rid of that requirement, but after
getting the basics in (i.e. realistically not this release). Even after
that I'm personally much more interested in caching the generated code
inside a backend, rather than across backends. Function addresses et
al being different between backends would add some complications, can be
overcome, but I'm doubtful it's immediately worth it.

So before starting code generation, ExecReadyCompiledExpr can first
build signature and check if correspondent library is already present.
Also it will be easier to control space used by compiled libraries in
this

Right, I definitely think we want to do that at some point not too far
away in the future. That makes the applicability of JITing much broader.

More advanced forms of this are that you JIT in the background for
frequently executed code (so not to incur latency the first time
somebody executes). Aand/or that you emit unoptimized code the first
time through, which is quite quick, and run the optimizer after the
query has been executed a number of times.

Greetings,

Andres Freund

#34Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Andres Freund (#33)
Re: JIT compiling with LLVM v9.0

Hi,

I've spent the last weeks working on my LLVM compilation patchset. In
the course of that I *heavily* revised it. While still a good bit away
from committable, it's IMO definitely not a prototype anymore.

Below are results on my system for Q1 TPC-H scale 10 (~13Gb database)

Options
Time
Default
20075
jit_expressions=on
16105
jit_tuple_deforming=on 14734
jit_perform_inlining=on
13441

Also I noticed that parallel execution didsables JIT.
At my computer with 4 cores time of Q1 with parallel execution is 6549.
Are there any principle problems with combining JIT and parallel execution?

--
Konstantin Knizhnik
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

#35Andres Freund
andres@anarazel.de
In reply to: Konstantin Knizhnik (#34)
Re: JIT compiling with LLVM v9.0

Hi,

Thanks for testing things out!

On 2018-01-26 10:44:24 +0300, Konstantin Knizhnik wrote:

Also I noticed that parallel execution didsables JIT.

Oh, oops, I broke that recently by moving where the decisition about
whether to jit or not is. There actually is JITing, but only in the
leader.

Are there any principle problems with combining JIT and parallel execution?

No, there's not, I just need to send down the flag to JIT down to the
workers. Will look at it tomorrow. If you want to measure / play around
till then you can manually hack the PGJIT_* checks in execExprCompile.c

with that done, on my laptop, tpch-Q01, scale 10:

SET max_parallel_workers_per_gather=0; SET jit_expressions = 1;
15145.508 ms
SET max_parallel_workers_per_gather=0; SET jit_expressions = 0;
23808.809 ms
SET max_parallel_workers_per_gather=4; SET jit_expressions = 1;
4775.170 ms
SET max_parallel_workers_per_gather=4; SET jit_expressions = 0;
7173.483 ms

(that's with inlining and deforming enabled too)

Greetings,

Andres Freund

#36Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Andres Freund (#35)
1 attachment(s)
Re: JIT compiling with LLVM v9.0

On 26.01.2018 11:23, Andres Freund wrote:

Hi,

Thanks for testing things out!

Thank you for this work.
One more question: do you have any idea how to profile JITed code?
There is no LLVMOrcRegisterPerf in LLVM 5, so jit_profiling_support
option does nothing.
And without it perf is not able to unwind stack trace for generated code.
A attached the produced profile, looks like "unknown" bar corresponds to
JIT code.

There is NoFramePointerElim option in LLVMMCJITCompilerOptions
structure, but it requires use of ExecutionEngine.
Something like this:

    mod = llvm_mutable_module(context);
    {
        struct LLVMMCJITCompilerOptions options;
        LLVMExecutionEngineRef jit;
        char* error;
        LLVMCreateExecutionEngineForModule(&jit, mod, &error);
        LLVMInitializeMCJITCompilerOptions(&options, sizeof(options));
        options.NoFramePointerElim = 1;
        LLVMCreateMCJITCompilerForModule(&jit, mod, &options,
sizeof(options),
                                         &error);
    }
    ...

But you are compiling code using LLVMOrcAddEagerlyCompiledIR
and I find no way to pass no-omit-frame pointer option here.

--
Konstantin Knizhnik
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

Attachments:

q1.svgimage/svg+xml; name=q1.svgDownload
#37David Fetter
david@fetter.org
In reply to: Andres Freund (#33)
Re: JIT compiling with LLVM v9.0

On Thu, Jan 25, 2018 at 11:20:28AM -0800, Andres Freund wrote:

On 2018-01-25 18:40:53 +0300, Konstantin Knizhnik wrote:

Another question is whether it is sensible to redundantly do
expensive work (llvm compilation) in all backends.

Right now we kinda have to, but I really want to get rid of that.
There's some pointers included as constants in the generated code. I
plan to work on getting rid of that requirement, but after getting
the basics in (i.e. realistically not this release). Even after
that I'm personally much more interested in caching the generated
code inside a backend, rather than across backends. Function
addresses et al being different between backends would add some
complications, can be overcome, but I'm doubtful it's immediately
worth it.

If we go with threading for this part, sharing that state may be
simpler. It seems a lot of work is going into things that threading
does at a much lower developer cost, but that's a different
conversation.

So before starting code generation, ExecReadyCompiledExpr can first
build signature and check if correspondent library is already present.
Also it will be easier to control space used by compiled libraries in
this

Right, I definitely think we want to do that at some point not too far
away in the future. That makes the applicability of JITing much broader.

More advanced forms of this are that you JIT in the background for
frequently executed code (so not to incur latency the first time
somebody executes). Aand/or that you emit unoptimized code the first
time through, which is quite quick, and run the optimizer after the
query has been executed a number of times.

Both sound pretty neat.

Best,
David.
--
David Fetter <david(at)fetter(dot)org> http://fetter.org/
Phone: +1 415 235 3778

Remember to vote!
Consider donating to Postgres: http://www.postgresql.org/about/donate

#38Andres Freund
andres@anarazel.de
In reply to: Konstantin Knizhnik (#36)
Re: JIT compiling with LLVM v9.0

Hi,

On 2018-01-26 13:06:27 +0300, Konstantin Knizhnik wrote:

One more question: do you have any idea how to profile JITed code?

Yes ;). It depends a bit on what exactly you want to do. Is it
sufficient to get time associated with the parent caller, or do you need
instruction-level access.

There is no LLVMOrcRegisterPerf in LLVM 5, so jit_profiling_support option
does nothing.

Right, it's a patch I'm trying to get into the next version of
llvm. With that you get access to the shared object and everything.

And without it perf is not able to unwind stack trace for generated
code.

You can work around that by using --call-graph lbr with a sufficiently
new perf. That'll not know function names et al, but at least the parent
will be associated correctly.

But you are compiling code using LLVMOrcAddEagerlyCompiledIR
and I find no way to pass no-omit-frame pointer option here.

It shouldn't be too hard to open code support for it, encapsulated in a
function:
// Set function attribute "no-frame-pointer-elim" based on
// NoFramePointerElim.
for (auto &F : *Mod) {
auto Attrs = F.getAttributes();
StringRef Value(options.NoFramePointerElim ? "true" : "false");
Attrs = Attrs.addAttribute(F.getContext(), AttributeList::FunctionIndex,
"no-frame-pointer-elim", Value);
F.setAttributes(Attrs);
}
that's all that option did for mcjit.

Greetings,

Andres Freund

#39Jeff Davis
pgsql@j-davis.com
In reply to: Andres Freund (#29)
Re: JIT compiling with LLVM v9.0

On Wed, Jan 24, 2018 at 11:02 PM, Andres Freund <andres@anarazel.de> wrote:

Not entirely sure what you mean. You mean why I don't inline
slot_getsomeattrs() etc and instead generate code manually? The reason
is that the generated code is a *lot* smarter due to knowing the
specific tupledesc.

I would like to see if we can get a combination of JIT and LTO to work
together to specialize generic code at runtime.

Let's say you have a function f(int x, int y, int z). You want to be
able to specialize it on y at runtime, so that a loop gets unrolled in
the common case where y is small.

1. At build time, create bitcode for the generic implementation of f().
2. At run time, load the generic bitcode into a module (let's call it
the "generic module")
3. At run time, create a new module (let's call it the "bind module")
that only does the following things:
a. declares a global variable bind_y, and initialize it to the value 3
b. declares a wrapper function f_wrapper(int x, int z), and all the
function does is call f(x, bind_y, z)
4. Link the generic module and the bind module together (let's call
the result the "linked module")
5. Optimize the linked module

After sorting out a few details about symbols and inlining, what will
happen is that the generic f() will be inlined into f_wrapper, and it
will see that bind_y is a constant, and then unroll a "for" loop over
y.

I experimented a bit before and it works for basic cases, but I'm not
sure if it's as good as your hand-generated LLVM.

If we can make this work, it would be a big win for
readability/maintainability. The hand-generated LLVM is limited to the
bind module, which is very simple, and doesn't need to be changed when
the implementation of f() changes.

Regards,
Jeff Davis

#40Andres Freund
andres@anarazel.de
In reply to: Jeff Davis (#39)
Re: JIT compiling with LLVM v9.0

Hi,

On 2018-01-26 18:26:03 -0800, Jeff Davis wrote:

On Wed, Jan 24, 2018 at 11:02 PM, Andres Freund <andres@anarazel.de> wrote:

Not entirely sure what you mean. You mean why I don't inline
slot_getsomeattrs() etc and instead generate code manually? The reason
is that the generated code is a *lot* smarter due to knowing the
specific tupledesc.

I would like to see if we can get a combination of JIT and LTO to work
together to specialize generic code at runtime.

Well, LTO can't quite work. It relies on being able to mark code in
modules linked together as externally visible - and cleary we can't do
that for a running postgres binary. At least in all incarnations I'm
aware of. But that's why the tree I posted supports inlining of code.

Let's say you have a function f(int x, int y, int z). You want to be
able to specialize it on y at runtime, so that a loop gets unrolled in
the common case where y is small.

1. At build time, create bitcode for the generic implementation of f().
2. At run time, load the generic bitcode into a module (let's call it
the "generic module")
3. At run time, create a new module (let's call it the "bind module")
that only does the following things:
a. declares a global variable bind_y, and initialize it to the value 3
b. declares a wrapper function f_wrapper(int x, int z), and all the
function does is call f(x, bind_y, z)
4. Link the generic module and the bind module together (let's call
the result the "linked module")
5. Optimize the linked module

Afaict that's effectively what I've already implemented. We could export
more input as constants to the generated program, but other than that...

Whenever any extern functions are referenced, and jit_inlining=1, then
the code will see whether the called external code is available as jit
bitcode. Based on a simple instruction based cost limit that function
will get inlined (unless it references file local non-constant static
variables and such).

Now the JITed expressions tree currently makes it hard for LLVM to
recognize some constant input as constant, but what's largely needed for
that to be better is some improvements in where temporary values are
stored (should be in alloca's rather than local memory, so mem2reg can
do its thing). It's a TODO... Right now LLVM will figure out constant
inputs to non-strict functions, but not strict ones, but after fixing
some of what I've mentioned previously it works pretty universally.

Have I misunderstood adn there's some significant functional difference?

I experimented a bit before and it works for basic cases, but I'm not
sure if it's as good as your hand-generated LLVM.

For deforming it doesn't even remotely get as good in my experiments.

If we can make this work, it would be a big win for
readability/maintainability. The hand-generated LLVM is limited to the
bind module, which is very simple, and doesn't need to be changed when
the implementation of f() changes.

Right. Thats why I think we definitely want that for the large majority
of referenced functionality.

Greetings,

Andres Freund

#41Jeff Davis
pgsql@j-davis.com
In reply to: Andres Freund (#40)
Re: JIT compiling with LLVM v9.0

Hi,

On Fri, Jan 26, 2018 at 6:40 PM, Andres Freund <andres@anarazel.de> wrote:

I would like to see if we can get a combination of JIT and LTO to work
together to specialize generic code at runtime.

Well, LTO can't quite work. It relies on being able to mark code in
modules linked together as externally visible - and cleary we can't do
that for a running postgres binary. At least in all incarnations I'm
aware of. But that's why the tree I posted supports inlining of code.

I meant a more narrow use of LTO: since we are doing linking in step
#4 and optimization in step #5, it's optimizing the code after
linking, which is a kind of LTO (though perhaps I'm misusing the
term?).

The version of LLVM that I tried this against had a linker option
called "InternalizeLinkedSymbols" that would prevent the visibility
problem you mention (assuming I understand you correctly). That option
is no longer there so I will have to figure out how to do it with the
current LLVM API.

Afaict that's effectively what I've already implemented. We could export
more input as constants to the generated program, but other than that...

I brought this up in the context of slot_compile_deform(). In your
patch, you have code like:

+               if (!att->attnotnull)
+               {
...
+                       v_nullbyte = LLVMBuildLoad(
+                               builder,
+                               LLVMBuildGEP(builder, v_bits,
+                                                        &v_nullbyteno, 1, ""),
+                               "attnullbyte");
+
+                       v_nullbit = LLVMBuildICmp(
+                               builder,
+                               LLVMIntEQ,
+                               LLVMBuildAnd(builder, v_nullbyte,
v_nullbytemask, ""),
+                               LLVMConstInt(LLVMInt8Type(), 0, false),
+                               "attisnull");
...

So it looks like you are reimplementing the generic code, but with
conditional code gen. If the generic code changes, someone will need
to read, understand, and change this code, too, right?

With my approach, then it would initially do *un*conditional code gen,
and be less efficient and less specialized than the code generated by
your current patch. But then it would link in the constant tupledesc,
and optimize, and the optimizer will realize that they are constants
(hopefully) and then cut out a lot of the dead code and specialize it
to the given tupledesc.

This places a lot of faith in the optimizer and I realize it may not
happen as nicely with real code as it did with my earlier experiments.
Maybe you already tried and you are saying that's a dead end? I'll
give it a shot, though.

Now the JITed expressions tree currently makes it hard for LLVM to
recognize some constant input as constant, but what's largely needed for
that to be better is some improvements in where temporary values are
stored (should be in alloca's rather than local memory, so mem2reg can
do its thing). It's a TODO... Right now LLVM will figure out constant
inputs to non-strict functions, but not strict ones, but after fixing
some of what I've mentioned previously it works pretty universally.

Have I misunderstood adn there's some significant functional difference?

I'll try to explain with code, and then we can know for sure ;-)

Sorry for the ambiguity, I'm probably misusing a few terms.

I experimented a bit before and it works for basic cases, but I'm not
sure if it's as good as your hand-generated LLVM.

For deforming it doesn't even remotely get as good in my experiments.

I'd like some more information here -- what didn't work? It didn't
recognize constants? Or did recognize them, but didn't optimize as
well as you did by hand?

Regards,
Jeff Davis

#42Andres Freund
andres@anarazel.de
In reply to: Jeff Davis (#41)
Re: JIT compiling with LLVM v9.0

Hi,

On 2018-01-26 22:52:35 -0800, Jeff Davis wrote:

The version of LLVM that I tried this against had a linker option
called "InternalizeLinkedSymbols" that would prevent the visibility
problem you mention (assuming I understand you correctly).

I don't think they're fully solvable - you can't really internalize a
reference to a mutable static variable in another translation
unit. Unless you modify that translation unit, which doesn't work when
postgres running.

That option is no longer there so I will have to figure out how to do
it with the current LLVM API.

Look at the llvmjit_wrap.c code invoking FunctionImporter - that pretty
much does that. I'll push a cleaned up version of that code sometime
this weekend (it'll then live in llvmjit_inline.cpp).

Afaict that's effectively what I've already implemented. We could export
more input as constants to the generated program, but other than that...

I brought this up in the context of slot_compile_deform(). In your
patch, you have code like:

+               if (!att->attnotnull)
+               {
...
+                       v_nullbyte = LLVMBuildLoad(
+                               builder,
+                               LLVMBuildGEP(builder, v_bits,
+                                                        &v_nullbyteno, 1, ""),
+                               "attnullbyte");
+
+                       v_nullbit = LLVMBuildICmp(
+                               builder,
+                               LLVMIntEQ,
+                               LLVMBuildAnd(builder, v_nullbyte,
v_nullbytemask, ""),
+                               LLVMConstInt(LLVMInt8Type(), 0, false),
+                               "attisnull");
...

So it looks like you are reimplementing the generic code, but with
conditional code gen. If the generic code changes, someone will need
to read, understand, and change this code, too, right?

Right. Not that that's code that has changed that much...

With my approach, then it would initially do *un*conditional code gen,
and be less efficient and less specialized than the code generated by
your current patch. But then it would link in the constant tupledesc,
and optimize, and the optimizer will realize that they are constants
(hopefully) and then cut out a lot of the dead code and specialize it
to the given tupledesc.

Right.

This places a lot of faith in the optimizer and I realize it may not
happen as nicely with real code as it did with my earlier experiments.
Maybe you already tried and you are saying that's a dead end? I'll
give it a shot, though.

I did that, yes. There's two major downsides:

a) The code isn't as efficient as the handrolled code. The handrolled
code e.g. can take into account that it doesn't need to access the
NULL bitmap for a NOT NULL column and we don't need to check the
tuple's number of attributes if there's a following NOT NULL
attribute. Those safe a good number of cycles.

b) The optimizations to take advantage of the constants and make the
code faster with the constant tupledesc is fairly slow (you pretty
much need at least an -O2 equivalent), whereas the handrolled tuple
deforming is faster than the slot_getsomeattrs with just a single,
pretty cheap, mem2reg pass. We're talking about ~1ms vs 70-100ms in
a lot of cases. The optimizer often will not actually unroll the
loop with many attributes despite that being beneficial.

I think in most cases using the approach you advocate makes sense, to
avoid duplication, but tuple deforming is such a major bottleneck that I
think it's clearly worth doing it manually. Being able to use llvm with
just a always-inline and a mem2reg pass makes it so much more widely
applicable than doing the full inlining and optimization work.

I experimented a bit before and it works for basic cases, but I'm not
sure if it's as good as your hand-generated LLVM.

For deforming it doesn't even remotely get as good in my experiments.

I'd like some more information here -- what didn't work? It didn't
recognize constants? Or did recognize them, but didn't optimize as
well as you did by hand?

It didn't optimize as well as I did by hand, without significantly
complicating (and slowing) the originating the code. It sometimes
decided not to unroll the loop, and it takes a *lot* longer than the
direct emission of the code.

I'm hoping to work on making more of the executor JITed, and there I do
think it's largely going to be what you're proposing, due to the sheer
mass of code.

Greetings,

Andres Freund

#43Jeff Davis
pgsql@j-davis.com
In reply to: Andres Freund (#42)
Re: JIT compiling with LLVM v9.0

On Sat, Jan 27, 2018 at 1:20 PM, Andres Freund <andres@anarazel.de> wrote:

b) The optimizations to take advantage of the constants and make the
code faster with the constant tupledesc is fairly slow (you pretty
much need at least an -O2 equivalent), whereas the handrolled tuple
deforming is faster than the slot_getsomeattrs with just a single,
pretty cheap, mem2reg pass. We're talking about ~1ms vs 70-100ms in
a lot of cases. The optimizer often will not actually unroll the
loop with many attributes despite that being beneficial.

This seems like the major point. We would have to customize the
optimization passes a lot and/or choose carefully which ones we apply.

I think in most cases using the approach you advocate makes sense, to
avoid duplication, but tuple deforming is such a major bottleneck that I
think it's clearly worth doing it manually. Being able to use llvm with
just a always-inline and a mem2reg pass makes it so much more widely
applicable than doing the full inlining and optimization work.

OK.

On another topic, I'm trying to find a way we could break this patch
into smaller pieces. For instance, if we concentrate on tuple
deforming, maybe it would be committable in time for v11?

I see that you added some optimizations to the existing generic code.
Do those offer a measurable improvement, and if so, can you commit
those first to make the JIT stuff more readable?

Also, I'm sure you considered this, but I'd like to ask if we can try
harder make the JIT itself happen in an extension. It has some pretty
huge benefits:
* The JIT code is likely to go through a lot of changes, and it
would be nice if it wasn't tied to a yearly release cycle.
* Would mean postgres itself isn't dependent on a huge library like
llvm, which just seems like a good idea from a packaging standpoint.
* May give GCC or something else a chance to compete with it's own JIT.
* It may make it easier to get something in v11.

It appears reasonable to make the slot deforming and expression
evaluator parts an extension. execExpr.h only exports a couple new
functions; heaptuple.c has a lot of changes but they seem like they
could be separated (unless I'm missing something).

The biggest problem is that the inlining would be much harder to
separate out, because you are building the .bc files at build time. I
really like the idea of inlining, but it doesn't necessarily need to
be in the first commit.

Regards,
Jeff Davis

#44Andres Freund
andres@anarazel.de
In reply to: Jeff Davis (#43)
Re: JIT compiling with LLVM v9.0

Hi,

On 2018-01-27 16:56:17 -0800, Jeff Davis wrote:

On another topic, I'm trying to find a way we could break this patch
into smaller pieces. For instance, if we concentrate on tuple
deforming, maybe it would be committable in time for v11?

Yea, I'd planned and started to do so. I actually hope we can get more
committed than just the tuple deforming code - for one it currently
integrates directly with the expression evaluation code, and my
experience with trying to do so outside of it have not gone well.

I see that you added some optimizations to the existing generic code.
Do those offer a measurable improvement, and if so, can you commit
those first to make the JIT stuff more readable?

I think basically the later a patch currently is in the series the less
important it is.

I've already committed a lot of preparatory patches (like that aggs now
use the expression engine), and I plan to continue doing so.

Also, I'm sure you considered this, but I'd like to ask if we can try
harder make the JIT itself happen in an extension. It has some pretty
huge benefits:

I'm very strongly against this. To the point that I'll not pursue JITing
further if that becomes a requirement.

I could be persuaded to put it into a shared library instead of the main
binary itself, but I think developing it outside of core is entirely
infeasible because quite freuquently both non-JITed code and JITed code
need adjustments. That'd solve your concern about

* Would mean postgres itself isn't dependent on a huge library like
llvm, which just seems like a good idea from a packaging standpoint.

to some degree.

I think it's a fools errand to try to keep in sync with core changes on
the expression evaluation and struct definition side of things. There's
planner integration, error handling integration and similar related
things too, all of which require core changes. Therefore I don't think
there's a reasonable chance of success of doing this outside of core
postgres.

It appears reasonable to make the slot deforming and expression
evaluator parts an extension. execExpr.h only exports a couple new
functions; heaptuple.c has a lot of changes but they seem like they
could be separated (unless I'm missing something).

The heaptuple.c stuff could largely be dropped, that was more an effort
to level the plainfield a bit to make the comparison fairer. I kinda
wondered about putting the JIT code in a heaptuple_jit.c file instead of
heaptuple.c.

The biggest problem is that the inlining would be much harder to
separate out, because you are building the .bc files at build time. I
really like the idea of inlining, but it doesn't necessarily need to
be in the first commit.

Well, but doing this outside of core would pretty much prohibit doing so
forever, no? Getting the inlining design right has influenced several
other parts of the code. I think it's right that the inlining doesn't
necessarily have to be part of the initial set of commits (and I plan to
separate it out in the next revision), but I do think it has to be
written in a reasonably ready form at the time of commit.

Greetings,

Andres Freund

#45Jeff Davis
pgsql@j-davis.com
In reply to: Andres Freund (#44)
Re: JIT compiling with LLVM v9.0

On Sat, Jan 27, 2018 at 5:15 PM, Andres Freund <andres@anarazel.de> wrote:

Also, I'm sure you considered this, but I'd like to ask if we can try
harder make the JIT itself happen in an extension. It has some pretty
huge benefits:

I'm very strongly against this. To the point that I'll not pursue JITing
further if that becomes a requirement.

I would like to see this feature succeed and I'm not making any
specific demands.

infeasible because quite freuquently both non-JITed code and JITed code
need adjustments. That'd solve your concern about

Can you explain further?

I think it's a fools errand to try to keep in sync with core changes on
the expression evaluation and struct definition side of things. There's
planner integration, error handling integration and similar related
things too, all of which require core changes. Therefore I don't think
there's a reasonable chance of success of doing this outside of core
postgres.

I wasn't suggesting the entire patch be done outside of core. Core
will certainly need to know about JIT compilation, but I am not
convinced that it needs to know about the details of LLVM. All the
references to the LLVM library itself are contained in a few files, so
you've already got it well organized. What's stopping us from putting
that code into a "jit provider" extension that implements the proper
interfaces?

Well, but doing this outside of core would pretty much prohibit doing so
forever, no?

First of all, building .bc files at build time is much less invasive
than linking to the LLVM library. Any version of clang will produce
bitcode that can be read by any LLVM library or tool later (more or
less).

Second, we could change our minds later. Mark any extension APIs as
experimental, and decide we want to move LLVM into postgres whenever
it is needed.

Third, there's lots of cool stuff we can do here:
* put the source in the catalog
* an extension could have its own catalog and build the source into
bitcode and cache it there
* the source for functions would flow to replicas, etc.
* security-conscious environments might even choose to run some of
the C code in a safe C interpreter rather than machine code

So I really don't see this as permanently closing off our options.

Regards,
Jeff Davis

#46Pierre Ducroquet
p.psql@pinaraf.info
In reply to: Andres Freund (#32)
Re: JIT compiling with LLVM v9.0

On Thursday, January 25, 2018 8:12:42 PM CET Andres Freund wrote:

Hi,

On 2018-01-25 10:00:14 +0100, Pierre Ducroquet wrote:

I don't know when this would be released,

August-October range.

but the minimal supported LLVM
version will have a strong influence on the availability of that feature.
If today this JIT compiling was released with only LLVM 5/6 support, it
would be unusable for most Debian users (llvm-5 is only available in
sid). Even llvm 4 is not available in latest stable.
I'm already trying to build with llvm-4 and I'm going to try further with
llvm 3.9 (Debian Stretch doesn't have a more recent than this one, and I
won't have something better to play with my data), I'll keep you
informed. For sport, I may also try llvm 3.5 (for Debian Jessie).

I don't think it's unreasonable to not support super old llvm
versions. This is a complex feature, and will take some time to
mature. Supporting too many LLVM versions at the outset will have some
cost. Versions before 3.8 would require supporting mcjit rather than
orc, and I don't think that'd be worth doing. I think 3.9 might be a
reasonable baseline...

Greetings,

Andres Freund

Hi

I have fixed the build issues with LLVM 3.9 and 4.0. The LLVM documentation is
really lacking when it comes to porting from version x to x+1.
The only really missing part I found is that in 3.9, GlobalValueSummary has no
flag showing if it's not EligibleToImport. I am not sure about the
consequences.
I'm still fixing some runtime issues so I will not bother you with the patch
right now.
BTW, the makefile for src/backend/lib does not remove the llvmjit_types.bc
file when cleaning, and doesn't seem to install in the right folder.

Regards

Pierre

#47Pierre Ducroquet
p.psql@pinaraf.info
In reply to: Andres Freund (#29)
Re: JIT compiling with LLVM v9.0

On Thursday, January 25, 2018 8:02:54 AM CET Andres Freund wrote:

Hi!

On 2018-01-24 22:51:36 -0800, Jeff Davis wrote:

Can we store the bitcode in pg_proc, simplifying deployment and
allowing extensions to travel over replication?

Yes, we could. You'd need to be a bit careful that all the machines have
similar-ish cpu generations or compile with defensive settings, but that
seems okay.

Hi

Doing this would 'bind' the database to the LLVM release used. LLVM can, as
far as I know, generate bitcode only for the current version, and will only be
able to read bitcode from previous versions. So you can't have, for instance a
master server with LLVM 5 and a standby server with LLVM 4.
So maybe PostgreSQL would have to expose what LLVM version is currently used ?
Or a major PostgreSQL release could accept only one major LLVM release, as was
suggested in another thread ?

Pierre

#48Andres Freund
andres@anarazel.de
In reply to: Jeff Davis (#45)
Re: JIT compiling with LLVM v9.0

Hi,

On 2018-01-27 22:06:59 -0800, Jeff Davis wrote:

infeasible because quite freuquently both non-JITed code and JITed code
need adjustments. That'd solve your concern about

Can you explain further?

There's already a *lot* of integration points in the patchseries. Error
handling needs to happen in parts of code we do not want to make
extensible, the defintion of expression steps has to exactly match, the
core code needs to emit the right types for syncing, the core code needs
to define the right FIELDNO accessors, there needs to be planner
integrations. Many of those aren't doable with even remotely the same
effort, both initial and continual, from non-core code....

I think those alone make it bad, but there'll be more. Short-Medium term
expression evaluation needs to evolve further to make JITing cachable:
http://archives.postgresql.org/message-id/20180124203616.3gx4vm45hpoijpw3%40alap3.anarazel.de
which again definitely has to be happen in core and will require
corresponding changes on the JIT side very step. Then we'll need to
introduce something like plancache (or something similar?) support for
JITing to reuse JITed functions.

Then there's also a significant difference in how large the adoption's
going to be, and how all the core code that'd need to be added is
supposed to be testable without the JIT emitting side in core.

I think it's a fools errand to try to keep in sync with core changes on
the expression evaluation and struct definition side of things. There's
planner integration, error handling integration and similar related
things too, all of which require core changes. Therefore I don't think
there's a reasonable chance of success of doing this outside of core
postgres.

I wasn't suggesting the entire patch be done outside of core. Core
will certainly need to know about JIT compilation, but I am not
convinced that it needs to know about the details of LLVM. All the
references to the LLVM library itself are contained in a few files, so
you've already got it well organized. What's stopping us from putting
that code into a "jit provider" extension that implements the proper
interfaces?

The above hopefully answers that?

What we could do, imo somewhat realistically, is to put most of the
provider into a dynamically loaded shared library that lives in core
(similar to how we build the pgoutput output plugin shared library as
part of core). But that still would end up hard coding things like LLVM
specific error handling etc, which we currently do *NOT* want to be
extensible.

Well, but doing this outside of core would pretty much prohibit doing so
forever, no?

First of all, building .bc files at build time is much less invasive
than linking to the LLVM library.

Could you expand on that, I don't understand why that'd be the case?

Any version of clang will produce bitcode that can be read by any LLVM
library or tool later (more or less).

Well, forward portable, not backward portable.

Second, we could change our minds later. Mark any extension APIs as
experimental, and decide we want to move LLVM into postgres whenever
it is needed.

Third, there's lots of cool stuff we can do here:
* put the source in the catalog
* an extension could have its own catalog and build the source into
bitcode and cache it there
* the source for functions would flow to replicas, etc.
* security-conscious environments might even choose to run some of
the C code in a safe C interpreter rather than machine code

I agree, but what does that have to do with the llvmjit stuff being an
extension or not?

Greetings,

Andres Freund

#49Andres Freund
andres@anarazel.de
In reply to: Pierre Ducroquet (#46)
Re: JIT compiling with LLVM v9.0

Hi,

On 2018-01-28 23:02:56 +0100, Pierre Ducroquet wrote:

I have fixed the build issues with LLVM 3.9 and 4.0. The LLVM documentation is
really lacking when it comes to porting from version x to x+1.
The only really missing part I found is that in 3.9, GlobalValueSummary has no
flag showing if it's not EligibleToImport. I am not sure about the
consequences.

I think that'd not be too bad, it'd just lead to some small increase in
overhead as more modules would be loaded.

BTW, the makefile for src/backend/lib does not remove the llvmjit_types.bc
file when cleaning, and doesn't seem to install in the right folder.

Hm, both seems to be right here? Note that the llvmjit_types.bc file
should *not* go into the bitcode/ directory, as it's about syncing types
not inlining. I've added a comment to that effect.

Greetings,

Andres Freund

#50Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#22)
Re: JIT compiling with LLVM v9.1

Hi,

On 2018-01-23 23:20:38 -0800, Andres Freund wrote:

== Code ==

As the patchset is large (500kb) and I'm still quickly evolving it, I do
not yet want to attach it. The git tree is at
https://git.postgresql.org/git/users/andresfreund/postgres.git
in the jit branch
https://git.postgresql.org/gitweb/?p=users/andresfreund/postgres.git;a=shortlog;h=refs/heads/jit

I've just pushed an updated and rebased version of the tree:
- Split the large "jit infrastructure" commits into a number of smaller
commits
- Split the C++ file
- Dropped some of the performance stuff done to heaptuple.c - that was
mostly to make performance comparisons a bit more interesting, but
doesn't seem important enough to deal with.
- Added a commit renaming datetime.h symbols so they don't conflict with
LLVM variables anymore, removing ugly #undef PM/#define PM dance
around includes. Will post separately.
- Reduced the number of pointer constants in the generated LLVM IR, by
doing more getelementptr accesses (stem from before the time types
were automatically synced)
- Increased number of comments a bit

There's a jit-before-rebase-2018-01-29 tag, for the state of the tree
before the rebase.

Regards,

Andres

#51Pierre Ducroquet
pierre.ducroquet@people-doc.com
In reply to: Andres Freund (#49)
Re: JIT compiling with LLVM v9.0

On Monday, January 29, 2018 10:46:13 AM CET Andres Freund wrote:

Hi,

On 2018-01-28 23:02:56 +0100, Pierre Ducroquet wrote:

I have fixed the build issues with LLVM 3.9 and 4.0. The LLVM
documentation is really lacking when it comes to porting from version x
to x+1.
The only really missing part I found is that in 3.9, GlobalValueSummary
has no flag showing if it's not EligibleToImport. I am not sure about the
consequences.

I think that'd not be too bad, it'd just lead to some small increase in
overhead as more modules would be loaded.

BTW, the makefile for src/backend/lib does not remove the llvmjit_types.bc
file when cleaning, and doesn't seem to install in the right folder.

Hm, both seems to be right here? Note that the llvmjit_types.bc file
should *not* go into the bitcode/ directory, as it's about syncing types
not inlining. I've added a comment to that effect.

The file was installed in lib/ while the code expected it in lib/postgresql.
So there was something wrong here.
And deleting the file when cleaning is needed if at configure another llvm
version is used. The file must be generated with a clang release that is not
more recent than the llvm version linked to postgresql. Otherwise, the bitcode
generated is not accepted by llvm.

Regards

Pierre

#52Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Andres Freund (#38)
1 attachment(s)
Re: JIT compiling with LLVM v9.0

On 26.01.2018 22:38, Andres Freund wrote:

And without it perf is not able to unwind stack trace for generated

code.

You can work around that by using --call-graph lbr with a sufficiently
new perf. That'll not know function names et al, but at least the parent
will be associated correctly.

With --call-graph lbr result is ... slightly different (see attached
profile) but still there is "unknown" bar.

But you are compiling code using LLVMOrcAddEagerlyCompiledIR
and I find no way to pass no-omit-frame pointer option here.

It shouldn't be too hard to open code support for it, encapsulated in a
function:
// Set function attribute "no-frame-pointer-elim" based on
// NoFramePointerElim.
for (auto &F : *Mod) {
auto Attrs = F.getAttributes();
StringRef Value(options.NoFramePointerElim ? "true" : "false");
Attrs = Attrs.addAttribute(F.getContext(), AttributeList::FunctionIndex,
"no-frame-pointer-elim", Value);
F.setAttributes(Attrs);
}
that's all that option did for mcjit.

I have implemented the following function:

void
llvm_no_frame_pointer_elimination(LLVMModuleRef mod)
{
    llvm::Module *module = llvm::unwrap(mod);
    for (auto &F : *module) {
        auto Attrs = F.getAttributes();
        Attrs = Attrs.addAttribute(F.getContext(),
llvm::AttributeList::FunctionIndex,
                                   "no-frame-pointer-elim", "true");
        F.setAttributes(Attrs);
    }
}

and call it before LLVMOrcAddEagerlyCompiledIR in llvm_compile_module:

        llvm_no_frame_pointer_elimination(context->module);
        smod = LLVMOrcMakeSharedModule(context->module);

        if (LLVMOrcAddEagerlyCompiledIR(compile_orc, &orc_handle, smod,
                                        llvm_resolve_symbol, NULL))
        {
            elog(ERROR, "failed to jit module");
        }

... but it has no effect: produced profile is the same (with
--call-graph dwarf).
May be you can point me on my mistake...

Actually I am trying to find answer for the question why your version of
JIT provides ~2 times speedup at Q1, while ISPRAS version
(https://www.pgcon.org/2017/schedule/attachments/467_PGCon%202017-05-26%2015-00%20ISPRAS%20Dynamic%20Compilation%20of%20SQL%20Queries%20in%20PostgreSQL%20Using%20LLVM%20JIT.pdf)
speedup Q1 is 5.5x times.
May be it is because them are using double type to calculate aggregates
while as far as I understand you are using standard Postgres aggregate
functions?
Or may be because ISPRAS version is not checking for NULL values...

--
Konstantin Knizhnik
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

Attachments:

q1.svgimage/svg+xml; name=q1.svgDownload
#53Andres Freund
andres@anarazel.de
In reply to: Konstantin Knizhnik (#52)
Re: JIT compiling with LLVM v9.0

Hi,

On 2018-01-29 15:45:56 +0300, Konstantin Knizhnik wrote:

On 26.01.2018 22:38, Andres Freund wrote:

And without it perf is not able to unwind stack trace for generated

code.

You can work around that by using --call-graph lbr with a sufficiently
new perf. That'll not know function names et al, but at least the parent
will be associated correctly.

With --call-graph lbr result is ... slightly different (see attached
profile) but still there is "unknown" bar.

Right. All that allows is to attribute the cost below the parent in the
perf report --children case. For it to be attributed to proper symbols
you need my llvm patch to support pef.

Actually I am trying to find answer for the question why your version of JIT
provides ~2 times speedup at Q1, while ISPRAS version (https://www.pgcon.org/2017/schedule/attachments/467_PGCon%202017-05-26%2015-00%20ISPRAS%20Dynamic%20Compilation%20of%20SQL%20Queries%20in%20PostgreSQL%20Using%20LLVM%20JIT.pdf)
speedup Q1 is 5.5x times.
May be it is because them are using double type to calculate aggregates
while as far as I understand you are using standard Postgres aggregate
functions?
Or may be because ISPRAS version is not checking for NULL values...

All of those together, yes. And added that I'm aiming to work
incrementally towards core inclusions, rather than getting the best
results. There's a *lot* that can be done to improve the generated code
- after e.g. hacking together an improvement to the argument passing (by
allocating isnull / nargs / arg[], argnull[] as a separate on-stack from
FunctionCallInfoData), I get another 1.8x. Eliminating redundant float
overflow checks gives another 1.2x. And so on.

Greetings,

Andres Freund

#54Jeff Davis
pgsql@j-davis.com
In reply to: Andres Freund (#48)
Re: JIT compiling with LLVM v9.0

On Mon, Jan 29, 2018 at 1:36 AM, Andres Freund <andres@anarazel.de> wrote:

There's already a *lot* of integration points in the patchseries. Error
handling needs to happen in parts of code we do not want to make
extensible, the defintion of expression steps has to exactly match, the
core code needs to emit the right types for syncing, the core code needs
to define the right FIELDNO accessors, there needs to be planner
integrations. Many of those aren't doable with even remotely the same
effort, both initial and continual, from non-core code....

OK. How about this: are you open to changes that move us in the
direction of extensibility later? (By this I do *not* mean imposing a
bunch of requirements on you... either small changes to your patches
or something part of another commit.) Or are you determined that this
always should be a part of core?

I don't want to stand in your way, but I am also hesitant to dive head
first into LLVM and not look back. Postgres has always been lean, fast
building, and with few dependencies. Who knows what LLVM will do in
the future and how that will affect postgres? Especially when, on day
one, we already know that it causes a few annoyances?

In other words, are you "strongly against [extensbility being a
requirement for the first commit]" or "strongly against [extensible
JIT]"?

Well, but doing this outside of core would pretty much prohibit doing so
forever, no?

First of all, building .bc files at build time is much less invasive
than linking to the LLVM library.

Could you expand on that, I don't understand why that'd be the case?

Building the .bc files at build time depends on LLVM, but is not very
version-dependent and has no impact on the resulting binary. That's
less invasive than a dependency on a library with an unstable API that
doesn't entirely work with our error reporting facility.

Third, there's lots of cool stuff we can do here:
* put the source in the catalog
* an extension could have its own catalog and build the source into
bitcode and cache it there
* the source for functions would flow to replicas, etc.
* security-conscious environments might even choose to run some of
the C code in a safe C interpreter rather than machine code

I agree, but what does that have to do with the llvmjit stuff being an
extension or not?

If the source for functions is in the catalog, we could build the
bitcode at runtime and still do the inlining. We wouldn't need to do
anything at build time. (Again, this would be "cool stuff for the
future", I am not asking you for it now.)

Regards,
Jeff Davis

#55Andres Freund
andres@anarazel.de
In reply to: Jeff Davis (#54)
Re: JIT compiling with LLVM v9.0

Hi,

On 2018-01-29 10:28:18 -0800, Jeff Davis wrote:

OK. How about this: are you open to changes that move us in the
direction of extensibility later? (By this I do *not* mean imposing a
bunch of requirements on you... either small changes to your patches
or something part of another commit.)

I'm good with that.

Or are you determined that this always should be a part of core?

I do think JIT compilation should be in core, yes. And after quite some
looking around that currently means either using LLVM or building our
own from scratch, and the latter doesn't seem attractive. But that
doesn't mean there *also* can be extensibility. If somebody wants to
experiment with a more advanced version of JIT compilation, develop a
gcc backed version (which can't be in core due to licensing), ... - I'm
happy to provide hooks that only require a reasonable effort and don't
affect the overall stability of the system (i.e. no callback from
PostgresMain()'s sigsetjmp() block).

I don't want to stand in your way, but I am also hesitant to dive head
first into LLVM and not look back. Postgres has always been lean, fast
building, and with few dependencies.

It's an optional dependency, and it doesn't increase build time that
much... If we were to move the llvm interfacing code to a .so, there'd
not even be a packaging issue, you can just package that .so separately
and get errors if somebody tries to enable LLVM without that .so being
installed.

In other words, are you "strongly against [extensbility being a
requirement for the first commit]" or "strongly against [extensible
JIT]"?

I'm strongly against there not being an in-core JIT. I'm not at all
against adding APIs that allow to do different JIT implementations out
of core.

If the source for functions is in the catalog, we could build the
bitcode at runtime and still do the inlining. We wouldn't need to do
anything at build time. (Again, this would be "cool stuff for the
future", I am not asking you for it now.)

Well, the source would require an actual compiler around. And the
inlining *just* for the function code itself isn't actually that
interesting, you e.g. want to also be able to

Greetings,

Andres Freund

#56Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Andres Freund (#22)
1 attachment(s)
Re: JIT compiling with LLVM v9.0

On 01/24/2018 08:20 AM, Andres Freund wrote:

Hi,

I've spent the last weeks working on my LLVM compilation patchset. In
the course of that I *heavily* revised it. While still a good bit away
from committable, it's IMO definitely not a prototype anymore.

There's too many small changes, so I'm only going to list the major
things. A good bit of that is new. The actual LLVM IR emissions itself
hasn't changed that drastically. Since I've not described them in
detail before I'll describe from scratch in a few cases, even if things
haven't fully changed.

Hi, I wanted to look at this, but my attempts to build the jit branch
fail with some compile-time warnings (uninitialized variables) and
errors (unknown types, incorrect number of arguments). See the file
attached.

I wonder if I'm doing something wrong, or if there's something wrong
with my environment. I do have this:

$ clang -v
clang version 5.0.0 (trunk 299717)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/local/bin
Selected GCC installation: /usr/lib/gcc/x86_64-pc-linux-gnu/6.4.0
Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Selected multilib: .;@m64

regards

--
Tomas Vondra http://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Attachments:

make-failure.txttext/plain; charset=UTF-8; name=make-failure.txtDownload
#57Andres Freund
andres@anarazel.de
In reply to: Tomas Vondra (#56)
Re: JIT compiling with LLVM v9.0

Hi,

On 2018-01-29 22:51:38 +0100, Tomas Vondra wrote:

Hi, I wanted to look at this, but my attempts to build the jit branch
fail with some compile-time warnings (uninitialized variables) and
errors (unknown types, incorrect number of arguments). See the file
attached.

Which git hash are you building? What llvm version is this building
against? If you didn't specify LLVM_CONFIG=... what does llvm-config
--version return?

Greetings,

Andres Freund

#58Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Andres Freund (#57)
Re: JIT compiling with LLVM v9.0

On 01/29/2018 10:57 PM, Andres Freund wrote:

Hi,

On 2018-01-29 22:51:38 +0100, Tomas Vondra wrote:

Hi, I wanted to look at this, but my attempts to build the jit branch
fail with some compile-time warnings (uninitialized variables) and
errors (unknown types, incorrect number of arguments). See the file
attached.

Which git hash are you building? What llvm version is this building
against? If you didn't specify LLVM_CONFIG=... what does llvm-config
--version return?

I'm building against fdc6c7a6dddbd6df63717f2375637660bcd00fc6 (current
HEAD in the jit branch, AFAICS).

I'm building like this:

$ ./configure --enable-debug CFLAGS="-fno-omit-frame-pointer -O2" \
--with-llvm --prefix=/home/postgres/pg-llvm

$ make -s -j4 install

and llvm-config --version says this:

$ llvm-config --version
5.0.0svn

regards

--
Tomas Vondra http://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#59Andres Freund
andres@anarazel.de
In reply to: Tomas Vondra (#58)
Re: JIT compiling with LLVM v9.0

On 2018-01-29 23:01:14 +0100, Tomas Vondra wrote:

On 01/29/2018 10:57 PM, Andres Freund wrote:

Hi,

On 2018-01-29 22:51:38 +0100, Tomas Vondra wrote:

Hi, I wanted to look at this, but my attempts to build the jit branch
fail with some compile-time warnings (uninitialized variables) and
errors (unknown types, incorrect number of arguments). See the file
attached.

Which git hash are you building? What llvm version is this building
against? If you didn't specify LLVM_CONFIG=... what does llvm-config
--version return?

I'm building against fdc6c7a6dddbd6df63717f2375637660bcd00fc6 (current
HEAD in the jit branch, AFAICS).

The warnings come from an incomplete patch I probably shouldn't have
pushed (Heavily-WIP: JIT hashing.). They should largely be irrelevant
(although will cause a handful of "ERROR: hm" regression failures),
but I'll definitely pop that commit on the next rebase. If you want you
can just reset --hard to its parent.

That errors are weird however:

llvmjit.c: In function ‘llvm_get_function’:
llvmjit.c:239:45: warning: passing argument 2 of ‘LLVMOrcGetSymbolAddress’ from incompatible pointer type [-Wincompatible-pointer-types]
if (LLVMOrcGetSymbolAddress(llvm_opt0_orc, &addr, mangled))
^
In file included from llvmjit.c:45:0:
/usr/local/include/llvm-c/OrcBindings.h:129:22: note: expected ‘const char *’ but argument is of type ‘LLVMOrcTargetAddress * {aka long unsigned int *}’
LLVMOrcTargetAddress LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef JITStack,
^~~~~~~~~~~~~~~~~~~~~~~
llvmjit.c:239:6: error: too many arguments to function ‘LLVMOrcGetSymbolAddress’
if (LLVMOrcGetSymbolAddress(llvm_opt0_orc, &addr, mangled))
^~~~~~~~~~~~~~~~~~~~~~~
In file included from llvmjit.c:45:0:
/usr/local/include/llvm-c/OrcBindings.h:129:22: note: declared here
LLVMOrcTargetAddress LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef JITStack,
^~~~~~~~~~~~~~~~~~~~~~~
llvmjit.c:243:45: warning: passing argument 2 of ‘LLVMOrcGetSymbolAddress’ from incompatible pointer type [-Wincompatible-pointer-types]
if (LLVMOrcGetSymbolAddress(llvm_opt3_orc, &addr, mangled))
^

I'm building like this:

$ ./configure --enable-debug CFLAGS="-fno-omit-frame-pointer -O2" \
--with-llvm --prefix=/home/postgres/pg-llvm

$ make -s -j4 install

and llvm-config --version says this:

$ llvm-config --version
5.0.0svn

Is thta llvm-config the one in /usr/local/include/ referenced by the
error message above? Or is it possible that llvm-config is from a
different version than the one the compiler picks the headers up from?

could you go to src/backend/lib, rm llvmjit.o, and show the full output
of make llvmjit.o?

I wonder whether the issue is that my configure patch does
-I*|-D*) CPPFLAGS="$CPPFLAGS $pgac_option";;
rather than
-I*|-D*) CPPFLAGS="$pgac_option $CPPFLAGS";;
and that it thus picks up the wrong header first?

Greetings,

Andres Freund

#60Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Andres Freund (#59)
1 attachment(s)
Re: JIT compiling with LLVM v9.0

On 01/29/2018 11:17 PM, Andres Freund wrote:

On 2018-01-29 23:01:14 +0100, Tomas Vondra wrote:

On 01/29/2018 10:57 PM, Andres Freund wrote:

Hi,

On 2018-01-29 22:51:38 +0100, Tomas Vondra wrote:

Hi, I wanted to look at this, but my attempts to build the jit branch
fail with some compile-time warnings (uninitialized variables) and
errors (unknown types, incorrect number of arguments). See the file
attached.

Which git hash are you building? What llvm version is this building
against? If you didn't specify LLVM_CONFIG=... what does llvm-config
--version return?

I'm building against fdc6c7a6dddbd6df63717f2375637660bcd00fc6 (current
HEAD in the jit branch, AFAICS).

The warnings come from an incomplete patch I probably shouldn't have
pushed (Heavily-WIP: JIT hashing.). They should largely be irrelevant
(although will cause a handful of "ERROR: hm" regression failures),
but I'll definitely pop that commit on the next rebase. If you want you
can just reset --hard to its parent.

OK

That errors are weird however:

... ^

I'm building like this:

$ ./configure --enable-debug CFLAGS="-fno-omit-frame-pointer -O2" \
--with-llvm --prefix=/home/postgres/pg-llvm

$ make -s -j4 install

and llvm-config --version says this:

$ llvm-config --version
5.0.0svn

Is thta llvm-config the one in /usr/local/include/ referenced by the
error message above?

I don't see it referenced anywhere, but it comes from here:

$ which llvm-config
/usr/local/bin/llvm-config

Or is it possible that llvm-config is from a different version than
the one the compiler picks the headers up from?

I don't think so. I don't have any other llvm versions installed, AFAICS.

could you go to src/backend/lib, rm llvmjit.o, and show the full output
of make llvmjit.o?

Attached.

I wonder whether the issue is that my configure patch does
-I*|-D*) CPPFLAGS="$CPPFLAGS $pgac_option";;
rather than
-I*|-D*) CPPFLAGS="$pgac_option $CPPFLAGS";;
and that it thus picks up the wrong header first?

I've tried this configure tweak:

   if test -n "$LLVM_CONFIG"; then
     for pgac_option in `$LLVM_CONFIG --cflags`; do
       case $pgac_option in
-        -I*|-D*) CPPFLAGS="$CPPFLAGS $pgac_option";;
+        -I*|-D*) CPPFLAGS="$pgac_option $CPPFLAGS";;
       esac
     done

and that indeed changes the failure to this:

Writing postgres.bki
Writing schemapg.h
Writing postgres.description
Writing postgres.shdescription
llvmjit_error.cpp: In function ‘void llvm_enter_fatal_on_oom()’:
llvmjit_error.cpp:61:3: error: ‘install_bad_alloc_error_handler’ is not
a member of ‘llvm’
llvm::install_bad_alloc_error_handler(fatal_llvm_new_handler);
^~~~
llvmjit_error.cpp: In function ‘void llvm_leave_fatal_on_oom()’:
llvmjit_error.cpp:77:3: error: ‘remove_bad_alloc_error_handler’ is not a
member of ‘llvm’
llvm::remove_bad_alloc_error_handler();
^~~~
llvmjit_error.cpp: In function ‘void llvm_reset_fatal_on_oom()’:
llvmjit_error.cpp:92:3: error: ‘remove_bad_alloc_error_handler’ is not a
member of ‘llvm’
llvm::remove_bad_alloc_error_handler();
^~~~
make[3]: *** [<builtin>: llvmjit_error.o] Error 1
make[2]: *** [common.mk:45: lib-recursive] Error 2
make[2]: *** Waiting for unfinished jobs....
make[1]: *** [Makefile:38: all-backend-recurse] Error 2
make: *** [GNUmakefile:11: all-src-recurse] Error 2

I'm not sure what that means, though ... maybe I really have system
broken in some strange way.

regards

--
Tomas Vondra http://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Attachments:

llvmjit.txttext/plain; charset=UTF-8; name=llvmjit.txtDownload
#61Andres Freund
andres@anarazel.de
In reply to: Tomas Vondra (#60)
Re: JIT compiling with LLVM v9.0

Hi,

On 2018-01-29 23:49:14 +0100, Tomas Vondra wrote:

On 01/29/2018 11:17 PM, Andres Freund wrote:

On 2018-01-29 23:01:14 +0100, Tomas Vondra wrote:

$ llvm-config --version
5.0.0svn

Is thta llvm-config the one in /usr/local/include/ referenced by the
error message above?

I don't see it referenced anywhere, but it comes from here:

$ which llvm-config
/usr/local/bin/llvm-config

Or is it possible that llvm-config is from a different version than
the one the compiler picks the headers up from?

I don't think so. I don't have any other llvm versions installed, AFAICS.

Hm.

could you go to src/backend/lib, rm llvmjit.o, and show the full output
of make llvmjit.o?

Attached.

I wonder whether the issue is that my configure patch does
-I*|-D*) CPPFLAGS="$CPPFLAGS $pgac_option";;
rather than
-I*|-D*) CPPFLAGS="$pgac_option $CPPFLAGS";;
and that it thus picks up the wrong header first?

I've tried this configure tweak:

if test -n "$LLVM_CONFIG"; then
for pgac_option in `$LLVM_CONFIG --cflags`; do
case $pgac_option in
-        -I*|-D*) CPPFLAGS="$CPPFLAGS $pgac_option";;
+        -I*|-D*) CPPFLAGS="$pgac_option $CPPFLAGS";;
esac
done

and that indeed changes the failure to this:

Err, huh? I don't understand how that can change anything if you
actually only have only one version of LLVM installed. Perhaps the
effect was just an ordering related artifact of [parallel] make?
I.e. just a question what failed first?

Writing postgres.bki
Writing schemapg.h
Writing postgres.description
Writing postgres.shdescription
llvmjit_error.cpp: In function ‘void llvm_enter_fatal_on_oom()’:
llvmjit_error.cpp:61:3: error: ‘install_bad_alloc_error_handler’ is not
a member of ‘llvm’
llvm::install_bad_alloc_error_handler(fatal_llvm_new_handler);
^~~~
llvmjit_error.cpp: In function ‘void llvm_leave_fatal_on_oom()’:
llvmjit_error.cpp:77:3: error: ‘remove_bad_alloc_error_handler’ is not a
member of ‘llvm’
llvm::remove_bad_alloc_error_handler();
^~~~
llvmjit_error.cpp: In function ‘void llvm_reset_fatal_on_oom()’:
llvmjit_error.cpp:92:3: error: ‘remove_bad_alloc_error_handler’ is not a
member of ‘llvm’
llvm::remove_bad_alloc_error_handler();
^~~~

It's a bit hard to interpret this without the actual compiler
invocation. But I've just checked both manually by inspecting 5.0 source
and by compiling against 5.0 that that function definition definitely
exists:

andres@alap4:~/src/llvm-5$ git branch
master
* release_50
andres@alap4:~/src/llvm-5$ ack remove_bad_alloc_error_handler
lib/Support/ErrorHandling.cpp
139:void llvm::remove_bad_alloc_error_handler() {

include/llvm/Support/ErrorHandling.h
101:void remove_bad_alloc_error_handler();

So does my system llvm 5:
$ ack remove_bad_alloc_error_handler /usr/include/llvm-5.0/
/usr/include/llvm-5.0/llvm/Support/ErrorHandling.h
101:void remove_bad_alloc_error_handler();

But not in 4.0:
$ ack remove_bad_alloc_error_handler /usr/include/llvm-4.0/

gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -g -fno-omit-frame-pointer -O2 -I../../../src/include -D_GNU_SOURCE -I/usr/local/include -DNDEBUG -DLLVM_BUILD_GLOBAL_ISEL -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -c -o llvmjit.o llvmjit.c
llvmjit.c: In function ‘llvm_get_function’:
llvmjit.c:239:45: warning: passing argument 2 of ‘LLVMOrcGetSymbolAddress’ from incompatible pointer type [-Wincompatible-pointer-types]
if (LLVMOrcGetSymbolAddress(llvm_opt0_orc, &addr, mangled))
^
In file included from llvmjit.c:45:0:
/usr/local/include/llvm-c/OrcBindings.h:129:22: note: expected ‘const char *’ but argument is of type ‘LLVMOrcTargetAddress * {aka long unsigned int *}’
LLVMOrcTargetAddress LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef JITStack,
^~~~~~~~~~~~~~~~~~~~~~~

To me this looks like those headers are from llvm 4, rather than 5:
$ grep -A2 -B3 LLVMOrcGetSymbolAddress ~/src/llvm-4/include/llvm-c/OrcBindings.h
/**
* Get symbol address from JIT instance.
*/
LLVMOrcTargetAddress LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef JITStack,
const char *SymbolName);

$ grep -A3 -B3 LLVMOrcGetSymbolAddress ~/src/llvm-5/include/llvm-c/OrcBindings.h
/**
* Get symbol address from JIT instance.
*/
LLVMOrcErrorCode LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef JITStack,
LLVMOrcTargetAddress *RetAddr,
const char *SymbolName);

So it does appear that your llvm-config and the actually installed llvm
don't quite agree. How did you install llvm?

Greetings,

Andres Freund

#62Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Tomas Vondra (#60)
Re: JIT compiling with LLVM v9.0

On 01/29/2018 11:49 PM, Tomas Vondra wrote:

...

and that indeed changes the failure to this:

Writing postgres.bki
Writing schemapg.h
Writing postgres.description
Writing postgres.shdescription
llvmjit_error.cpp: In function ‘void llvm_enter_fatal_on_oom()’:
llvmjit_error.cpp:61:3: error: ‘install_bad_alloc_error_handler’ is not
a member of ‘llvm’
llvm::install_bad_alloc_error_handler(fatal_llvm_new_handler);
^~~~
llvmjit_error.cpp: In function ‘void llvm_leave_fatal_on_oom()’:
llvmjit_error.cpp:77:3: error: ‘remove_bad_alloc_error_handler’ is not a
member of ‘llvm’
llvm::remove_bad_alloc_error_handler();
^~~~
llvmjit_error.cpp: In function ‘void llvm_reset_fatal_on_oom()’:
llvmjit_error.cpp:92:3: error: ‘remove_bad_alloc_error_handler’ is not a
member of ‘llvm’
llvm::remove_bad_alloc_error_handler();
^~~~
make[3]: *** [<builtin>: llvmjit_error.o] Error 1
make[2]: *** [common.mk:45: lib-recursive] Error 2
make[2]: *** Waiting for unfinished jobs....
make[1]: *** [Makefile:38: all-backend-recurse] Error 2
make: *** [GNUmakefile:11: all-src-recurse] Error 2

I'm not sure what that means, though ... maybe I really have system
broken in some strange way.

FWIW I've installed llvm 5.0.1 from distribution package, and now
everything builds fine (I don't even need the configure tweak).

I think I had to build the other binaries because there was no 5.x llvm
back then, but it's too far back so I don't remember.

Anyway, seems I'm fine for now. Sorry for the noise.

--
Tomas Vondra http://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#63Andres Freund
andres@anarazel.de
In reply to: Tomas Vondra (#62)
Re: JIT compiling with LLVM v9.0

Hi,

On 2018-01-30 00:16:46 +0100, Tomas Vondra wrote:

FWIW I've installed llvm 5.0.1 from distribution package, and now
everything builds fine (I don't even need the configure tweak).

I think I had to build the other binaries because there was no 5.x llvm
back then, but it's too far back so I don't remember.

Anyway, seems I'm fine for now.

Phew, I'm relieved. I'd guess you buily a 5.0 version while 5.0 was
still in development, so not all 5.0 functionality was available. Hence
the inconsistent looking result. While I think we can support 4.0
without too much problem, there's obviously no point in trying to
support old between releases versions...

Sorry for the noise.

No worries.

- Andres

#64Craig Ringer
craig@2ndquadrant.com
In reply to: Andres Freund (#50)
Re: JIT compiling with LLVM v9.1

On 29 January 2018 at 22:53, Andres Freund <andres@anarazel.de> wrote:

Hi,

On 2018-01-23 23:20:38 -0800, Andres Freund wrote:

== Code ==

As the patchset is large (500kb) and I'm still quickly evolving it, I do
not yet want to attach it. The git tree is at
https://git.postgresql.org/git/users/andresfreund/postgres.git
in the jit branch
https://git.postgresql.org/gitweb/?p=users/andresfreund/

postgres.git;a=shortlog;h=refs/heads/jit

I've just pushed an updated and rebased version of the tree:
- Split the large "jit infrastructure" commits into a number of smaller
commits
- Split the C++ file
- Dropped some of the performance stuff done to heaptuple.c - that was
mostly to make performance comparisons a bit more interesting, but
doesn't seem important enough to deal with.
- Added a commit renaming datetime.h symbols so they don't conflict with
LLVM variables anymore, removing ugly #undef PM/#define PM dance
around includes. Will post separately.
- Reduced the number of pointer constants in the generated LLVM IR, by
doing more getelementptr accesses (stem from before the time types
were automatically synced)
- Increased number of comments a bit

There's a jit-before-rebase-2018-01-29 tag, for the state of the tree
before the rebase.

If you submit the C++ support separately I'd like to sign up as reviewer
and get that in. It's non-intrusive and just makes our existing c++
compilation support actually work properly. Your patch is a more complete
version of the C++ support I hacked up during linux.conf.au - I should've
thought to look in your tree.

The only part I had to add that I don't see in yours is a workaround for
mismatched throw() annotations on our redefinition of inet_net_ntop :

src/include/port.h:

@@ -421,7 +425,7 @@ extern int pg_codepage_to_encoding(UINT cp);

 /* port/inet_net_ntop.c */
 extern char *inet_net_ntop(int af, const void *src, int bits,
-              char *dst, size_t size);
+              char *dst, size_t size) __THROW;

src/include/c.h:

@@ -1131,6 +1131,16 @@ extern int fdatasync(int fildes);
#define NON_EXEC_STATIC static
#endif

+/*
+ * glibc uses __THROW when compiling with the c++ compiler, but port.h
reclares
+ * inet_net_ntop. If we don't annotate it the same way as the prototype in
+ * <inet/arpa.h> we'll upset g++, so we must use __THROW from
<sys/cdefs.h>. If
+ * we're not on glibc, we need to define it away.
+ */
+#ifndef __GNU_LIBRARY__
+#define __THROW
+#endif
+
 /* /port compatibility functions */
 #include "port.h"

This might be better solved by renaming it to pg_inet_net_ntop so we don't
conflict with a standard name.

--
Craig Ringer http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

#65Jeff Davis
pgsql@j-davis.com
In reply to: Andres Freund (#55)
Re: JIT compiling with LLVM v9.0

Hi,

On Mon, Jan 29, 2018 at 10:40 AM, Andres Freund <andres@anarazel.de> wrote:

Hi,

On 2018-01-29 10:28:18 -0800, Jeff Davis wrote:

OK. How about this: are you open to changes that move us in the
direction of extensibility later? (By this I do *not* mean imposing a
bunch of requirements on you... either small changes to your patches
or something part of another commit.)

I'm good with that.

Or are you determined that this always should be a part of core?

I'm strongly against there not being an in-core JIT. I'm not at all
against adding APIs that allow to do different JIT implementations out
of core.

I can live with that.

I recommend that you discuss with packagers and a few others, to
reduce the chance of disagreement later.

Well, the source would require an actual compiler around. And the
inlining *just* for the function code itself isn't actually that
interesting, you e.g. want to also be able to

I think you hit enter too quicly... what's the rest of that sentence?

Regards,
Jeff Davis

#66Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#55)
Re: JIT compiling with LLVM v9.0

On Mon, Jan 29, 2018 at 1:40 PM, Andres Freund <andres@anarazel.de> wrote:

It's an optional dependency, and it doesn't increase build time that
much... If we were to move the llvm interfacing code to a .so, there'd
not even be a packaging issue, you can just package that .so separately
and get errors if somebody tries to enable LLVM without that .so being
installed.

I suspect that would be really valuable. If 'yum install
postgresql-server' (or your favorite equivalent) sucks down all of
LLVM, some people are going to complain, either because they are
trying to build little tiny machine images or because they are subject
to policies which preclude the presence of a compiler on a production
server. If you can do 'yum install postgresql-server' without
additional dependencies and 'yum install postgresql-server-jit' to
make it go faster, that issue is solved.

Unfortunately, that has the pretty significant downside that a lot of
people who actually want the postgresql-server-jit package will not
realize that they need to install it, which sucks. But I think it
might still be the better way to go. Anyway, it's for individual
packagers to cope with that problem; as far as the patch goes, +1 for
structuring things in a way which gives packagers the option to divide
it up that way.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#67Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#22)
Re: JIT compiling with LLVM v9.0

On Wed, Jan 24, 2018 at 2:20 AM, Andres Freund <andres@anarazel.de> wrote:

== Error handling ==

There's two aspects to error handling.

Firstly, generated (LLVM IR) and emitted functions (mmap()ed segments)
need to be cleaned up both after a successful query execution and after
an error. I've settled on a fairly boring resowner based mechanism. On
errors all expressions owned by a resowner are released, upon success
expressions are reassigned to the parent / released on commit (unless
executor shutdown has cleaned them up of course).

Cool.

A second, less pretty and newly developed, aspect of error handling is
OOM handling inside LLVM itself. The above resowner based mechanism
takes care of cleaning up emitted code upon ERROR, but there's also the
chance that LLVM itself runs out of memory. LLVM by default does *not*
use any C++ exceptions. It's allocations are primarily funneled through
the standard "new" handlers, and some direct use of malloc() and
mmap(). For the former a 'new handler' exists
http://en.cppreference.com/w/cpp/memory/new/set_new_handler for the
latter LLVM provides callback that get called upon failure
(unfortunately mmap() failures are treated as fatal rather than OOM
errors).
What I've chosen to do, and I'd be interested to get some input about
that, is to have two functions that LLVM using code must use:
extern void llvm_enter_fatal_on_oom(void);
extern void llvm_leave_fatal_on_oom(void);
before interacting with LLVM code (ie. emitting IR, or using the above
functions) llvm_enter_fatal_on_oom() needs to be called.

When a libstdc++ new or LLVM error occurs, the handlers set up by the
above functions trigger a FATAL error. We have to use FATAL rather than
ERROR, as we *cannot* reliably throw ERROR inside a foreign library
without risking corrupting its internal state.

That bites, although it's probably tolerable if we expect such errors
only in exceptional situations such as a needed shared library failing
to load or something. Killing the session when we run out of memory
during JIT compilation is not very nice at all. Does the LLVM library
have any useful hooks that we can leverage here, like a hypothetical
function LLVMProvokeFailureAsSoonAsConvenient()? The equivalent
function for PostgreSQL would do { InterruptPending = true;
QueryCancelPending = true; }. And maybe LLVMSetProgressCallback()
that would get called periodically and let us set a handler that could
check for interrupts on the PostgreSQL side and then call
LLVMProvokeFailureAsSoonAsConvenient() as applicable? This problem
can't be completely unique to PostgreSQL; anybody who is using LLVM
for JIT from a long-running process needs a solution, so you might
think that the library would provide one.

This facility allows us to get the bitcode for all operators
(e.g. int8eq, float8pl etc), without maintaining two copies. The way
I've currently set it up is that, if --with-llvm is passed to configure,
all backend files are also compiled to bitcode files. These bitcode
files get installed into the server's
$pkglibdir/bitcode/postgres/
under their original subfolder, eg.
~/build/postgres/dev-assert/install/lib/bitcode/postgres/utils/adt/float.bc
Using existing LLVM functionality (for parallel LTO compilation),
additionally an index is over these is stored to
$pkglibdir/bitcode/postgres.index.bc

That sounds pretty sweet.

When deciding to JIT for the first time, $pkglibdir/bitcode/ is scanned
for all .index.bc files and a *combined* index over all these files is
built in memory. The reason for doing so is that that allows "easy"
access to inlining access for extensions - they can install code into
$pkglibdir/bitcode/[extension]/
accompanied by
$pkglibdir/bitcode/[extension].index.bc
just alongside the actual library.

But that means that if an extension is installed after the initial
scan has been done, concurrent sessions won't notice the new files.
Maybe that's OK, but I wonder if we can do better.

Do people feel these should be hidden behind #ifdefs, always present but
prevent from being set to a meaningful, or unrestricted?

We shouldn't allow non-superusers to set any GUC that dumps files to
the data directory or provides an easy to way to crash the server, run
the machine out of memory, or similar. GUCs that just print stuff, or
make queries faster/slower, can be set by anyone, I think. I favor
having the debugging stuff available in the default build. This
feature has a chance of containing bugs, and those bugs will be hard
to troubleshoot if the first step in getting information on what went
wrong is "recompile".

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#68Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#67)
Re: JIT compiling with LLVM v9.0

Hi,

On 2018-01-30 13:57:50 -0500, Robert Haas wrote:

When a libstdc++ new or LLVM error occurs, the handlers set up by the
above functions trigger a FATAL error. We have to use FATAL rather than
ERROR, as we *cannot* reliably throw ERROR inside a foreign library
without risking corrupting its internal state.

That bites, although it's probably tolerable if we expect such errors
only in exceptional situations such as a needed shared library failing
to load or something. Killing the session when we run out of memory
during JIT compilation is not very nice at all. Does the LLVM library
have any useful hooks that we can leverage here, like a hypothetical
function LLVMProvokeFailureAsSoonAsConvenient()?

I don't see how that'd help if a memory allocation fails? We can't just
continue in that case? You could arguably have reserve memory pool that
you release in that case and then try to continue, but that seems
awfully fragile.

The equivalent function for PostgreSQL would do { InterruptPending =
true; QueryCancelPending = true; }. And maybe
LLVMSetProgressCallback() that would get called periodically and let
us set a handler that could check for interrupts on the PostgreSQL
side and then call LLVMProvokeFailureAsSoonAsConvenient() as
applicable? This problem can't be completely unique to PostgreSQL;
anybody who is using LLVM for JIT from a long-running process needs a
solution, so you might think that the library would provide one.

The ones I looked at just error out. Needing to handle OOM in soft fail
manner isn't actually that common a demand, I guess :/.

for all .index.bc files and a *combined* index over all these files is
built in memory. The reason for doing so is that that allows "easy"
access to inlining access for extensions - they can install code into
$pkglibdir/bitcode/[extension]/
accompanied by
$pkglibdir/bitcode/[extension].index.bc
just alongside the actual library.

But that means that if an extension is installed after the initial
scan has been done, concurrent sessions won't notice the new files.
Maybe that's OK, but I wonder if we can do better.

I mean we could periodically rescan, rescan after sighup, or such? But
that seems like something for later to me. It's not going to be super
common to install new extensions while a lot of sessions are
running. And things will work in that case, the functions just won't get inlined...

Do people feel these should be hidden behind #ifdefs, always present but
prevent from being set to a meaningful, or unrestricted?

We shouldn't allow non-superusers to set any GUC that dumps files to
the data directory or provides an easy to way to crash the server, run
the machine out of memory, or similar.

I don't buy the OOM one - there's so so so many of those already...

The profiling one does dump to ~/.debug/jit/ - it seems a bit annoying
if profiling can only be done by a superuser? Hm :/

Greetings,

Andres Freund

#69Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#68)
Re: JIT compiling with LLVM v9.0

On Tue, Jan 30, 2018 at 2:08 PM, Andres Freund <andres@anarazel.de> wrote:

That bites, although it's probably tolerable if we expect such errors
only in exceptional situations such as a needed shared library failing
to load or something. Killing the session when we run out of memory
during JIT compilation is not very nice at all. Does the LLVM library
have any useful hooks that we can leverage here, like a hypothetical
function LLVMProvokeFailureAsSoonAsConvenient()?

I don't see how that'd help if a memory allocation fails? We can't just
continue in that case? You could arguably have reserve memory pool that
you release in that case and then try to continue, but that seems
awfully fragile.

Well, I'm just asking what the library supports. For example:

https://curl.haxx.se/libcurl/c/CURLOPT_PROGRESSFUNCTION.html

If you had something like that, you could arrange to safely interrupt
the library the next time the progress-function was called.

The ones I looked at just error out. Needing to handle OOM in soft fail
manner isn't actually that common a demand, I guess :/.

Bummer.

I mean we could periodically rescan, rescan after sighup, or such? But
that seems like something for later to me. It's not going to be super
common to install new extensions while a lot of sessions are
running. And things will work in that case, the functions just won't get inlined...

Fair enough.

Do people feel these should be hidden behind #ifdefs, always present but
prevent from being set to a meaningful, or unrestricted?

We shouldn't allow non-superusers to set any GUC that dumps files to
the data directory or provides an easy to way to crash the server, run
the machine out of memory, or similar.

I don't buy the OOM one - there's so so so many of those already...

The profiling one does dump to ~/.debug/jit/ - it seems a bit annoying
if profiling can only be done by a superuser? Hm :/

The server's ~/.debug/jit? Or are you somehow getting the output to the client?

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#70Noname
ilmari@ilmari.org
In reply to: Robert Haas (#66)
Re: JIT compiling with LLVM v9.0

Robert Haas <robertmhaas@gmail.com> writes:

Unfortunately, that has the pretty significant downside that a lot of
people who actually want the postgresql-server-jit package will not
realize that they need to install it, which sucks. But I think it
might still be the better way to go. Anyway, it's for individual
packagers to cope with that problem; as far as the patch goes, +1 for
structuring things in a way which gives packagers the option to divide
it up that way.

I don't know about rpm/yum/dnf, but in dpkg/apt one could declare that
postgresql-server recommends postgresql-server-jit, which installs the
package by default, but can be overridden by config or on the command
line.

- ilmari
--
"The surreality of the universe tends towards a maximum" -- Skud's Law
"Never formulate a law or axiom that you're not prepared to live with
the consequences of." -- Skud's Meta-Law

#71Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#69)
Re: JIT compiling with LLVM v9.0

Hi,

On 2018-01-30 15:06:02 -0500, Robert Haas wrote:

On Tue, Jan 30, 2018 at 2:08 PM, Andres Freund <andres@anarazel.de> wrote:

That bites, although it's probably tolerable if we expect such errors
only in exceptional situations such as a needed shared library failing
to load or something. Killing the session when we run out of memory
during JIT compilation is not very nice at all. Does the LLVM library
have any useful hooks that we can leverage here, like a hypothetical
function LLVMProvokeFailureAsSoonAsConvenient()?

I don't see how that'd help if a memory allocation fails? We can't just
continue in that case? You could arguably have reserve memory pool that
you release in that case and then try to continue, but that seems
awfully fragile.

Well, I'm just asking what the library supports. For example:

https://curl.haxx.se/libcurl/c/CURLOPT_PROGRESSFUNCTION.html

I get that type of function, what I don't understand how that applies to
OOM:

If you had something like that, you could arrange to safely interrupt
the library the next time the progress-function was called.

Yea, but how are you going to *get* to the next time, given that an
allocator just couldn't allocate memory? You can't just return a NULL
pointer because the caller will use that memory?

The profiling one does dump to ~/.debug/jit/ - it seems a bit annoying
if profiling can only be done by a superuser? Hm :/

The server's ~/.debug/jit? Or are you somehow getting the output to the client?

Yes, the servers - I'm not sure I understand the "client" bit? It's
about perf profiling, which isn't available to the client either?

Greetings,

Andres Freund

#72Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Andres Freund (#63)
Re: JIT compiling with LLVM v9.0

On 01/30/2018 12:24 AM, Andres Freund wrote:

Hi,

On 2018-01-30 00:16:46 +0100, Tomas Vondra wrote:

FWIW I've installed llvm 5.0.1 from distribution package, and now
everything builds fine (I don't even need the configure tweak).

I think I had to build the other binaries because there was no 5.x llvm
back then, but it's too far back so I don't remember.

Anyway, seems I'm fine for now.

Phew, I'm relieved. I'd guess you buily a 5.0 version while 5.0 was
still in development, so not all 5.0 functionality was available. Hence
the inconsistent looking result. While I think we can support 4.0
without too much problem, there's obviously no point in trying to
support old between releases versions...

That's quite possible, but I don't really remember :-/

But I ran into another issue today, where everything builds fine (llvm
5.0.1, gcc 6.4.0), but at runtime I get errors like this:

ERROR:
LLVMCreateMemoryBufferWithContentsOfFile(/home/tomas/pg-llvm/lib/postgresql/llvmjit_types.bc)
failed: No such file or directory

It seems the llvmjit_types.bc file ended up in the parent directory
(/home/tomas/pg-llvm/lib/) for some reason. After simply copying it to
the expected place everything started working.

regards

--
Tomas Vondra http://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#73David Fetter
david@fetter.org
In reply to: Robert Haas (#66)
Re: JIT compiling with LLVM v9.0

On Tue, Jan 30, 2018 at 01:46:37PM -0500, Robert Haas wrote:

On Mon, Jan 29, 2018 at 1:40 PM, Andres Freund <andres@anarazel.de> wrote:

It's an optional dependency, and it doesn't increase build time
that much... If we were to move the llvm interfacing code to a
.so, there'd not even be a packaging issue, you can just package
that .so separately and get errors if somebody tries to enable
LLVM without that .so being installed.

I suspect that would be really valuable. If 'yum install
postgresql-server' (or your favorite equivalent) sucks down all of
LLVM,

As I understand it, LLVM is organized in such a way as not to require
this. Andres, am I understanding correctly that what you're using
doesn't require much of LLVM at runtime?

some people are going to complain, either because they are
trying to build little tiny machine images or because they are
subject to policies which preclude the presence of a compiler on a
production server. If you can do 'yum install postgresql-server'
without additional dependencies and 'yum install
postgresql-server-jit' to make it go faster, that issue is solved.

Would you consider it solved if there were some very small part of the
LLVM (or similar JIT-capable) toolchain added as a dependency, or does
it need to be optional into a long future?

Unfortunately, that has the pretty significant downside that a lot of
people who actually want the postgresql-server-jit package will not
realize that they need to install it, which sucks.

It does indeed.

Best,
David.
--
David Fetter <david(at)fetter(dot)org> http://fetter.org/
Phone: +1 415 235 3778

Remember to vote!
Consider donating to Postgres: http://www.postgresql.org/about/donate

#74Andres Freund
andres@anarazel.de
In reply to: David Fetter (#73)
Re: JIT compiling with LLVM v9.0

Hi,

On 2018-01-30 22:57:06 +0100, David Fetter wrote:

On Tue, Jan 30, 2018 at 01:46:37PM -0500, Robert Haas wrote:

On Mon, Jan 29, 2018 at 1:40 PM, Andres Freund <andres@anarazel.de> wrote:

It's an optional dependency, and it doesn't increase build time
that much... If we were to move the llvm interfacing code to a
.so, there'd not even be a packaging issue, you can just package
that .so separately and get errors if somebody tries to enable
LLVM without that .so being installed.

I suspect that would be really valuable. If 'yum install
postgresql-server' (or your favorite equivalent) sucks down all of
LLVM,

As I understand it, LLVM is organized in such a way as not to require
this. Andres, am I understanding correctly that what you're using
doesn't require much of LLVM at runtime?

I'm not sure what you exactly mean. Yes, you need the llvm library at
runtime. Perhaps you're thinking of clang or llvm binarieries? The
latter we *not* need.

What's required is something like:
$ apt show libllvm5.0
Package: libllvm5.0
Version: 1:5.0.1-2
Priority: optional
Section: libs
Source: llvm-toolchain-5.0
Maintainer: LLVM Packaging Team <pkg-llvm-team@lists.alioth.debian.org>
Installed-Size: 56.9 MB
Depends: libc6 (>= 2.15), libedit2 (>= 2.11-20080614), libffi6 (>= 3.0.4), libgcc1 (>= 1:3.4), libstdc++6 (>= 6), libtinfo5 (>= 6), zlib1g (>= 1:1.2.0)
Breaks: libllvm3.9v4
Replaces: libllvm3.9v4
Homepage: http://www.llvm.org/
Tag: role::shared-lib
Download-Size: 13.7 MB
APT-Manual-Installed: no
APT-Sources: http://debian.osuosl.org/debian unstable/main amd64 Packages
Description: Modular compiler and toolchain technologies, runtime library
LLVM is a collection of libraries and tools that make it easy to build
compilers, optimizers, just-in-time code generators, and many other
compiler-related programs.
.
This package contains the LLVM runtime library.

So ~14MB to download, ~57MB on disk. We only need a subset of
libllvm5.0, and LLVM allows to build such a subset. But obviously
distributions aren't going to target their LLVM just for postgres.

Unfortunately, that has the pretty significant downside that a lot of
people who actually want the postgresql-server-jit package will not
realize that they need to install it, which sucks.

It does indeed.

With things like apt recommends and such I don't think this is a huge
problem. It'll be installed by default unless somebody is on a space
constrained system and doesn't want that...

Greetings,

Andres Freund

#75Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#66)
Re: JIT compiling with LLVM v9.0

Hi,

On 2018-01-30 13:46:37 -0500, Robert Haas wrote:

On Mon, Jan 29, 2018 at 1:40 PM, Andres Freund <andres@anarazel.de> wrote:

It's an optional dependency, and it doesn't increase build time that
much... If we were to move the llvm interfacing code to a .so, there'd
not even be a packaging issue, you can just package that .so separately
and get errors if somebody tries to enable LLVM without that .so being
installed.

I suspect that would be really valuable. If 'yum install
postgresql-server' (or your favorite equivalent) sucks down all of
LLVM, some people are going to complain, either because they are
trying to build little tiny machine images or because they are subject
to policies which preclude the presence of a compiler on a production
server. If you can do 'yum install postgresql-server' without
additional dependencies and 'yum install postgresql-server-jit' to
make it go faster, that issue is solved.

So, I'm working on that now. In the course of this I'll be
painfully rebase and rename a lot of code, which I'd like not to repeat
unnecessarily.

Right now there primarily is:

src/backend/lib/llvmjit.c - infrastructure, optimization, error handling
src/backend/lib/llvmjit_{error,wrap,inline}.cpp - expose more stuff to C
src/backend/executor/execExprCompile.c - emit LLVM IR for expressions
src/backend/access/common/heaptuple.c - emit LLVM IR for deforming

Given that we need a shared library it'll be best buildsystem wise if
all of this is in a directory, and there's a separate file containing
the stubs that call into it.

I'm not quite sure where to put the code. I'm a bit inclined to add a
new
src/backend/jit/
because we're dealing with code from across different categories? There
we could have a pgjit.c with the stubs, and llvmjit/ with the llvm
specific code?

Alternatively I'd say we put the stub into src/backend/executor/pgjit.c,
and the actual llvm using code into src/backend/executor/llvmjit/?

Comments?

Andres Freund

#76David Fetter
david@fetter.org
In reply to: Andres Freund (#74)
Re: JIT compiling with LLVM v9.0

On Tue, Jan 30, 2018 at 02:08:30PM -0800, Andres Freund wrote:

Hi,

On 2018-01-30 22:57:06 +0100, David Fetter wrote:

On Tue, Jan 30, 2018 at 01:46:37PM -0500, Robert Haas wrote:

On Mon, Jan 29, 2018 at 1:40 PM, Andres Freund <andres@anarazel.de> wrote:

It's an optional dependency, and it doesn't increase build
time that much... If we were to move the llvm interfacing code
to a .so, there'd not even be a packaging issue, you can just
package that .so separately and get errors if somebody tries
to enable LLVM without that .so being installed.

I suspect that would be really valuable. If 'yum install
postgresql-server' (or your favorite equivalent) sucks down all
of LLVM,

As I understand it, LLVM is organized in such a way as not to
require this. Andres, am I understanding correctly that what
you're using doesn't require much of LLVM at runtime?

I'm not sure what you exactly mean. Yes, you need the llvm library
at runtime. Perhaps you're thinking of clang or llvm binarieries?
The latter we *not* need.

I was, and glad I understood correctly.

What's required is something like:
$ apt show libllvm5.0
Package: libllvm5.0
Version: 1:5.0.1-2
Priority: optional
Section: libs
Source: llvm-toolchain-5.0
Maintainer: LLVM Packaging Team <pkg-llvm-team@lists.alioth.debian.org>
Installed-Size: 56.9 MB
Depends: libc6 (>= 2.15), libedit2 (>= 2.11-20080614), libffi6 (>= 3.0.4), libgcc1 (>= 1:3.4), libstdc++6 (>= 6), libtinfo5 (>= 6), zlib1g (>= 1:1.2.0)
Breaks: libllvm3.9v4
Replaces: libllvm3.9v4
Homepage: http://www.llvm.org/
Tag: role::shared-lib
Download-Size: 13.7 MB
APT-Manual-Installed: no
APT-Sources: http://debian.osuosl.org/debian unstable/main amd64 Packages
Description: Modular compiler and toolchain technologies, runtime library
LLVM is a collection of libraries and tools that make it easy to build
compilers, optimizers, just-in-time code generators, and many other
compiler-related programs.
.
This package contains the LLVM runtime library.

So ~14MB to download, ~57MB on disk. We only need a subset of
libllvm5.0, and LLVM allows to build such a subset. But obviously
distributions aren't going to target their LLVM just for postgres.

True, although if they're using an LLVM only for PostgreSQL and care
about 57MB of disk, they're probably also ready to do that work.

Unfortunately, that has the pretty significant downside that a
lot of people who actually want the postgresql-server-jit
package will not realize that they need to install it, which
sucks.

It does indeed.

With things like apt recommends and such I don't think this is a
huge problem. It'll be installed by default unless somebody is on a
space constrained system and doesn't want that...

Don't most of the wins for JITing come in the OLAP space anyway? I'm
having trouble picturing a severely space-constrained OLAP system, but
of course it's a possible scenario.

Best,
David.
--
David Fetter <david(at)fetter(dot)org> http://fetter.org/
Phone: +1 415 235 3778

Remember to vote!
Consider donating to Postgres: http://www.postgresql.org/about/donate

#77Jason Petersen
jason@citusdata.com
In reply to: Andres Freund (#74)
Re: JIT compiling with LLVM v9.0

On Jan 30, 2018, at 2:08 PM, Andres Freund <andres@anarazel.de> wrote:

With things like apt recommends and such I don't think this is a huge problem.

I don’t believe there is a similar widely-supported dependency type in yum/rpm, though. rpm 4.12 adds support for Weak Dependencies, which have Recommends/Suggests-style semantics, but AFAIK it’s not going to be on most RPM machines (I haven’t checked most OSes yet, but IIRC it’s mostly a Fedora thing at this point?)

Which means in the rpm packages we’ll have to decide whether this is required or must be opt-in by end users (which as discussed would hurt adoption).

--
Jason Petersen
Software Engineer | Citus Data
303.736.9255
jason@citusdata.com

#78Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Andres Freund (#75)
Re: JIT compiling with LLVM v9.0

On Wed, Jan 31, 2018 at 11:57 AM, Andres Freund <andres@anarazel.de> wrote:

On 2018-01-30 13:46:37 -0500, Robert Haas wrote:

On Mon, Jan 29, 2018 at 1:40 PM, Andres Freund <andres@anarazel.de> wrote:

It's an optional dependency, and it doesn't increase build time that
much... If we were to move the llvm interfacing code to a .so, there'd
not even be a packaging issue, you can just package that .so separately
and get errors if somebody tries to enable LLVM without that .so being
installed.

I suspect that would be really valuable. If 'yum install
postgresql-server' (or your favorite equivalent) sucks down all of
LLVM, some people are going to complain, either because they are
trying to build little tiny machine images or because they are subject
to policies which preclude the presence of a compiler on a production
server. If you can do 'yum install postgresql-server' without
additional dependencies and 'yum install postgresql-server-jit' to
make it go faster, that issue is solved.

So, I'm working on that now. In the course of this I'll be
painfully rebase and rename a lot of code, which I'd like not to repeat
unnecessarily.

Right now there primarily is:

src/backend/lib/llvmjit.c - infrastructure, optimization, error handling
src/backend/lib/llvmjit_{error,wrap,inline}.cpp - expose more stuff to C
src/backend/executor/execExprCompile.c - emit LLVM IR for expressions
src/backend/access/common/heaptuple.c - emit LLVM IR for deforming

Given that we need a shared library it'll be best buildsystem wise if
all of this is in a directory, and there's a separate file containing
the stubs that call into it.

I'm not quite sure where to put the code. I'm a bit inclined to add a
new
src/backend/jit/
because we're dealing with code from across different categories? There
we could have a pgjit.c with the stubs, and llvmjit/ with the llvm
specific code?

Alternatively I'd say we put the stub into src/backend/executor/pgjit.c,
and the actual llvm using code into src/backend/executor/llvmjit/?

Comments?

I'm just starting to look at this (amazing) work, and I don't have a
strong opinion yet. But certainly, making it easy for packagers to
put the -jit stuff into a separate package for the reasons already
given sounds sensible to me. Some systems package LLVM as one
gigantic package that'll get you 1GB of compiler/debugger/other stuff
and perhaps violate local rules by installing a compiler when you
really just wanted libLLVM{whatever}.so. I guess it should be made
very clear to users (explain plans, maybe startup message, ...?)
whether JIT support is active/installed so that people are at least
very aware when they encounter a system that is interpreting stuff it
could be compiling. Putting all the JIT into a separate directory
under src/backend/jit certainly looks sensible at first glance, but
I'm not sure.

Incidentally, from commit fdc6c7a6dddbd6df63717f2375637660bcd00fc6
(HEAD -> jit, andresfreund/jit) on your branch I get:

ccache c++ -Wall -Wpointer-arith -fno-strict-aliasing -fwrapv -g -g
-O2 -fno-exceptions -I../../../src/include
-I/usr/local/llvm50/include -DLLVM_BUILD_GLOBAL_ISEL
-D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS
-I/usr/local/include -c -o llvmjit_error.o llvmjit_error.cpp -MMD -MP
-MF .deps/llvmjit_error.Po
In file included from llvmjit_error.cpp:26:
In file included from ../../../src/include/lib/llvmjit.h:48:
In file included from /usr/local/llvm50/include/llvm-c/Types.h:17:
In file included from /usr/local/llvm50/include/llvm/Support/DataTypes.h:33:
/usr/include/c++/v1/cmath:555:1: error: templates must have C++ linkage
template <class _A1>
^~~~~~~~~~~~~~~~~~~~
llvmjit_error.cpp:24:1: note: extern "C" language linkage
specification begins here
extern "C"
^

$ c++ -v
FreeBSD clang version 4.0.0 (tags/RELEASE_400/final 297347) (based on
LLVM 4.0.0)

This seems to be a valid complaint. I don't think you should be
(indirectly) wrapping Types.h in extern "C". At a guess, your
llvmjit.h should be doing its own #ifdef __cplusplus'd linkage
specifiers, so you can use it from C or C++, but making sure that you
don't #include LLVM's headers from a bizarro context where __cplusplus
is defined but the linkage is unexpectedly already "C"?

--
Thomas Munro
http://www.enterprisedb.com

#79Andres Freund
andres@anarazel.de
In reply to: Thomas Munro (#78)
Re: JIT compiling with LLVM v9.0

On 2018-01-31 14:42:26 +1300, Thomas Munro wrote:

I'm just starting to look at this (amazing) work, and I don't have a
strong opinion yet. But certainly, making it easy for packagers to
put the -jit stuff into a separate package for the reasons already
given sounds sensible to me. Some systems package LLVM as one
gigantic package that'll get you 1GB of compiler/debugger/other stuff
and perhaps violate local rules by installing a compiler when you
really just wanted libLLVM{whatever}.so. I guess it should be made
very clear to users (explain plans, maybe startup message, ...?)

I'm not quite sure I understand. You mean have it display whether
available? I think my plan is to "just" set jit_expressions=on (or
whatever we're going to name it) fail if the prerequisites aren't
available. I personally don't think this should be enabled by default,
definitely not in the first release.

$ c++ -v
FreeBSD clang version 4.0.0 (tags/RELEASE_400/final 297347) (based on
LLVM 4.0.0)

This seems to be a valid complaint. I don't think you should be
(indirectly) wrapping Types.h in extern "C". At a guess, your
llvmjit.h should be doing its own #ifdef __cplusplus'd linkage
specifiers, so you can use it from C or C++, but making sure that you
don't #include LLVM's headers from a bizarro context where __cplusplus
is defined but the linkage is unexpectedly already "C"?

Hm, this seems like a bit of pointless nitpickery by the compiler to me,
but I guess...

Greetings,

Andres Freund

#80Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Andres Freund (#79)
Re: JIT compiling with LLVM v9.0

On Wed, Jan 31, 2018 at 3:05 PM, Andres Freund <andres@anarazel.de> wrote:

On 2018-01-31 14:42:26 +1300, Thomas Munro wrote:

I'm just starting to look at this (amazing) work, and I don't have a
strong opinion yet. But certainly, making it easy for packagers to
put the -jit stuff into a separate package for the reasons already
given sounds sensible to me. Some systems package LLVM as one
gigantic package that'll get you 1GB of compiler/debugger/other stuff
and perhaps violate local rules by installing a compiler when you
really just wanted libLLVM{whatever}.so. I guess it should be made
very clear to users (explain plans, maybe startup message, ...?)

I'm not quite sure I understand. You mean have it display whether
available? I think my plan is to "just" set jit_expressions=on (or
whatever we're going to name it) fail if the prerequisites aren't
available. I personally don't think this should be enabled by default,
definitely not in the first release.

I assumed (incorrectly) that you wanted it to default to on if
available, so I was suggesting making it obvious to end users if
they've accidentally forgotten to install -jit. If it's not enabled
until you actually ask for it and trying to enable it when it's not
installed barfs, then that seems sensible.

This seems to be a valid complaint. I don't think you should be
(indirectly) wrapping Types.h in extern "C". At a guess, your
llvmjit.h should be doing its own #ifdef __cplusplus'd linkage
specifiers, so you can use it from C or C++, but making sure that you
don't #include LLVM's headers from a bizarro context where __cplusplus
is defined but the linkage is unexpectedly already "C"?

Hm, this seems like a bit of pointless nitpickery by the compiler to me,
but I guess...

Well that got me curious about how GCC could possibly be accepting
that (it certainly doesn't like extern "C" template ... any more than
the next compiler). I dug a bit and realised that it's the stdlib
that's different: libstdc++ has its own extern "C++" in <cmath>,
while libc++ doesn't.

--
Thomas Munro
http://www.enterprisedb.com

#81Andres Freund
andres@anarazel.de
In reply to: Thomas Munro (#80)
Re: JIT compiling with LLVM v9.0

Hi,

On 2018-01-31 15:48:09 +1300, Thomas Munro wrote:

On Wed, Jan 31, 2018 at 3:05 PM, Andres Freund <andres@anarazel.de> wrote:

I'm not quite sure I understand. You mean have it display whether
available? I think my plan is to "just" set jit_expressions=on (or
whatever we're going to name it) fail if the prerequisites aren't
available. I personally don't think this should be enabled by default,
definitely not in the first release.

I assumed (incorrectly) that you wanted it to default to on if
available, so I was suggesting making it obvious to end users if
they've accidentally forgotten to install -jit. If it's not enabled
until you actually ask for it and trying to enable it when it's not
installed barfs, then that seems sensible.

I'm open to changing my mind on it, but it seems a bit weird that a
feature that relies on a shlib being installed magically turns itself on
if avaible. And leaving that angle aside, ISTM, that it's a complex
enough feature that it should be opt-in the first release... Think we
roughly did that right for e.g. parallellism.

Greetings,

Andres Freund

#82Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Thomas Munro (#80)
Re: JIT compiling with LLVM v9.0

On 31.01.2018 05:48, Thomas Munro wrote:

This seems to be a valid complaint. I don't think you should be
(indirectly) wrapping Types.h in extern "C". At a guess, your
llvmjit.h should be doing its own #ifdef __cplusplus'd linkage
specifiers, so you can use it from C or C++, but making sure that you
don't #include LLVM's headers from a bizarro context where __cplusplus
is defined but the linkage is unexpectedly already "C"?

Hm, this seems like a bit of pointless nitpickery by the compiler to me,
but I guess...

Well that got me curious about how GCC could possibly be accepting
that (it certainly doesn't like extern "C" template ... any more than
the next compiler). I dug a bit and realised that it's the stdlib
that's different: libstdc++ has its own extern "C++" in <cmath>,
while libc++ doesn't.

The same problem takes place with old versions of GCC: I have to upgrade
GCC to 7.2 to make it possible to compile this code.
The problem in not in compiler itself, but in libc++ headers.

--
Konstantin Knizhnik
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

#83Peter Eisentraut
peter.eisentraut@2ndquadrant.com
In reply to: Andres Freund (#81)
Re: JIT compiling with LLVM v9.0

On 1/30/18 21:55, Andres Freund wrote:

I'm open to changing my mind on it, but it seems a bit weird that a
feature that relies on a shlib being installed magically turns itself on
if avaible. And leaving that angle aside, ISTM, that it's a complex
enough feature that it should be opt-in the first release... Think we
roughly did that right for e.g. parallellism.

That sounds reasonable, for both of those reasons.

--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#84Robert Haas
robertmhaas@gmail.com
In reply to: Peter Eisentraut (#83)
Re: JIT compiling with LLVM v9.0

On Wed, Jan 31, 2018 at 10:22 AM, Peter Eisentraut
<peter.eisentraut@2ndquadrant.com> wrote:

On 1/30/18 21:55, Andres Freund wrote:

I'm open to changing my mind on it, but it seems a bit weird that a
feature that relies on a shlib being installed magically turns itself on
if avaible. And leaving that angle aside, ISTM, that it's a complex
enough feature that it should be opt-in the first release... Think we
roughly did that right for e.g. parallellism.

That sounds reasonable, for both of those reasons.

The first one is a problem that's not going to go away. If the
problem of JIT being enabled "magically" is something we're concerned
about, we need to figure out a good solution, not just disable the
feature by default.

As far as the second one, looking back at what happened with parallel
query, I found (on a quick read) 13 back-patched commits in
REL9_6_STABLE prior to the release of 10.0, 3 of which I would qualify
as low-importance (improving documentation, fixing something that's
not really a bug, improving a test case). A couple of those were
really stupid mistakes on my part. On the other hand, would it have
been overall worse for our users if that feature had been turned on in
9.6? I don't know. They would have had those bugs (at least until we
fixed them) but they would have had parallel query, too. It's hard
for me to judge whether that was a win or a loss, and so here. Like
parallel query, this is a feature which seems to have a low risk of
data corruption, but a fairly high risk of wrong answers to queries
and/or strange errors. Users don't like that. On the other hand,
also like parallel query, if you've got the right kind of queries, it
can make them go a lot faster. Users DO like that.

So I could go either way on whether to enable this in the first
release. I definitely would not like to see it stay disabled by
default for a second release unless we find a lot of problems with it.
There's no point in developing new features unless users are going to
get the benefit of them, and while SOME users will enable features
that aren't turned on by default, many will not.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#85Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#75)
Re: JIT compiling with LLVM v9.0

On Tue, Jan 30, 2018 at 5:57 PM, Andres Freund <andres@anarazel.de> wrote:

Given that we need a shared library it'll be best buildsystem wise if
all of this is in a directory, and there's a separate file containing
the stubs that call into it.

I'm not quite sure where to put the code. I'm a bit inclined to add a
new
src/backend/jit/
because we're dealing with code from across different categories? There
we could have a pgjit.c with the stubs, and llvmjit/ with the llvm
specific code?

That's kind of ugly, in that if we eventually end up with many
different parts of the system using JIT, they're all going to have to
all put their code in that directory rather than putting it with the
subsystem to which it pertains. On the other hand, I don't really
have a better idea. I'd definitely at least try to keep
executor-specific considerations in a separate FILE from general JIT
infrastructure, and make, as far as possible, a clean separation at
the API level.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#86Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#84)
Re: JIT compiling with LLVM v9.0

Hi,

On 2018-01-31 11:53:25 -0500, Robert Haas wrote:

On Wed, Jan 31, 2018 at 10:22 AM, Peter Eisentraut
<peter.eisentraut@2ndquadrant.com> wrote:

On 1/30/18 21:55, Andres Freund wrote:

I'm open to changing my mind on it, but it seems a bit weird that a
feature that relies on a shlib being installed magically turns itself on
if avaible. And leaving that angle aside, ISTM, that it's a complex
enough feature that it should be opt-in the first release... Think we
roughly did that right for e.g. parallellism.

That sounds reasonable, for both of those reasons.

The first one is a problem that's not going to go away. If the
problem of JIT being enabled "magically" is something we're concerned
about, we need to figure out a good solution, not just disable the
feature by default.

That's a fair argument, and I don't really have a good answer to it. We
could have a jit = off/try/on, and use that to signal things? I.e. it
can be set to try (possibly default in version + 1), and things will
work if it's not installed, but if set to on it'll refuse to work if not
enabled. Similar to how huge pages work now.

Greetings,

Andres Freund

#87Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#85)
Re: JIT compiling with LLVM v9.0

Hi,

On 2018-01-31 11:56:59 -0500, Robert Haas wrote:

On Tue, Jan 30, 2018 at 5:57 PM, Andres Freund <andres@anarazel.de> wrote:

Given that we need a shared library it'll be best buildsystem wise if
all of this is in a directory, and there's a separate file containing
the stubs that call into it.

I'm not quite sure where to put the code. I'm a bit inclined to add a
new
src/backend/jit/
because we're dealing with code from across different categories? There
we could have a pgjit.c with the stubs, and llvmjit/ with the llvm
specific code?

That's kind of ugly, in that if we eventually end up with many
different parts of the system using JIT, they're all going to have to
all put their code in that directory rather than putting it with the
subsystem to which it pertains.

Yea, that's what I really dislike about the idea too.

On the other hand, I don't really have a better idea.

I guess one alternative would be to leave the individual files in their
subsystem directories, but not in the corresponding OBJS lists, and
instead pick them up from the makefile in the jit shlib? That might
better...

It's a bit weird because the files would be compiled when make-ing that
directory and rather when the jit shlib one made, but that's not too
bad.

I'd definitely at least try to keep executor-specific considerations
in a separate FILE from general JIT infrastructure, and make, as far
as possible, a clean separation at the API level.

Absolutely. Right now there's general infrastructure files (error
handling, optimization, inlining), expression compilation, tuple deform
compilation, and I thought to continue keeping the files separately just
like that.

Greetings,

Andres Freund

#88Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#86)
Re: JIT compiling with LLVM v9.0

On Wed, Jan 31, 2018 at 1:34 PM, Andres Freund <andres@anarazel.de> wrote:

The first one is a problem that's not going to go away. If the
problem of JIT being enabled "magically" is something we're concerned
about, we need to figure out a good solution, not just disable the
feature by default.

That's a fair argument, and I don't really have a good answer to it. We
could have a jit = off/try/on, and use that to signal things? I.e. it
can be set to try (possibly default in version + 1), and things will
work if it's not installed, but if set to on it'll refuse to work if not
enabled. Similar to how huge pages work now.

We could do that, but I'd be more inclined just to let JIT be
magically enabled. In general, if a user could do 'yum install ip4r'
(for example) and have that Just Work without any further database
configuration, I think a lot of people would consider that to be a
huge improvement. Unfortunately we can't really do that for various
reasons, the biggest of which is that there's no way for installing an
OS package to modify the internal state of a database that may not
even be running at the time. But as a general principle, I think
having to configure both the OS and the DB is an anti-feature, and
that if installing an extra package is sufficient to get the
new-and-improved behavior, users will like it. Bonus points if it
doesn't require a server restart.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#89Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#88)
Re: JIT compiling with LLVM v9.0

On 2018-01-31 14:45:46 -0500, Robert Haas wrote:

On Wed, Jan 31, 2018 at 1:34 PM, Andres Freund <andres@anarazel.de> wrote:

The first one is a problem that's not going to go away. If the
problem of JIT being enabled "magically" is something we're concerned
about, we need to figure out a good solution, not just disable the
feature by default.

That's a fair argument, and I don't really have a good answer to it. We
could have a jit = off/try/on, and use that to signal things? I.e. it
can be set to try (possibly default in version + 1), and things will
work if it's not installed, but if set to on it'll refuse to work if not
enabled. Similar to how huge pages work now.

We could do that, but I'd be more inclined just to let JIT be
magically enabled. In general, if a user could do 'yum install ip4r'
(for example) and have that Just Work without any further database
configuration, I think a lot of people would consider that to be a
huge improvement. Unfortunately we can't really do that for various
reasons, the biggest of which is that there's no way for installing an
OS package to modify the internal state of a database that may not
even be running at the time. But as a general principle, I think
having to configure both the OS and the DB is an anti-feature, and
that if installing an extra package is sufficient to get the
new-and-improved behavior, users will like it.

I'm not seing a contradiction between what you describe as desired, and
what I describe? If it defaulted to try, that'd just do what you want,
no? I do think it's important to configure the system so it'll error if
JITing is not available.

Bonus points if it doesn't require a server restart.

I think server restart might be doable (although it'll increase memory
usage because the shlib needs to be loaded in each backend rather than
postmaster), but once a session is running I'm fairly sure we do not
want to retry. Re-checking whether a shlib is available on the
filesystem every query does not sound like a good idea...

Greetings,

Andres Freund

#90Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#89)
Re: JIT compiling with LLVM v9.0

On Wed, Jan 31, 2018 at 2:49 PM, Andres Freund <andres@anarazel.de> wrote:

We could do that, but I'd be more inclined just to let JIT be
magically enabled. In general, if a user could do 'yum install ip4r'
(for example) and have that Just Work without any further database
configuration, I think a lot of people would consider that to be a
huge improvement. Unfortunately we can't really do that for various
reasons, the biggest of which is that there's no way for installing an
OS package to modify the internal state of a database that may not
even be running at the time. But as a general principle, I think
having to configure both the OS and the DB is an anti-feature, and
that if installing an extra package is sufficient to get the
new-and-improved behavior, users will like it.

I'm not seing a contradiction between what you describe as desired, and
what I describe? If it defaulted to try, that'd just do what you want,
no? I do think it's important to configure the system so it'll error if
JITing is not available.

Hmm, I guess that's true. I'm not sure that we really need a way to
error out if JIT is not available, but maybe we do.

Bonus points if it doesn't require a server restart.

I think server restart might be doable (although it'll increase memory
usage because the shlib needs to be loaded in each backend rather than
postmaster), but once a session is running I'm fairly sure we do not
want to retry. Re-checking whether a shlib is available on the
filesystem every query does not sound like a good idea...

Agreed.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#91Peter Eisentraut
peter.eisentraut@2ndquadrant.com
In reply to: Andres Freund (#86)
Re: JIT compiling with LLVM v9.0

On 1/31/18 13:34, Andres Freund wrote:

That's a fair argument, and I don't really have a good answer to it. We
could have a jit = off/try/on, and use that to signal things? I.e. it
can be set to try (possibly default in version + 1), and things will
work if it's not installed, but if set to on it'll refuse to work if not
enabled. Similar to how huge pages work now.

But that setup also has the problem that you can't query the setting to
know whether it's actually on.

--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#92Peter Eisentraut
peter.eisentraut@2ndquadrant.com
In reply to: Robert Haas (#88)
Re: JIT compiling with LLVM v9.0

On 1/31/18 14:45, Robert Haas wrote:

We could do that, but I'd be more inclined just to let JIT be
magically enabled. In general, if a user could do 'yum install ip4r'
(for example) and have that Just Work without any further database
configuration,

One way to do that would be to have a system-wide configuration file
like /usr/local/pgsql/etc/postgresql/postgresql.conf, which in turn
includes /usr/local/pgsql/etc/postgresql/postgreql.conf.d/*, and have
the add-on package install its configuration file with the setting jit =
on there.

Then again, if we want to make it simpler, just link the whole thing in
and turn it on by default and be done with it.

Presumably, there will be planner-level knobs to model the jit startup
time, and if you don't like it, you can set that very high to disable
it. So we don't necessarily need a separate turn-it-off-it's-broken
setting.

--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#93Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#92)
Re: JIT compiling with LLVM v9.0

On 2018-02-01 08:46:08 -0500, Peter Eisentraut wrote:

On 1/31/18 14:45, Robert Haas wrote:

We could do that, but I'd be more inclined just to let JIT be
magically enabled. In general, if a user could do 'yum install ip4r'
(for example) and have that Just Work without any further database
configuration,

One way to do that would be to have a system-wide configuration file
like /usr/local/pgsql/etc/postgresql/postgresql.conf, which in turn
includes /usr/local/pgsql/etc/postgresql/postgreql.conf.d/*, and have
the add-on package install its configuration file with the setting jit =
on there.

I think Robert's comment about extensions wasn't about extensions and
jit, just about needing CREATE EXTENSION. I don't see any
need for per-extension/shlib configurability of JITing.

Then again, if we want to make it simpler, just link the whole thing in
and turn it on by default and be done with it.

I'd personally be ok with that too...

Greetings,

Andres Freund

#94Merlin Moncure
mmoncure@gmail.com
In reply to: Robert Haas (#88)
Re: JIT compiling with LLVM v9.0

On Wed, Jan 31, 2018 at 1:45 PM, Robert Haas <robertmhaas@gmail.com> wrote:

On Wed, Jan 31, 2018 at 1:34 PM, Andres Freund <andres@anarazel.de> wrote:

The first one is a problem that's not going to go away. If the
problem of JIT being enabled "magically" is something we're concerned
about, we need to figure out a good solution, not just disable the
feature by default.

That's a fair argument, and I don't really have a good answer to it. We
could have a jit = off/try/on, and use that to signal things? I.e. it
can be set to try (possibly default in version + 1), and things will
work if it's not installed, but if set to on it'll refuse to work if not
enabled. Similar to how huge pages work now.

We could do that, but I'd be more inclined just to let JIT be
magically enabled. In general, if a user could do 'yum install ip4r'
(for example) and have that Just Work without any further database
configuration, I think a lot of people would consider that to be a
huge improvement. Unfortunately we can't really do that for various
reasons, the biggest of which is that there's no way for installing an
OS package to modify the internal state of a database that may not
even be running at the time. But as a general principle, I think
having to configure both the OS and the DB is an anti-feature, and
that if installing an extra package is sufficient to get the
new-and-improved behavior, users will like it. Bonus points if it
doesn't require a server restart.

You bet. It'd be helpful to have some obvious, well advertised ways
to determine when it's enabled and when it isn't, and to have a
straightforward process to determine what to fix when it's not enabled
and the user thinks it ought to be though.

merlin

#95Jeff Davis
pgsql@j-davis.com
In reply to: Konstantin Knizhnik (#82)
Re: JIT compiling with LLVM v9.0

On Wed, Jan 31, 2018 at 12:03 AM, Konstantin Knizhnik
<k.knizhnik@postgrespro.ru> wrote:

The same problem takes place with old versions of GCC: I have to upgrade GCC
to 7.2 to make it possible to compile this code.
The problem in not in compiler itself, but in libc++ headers.

How can I get this branch to compile on ubuntu 16.04? I have llvm-5.0
and gcc-5.4 installed. Do I need to compile with clang or gcc? Any
CXXFLAGS required?

Regards,
Jeff Davis

#96Andres Freund
andres@anarazel.de
In reply to: Jeff Davis (#95)
Re: JIT compiling with LLVM v9.0

On 2018-02-01 09:32:17 -0800, Jeff Davis wrote:

On Wed, Jan 31, 2018 at 12:03 AM, Konstantin Knizhnik
<k.knizhnik@postgrespro.ru> wrote:

The same problem takes place with old versions of GCC: I have to upgrade GCC
to 7.2 to make it possible to compile this code.
The problem in not in compiler itself, but in libc++ headers.

How can I get this branch to compile on ubuntu 16.04? I have llvm-5.0
and gcc-5.4 installed. Do I need to compile with clang or gcc? Any
CXXFLAGS required?

Just to understand: You're running in the issue with the header being
included from within the extern "C" {}? Hm, I've pushed a quick fix for
that.

Other than that, you can compile with both gcc or clang, but clang needs
to be available. Will be guessed from PATH if clang clang-5.0 clang-4.0
(in that order) exist, similar with llvm-config llvm-config-5.0 being
guessed. LLVM_CONFIG/CLANG/CXX= as an argument to configure overrides
both of that. E.g.
./configure --with-llvm LLVM_CONFIG=~/build/llvm/5/opt/install/bin/llvm-config
is what I use, although I also add:
LDFLAGS='-Wl,-rpath,/home/andres/build/llvm/5/opt/install/lib'
so I don't have to install llvm anywhere the system knows about.

Greetings,

Andres Freund

#97Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Andres Freund (#96)
Re: JIT compiling with LLVM v9.0

On Fri, Feb 2, 2018 at 2:05 PM, Andres Freund <andres@anarazel.de> wrote:

On 2018-02-01 09:32:17 -0800, Jeff Davis wrote:

On Wed, Jan 31, 2018 at 12:03 AM, Konstantin Knizhnik
<k.knizhnik@postgrespro.ru> wrote:

The same problem takes place with old versions of GCC: I have to upgrade GCC
to 7.2 to make it possible to compile this code.
The problem in not in compiler itself, but in libc++ headers.

How can I get this branch to compile on ubuntu 16.04? I have llvm-5.0
and gcc-5.4 installed. Do I need to compile with clang or gcc? Any
CXXFLAGS required?

Just to understand: You're running in the issue with the header being
included from within the extern "C" {}? Hm, I've pushed a quick fix for
that.

That change wasn't quite enough: to get this building against libc++
(Clang's native stdlb) I also needed this change to llvmjit.h so that
<llvm-c/Types.h> wouldn't be included with the wrong linkage (perhaps
you can find a less ugly way):

+#ifdef __cplusplus
+}
+#endif
 #include <llvm-c/Types.h>
+#ifdef __cplusplus
+extern "C"
+{
+#endif

Other than that, you can compile with both gcc or clang, but clang needs
to be available. Will be guessed from PATH if clang clang-5.0 clang-4.0
(in that order) exist, similar with llvm-config llvm-config-5.0 being
guessed. LLVM_CONFIG/CLANG/CXX= as an argument to configure overrides
both of that. E.g.
./configure --with-llvm LLVM_CONFIG=~/build/llvm/5/opt/install/bin/llvm-config
is what I use, although I also add:
LDFLAGS='-Wl,-rpath,/home/andres/build/llvm/5/opt/install/lib'
so I don't have to install llvm anywhere the system knows about.

BTW if you're building with clang (vendor compiler on at least macOS
and FreeBSD) you'll probably need CXXFLAGS=-std=c++11 (or later
standard) because it's still defaulting to '98.

--
Thomas Munro
http://www.enterprisedb.com

#98Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Thomas Munro (#97)
Re: JIT compiling with LLVM v9.0

Another small thing which might be environmental... llvmjit_types.bc
is getting installed into ${prefix}/lib here, but you're looking for
it in ${prefix}/lib/postgresql:

gmake[3]: Entering directory '/usr/home/munro/projects/postgres/src/backend/lib'
/usr/bin/install -c -m 644 llvmjit_types.bc '/home/munro/install/lib'

postgres=# set jit_above_cost = 0;
SET
postgres=# set jit_expressions = on;
SET
postgres=# select 4 + 4;
ERROR: LLVMCreateMemoryBufferWithContentsOfFile(/usr/home/munro/install/lib/postgresql/llvmjit_types.bc)
failed: No such file or directory

$ mv ~/install/lib/llvmjit_types.bc ~/install/lib/postgresql/

postgres=# select 4 + 4;
?column?
----------
8
(1 row)

--
Thomas Munro
http://www.enterprisedb.com

#99Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Thomas Munro (#98)
1 attachment(s)
Re: JIT compiling with LLVM v9.0

On Fri, Feb 2, 2018 at 5:11 PM, Thomas Munro
<thomas.munro@enterprisedb.com> wrote:

Another small thing which might be environmental... llvmjit_types.bc
is getting installed into ${prefix}/lib here, but you're looking for
it in ${prefix}/lib/postgresql:

Is there something broken about my installation? I see simple
arithmetic expressions apparently compiling and working but I can
easily find stuff that breaks... so far I think it's anything
involving string literals:

postgres=# set jit_above_cost = 0;
SET
postgres=# select quote_ident('x');
ERROR: failed to resolve name MakeExpandedObjectReadOnlyInternal

Well actually just select 'hello world' does it. I've attached a backtrace.

Tab completion is broken for me with jit_above_cost = 0 due to
tab-complete.c queries failing with various other errors including:

set <tab>:
ERROR: failed to resolve name ExecEvalScalarArrayOp

update <tab>:
ERROR: failed to resolve name quote_ident

show <tab>:
ERROR: failed to resolve name slot_getsomeattrs

I wasn't sure from your status message how much of this is expected at
this stage...

This is built from:

commit 302b7a284d30fb0e00eb5f0163aa933d4d9bea10 (HEAD -> jit, andresfreund/jit)

... plus the extern "C" tweak I posted earlier to make my clang 4.0
compiler happy, built on a FreeBSD 11.1 box with:

./configure --prefix=/home/munro/install/ --enable-tap-tests
--enable-cassert --enable-debug --enable-depend --with-llvm CC="ccache
cc" CXX="ccache c++" CXXFLAGS="-std=c++11"
LLVM_CONFIG=/usr/local/llvm50/bin/llvm-config
--with-libraries="/usr/local/lib" --with-includes="/usr/local/include"

The clang that was used for bitcode was the system /usr/bin/clang,
version 4.0. Is it a problem that I used that for compiling the
bitcode, but LLVM5 for JIT? I actually tried
CLANG=/usr/local/llvm50/bin/clang but ran into weird failures I
haven't got to the bottom of at ThinLink time so I couldn't get as far
as a running system.

I installed llvm50 from a package. I did need to make a tiny tweak by
hand: in src/Makefile.global, llvm-config --system-libs had said
-l/usr/lib/libexecinfo.so which wasn't linking and looks wrong to me
so I changed it to -lexecinfo, noted that it worked and reported a bug
upstream: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=225621

--
Thomas Munro
http://www.enterprisedb.com

Attachments:

backtrace.txttext/plain; charset=US-ASCII; name=backtrace.txtDownload
#100Jeff Davis
pgsql@j-davis.com
In reply to: Andres Freund (#96)
Re: JIT compiling with LLVM v9.0

On Thu, Feb 1, 2018 at 5:05 PM, Andres Freund <andres@anarazel.de> wrote:

Just to understand: You're running in the issue with the header being
included from within the extern "C" {}? Hm, I've pushed a quick fix for
that.

Other than that, you can compile with both gcc or clang, but clang needs
to be available. Will be guessed from PATH if clang clang-5.0 clang-4.0
(in that order) exist, similar with llvm-config llvm-config-5.0 being
guessed. LLVM_CONFIG/CLANG/CXX= as an argument to configure overrides
both of that. E.g.
./configure --with-llvm LLVM_CONFIG=~/build/llvm/5/opt/install/bin/llvm-config
is what I use, although I also add:
LDFLAGS='-Wl,-rpath,/home/andres/build/llvm/5/opt/install/lib'
so I don't have to install llvm anywhere the system knows about.

On Ubuntu 16.04
SHA1: 302b7a284
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.6) 5.4.0 20160609

packages: llvm-5.0 llvm-5.0-dev llvm-5.0-runtime libllvm-5.0
clang-5.0 libclang-common-5.0-dev libclang1-5.0

./configure --with-llvm --prefix=/home/jdavis/install/pgsql-dev
...
checking for llvm-config... no
checking for llvm-config-5.0... llvm-config-5.0
checking for clang... no
checking for clang-5.0... clang-5.0
checking for LLVMOrcGetSymbolAddressIn... no
checking for LLVMGetHostCPUName... no
checking for LLVMOrcRegisterGDB... no
checking for LLVMOrcRegisterPerf... no
checking for LLVMOrcUnregisterPerf... no
...

That encounters errors like:

/usr/include/c++/5/bits/c++0x_warning.h:32:2: error: #error This file
requires compiler an
d library support for the ISO C++ 2011 standard. This support must be
enabled with the -st
d=c++11 or -std=gnu++11 compiler options.
...
/usr/include/c++/5/cmath:505:22: error: conflicting declaration of C
function ‘long double
...
/usr/include/c++/5/cmath:926:3: error: template with C linkage
...

So I reconfigure with:
CXXFLAGS="-std=c++11" ./configure --with-llvm
--prefix=/home/jdavis/install/pgsql-dev

I think that got rid of the first error, but the other errors remain.

I also tried installing libc++-dev and using CC=clang-5.0
CXX=clang++-5.0 and with CXXFLAGS="-std=c++11 -stdlib=libc++" but I am
not making much progress, I'm still getting:

/usr/include/c++/v1/cmath:316:1: error: templates must have C++ linkage

I suggest that you share your exact configuration so we can get past
this for now, and you can work on the build issues in the background.
We can't be the first ones with this problem; maybe you can just ask
on an LLVM channel what the right thing to do is that will work on a
variety of machines (or at least reliably detect the problem at
configure time)?

Regards,
Jeff Davis

#101Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Jeff Davis (#100)
Re: JIT compiling with LLVM v9.0

On Fri, Feb 2, 2018 at 7:06 PM, Jeff Davis <pgsql@j-davis.com> wrote:

/usr/include/c++/5/cmath:505:22: error: conflicting declaration of C
function ‘long double
...
/usr/include/c++/5/cmath:926:3: error: template with C linkage

I suspect you can fix these with this change:

+#ifdef __cplusplus
+}
+#endif
 #include <llvm-c/Types.h>
+#ifdef __cplusplus
+extern "C"
+{
+#endif

... in llvmjit.h.

--
Thomas Munro
http://www.enterprisedb.com

#102Jeff Davis
pgsql@j-davis.com
In reply to: Thomas Munro (#101)
Re: JIT compiling with LLVM v9.0

On Thu, Feb 1, 2018 at 10:09 PM, Thomas Munro
<thomas.munro@enterprisedb.com> wrote:

On Fri, Feb 2, 2018 at 7:06 PM, Jeff Davis <pgsql@j-davis.com> wrote:

/usr/include/c++/5/cmath:505:22: error: conflicting declaration of C
function ‘long double
...
/usr/include/c++/5/cmath:926:3: error: template with C linkage

I suspect you can fix these with this change:

+#ifdef __cplusplus
+}
+#endif
#include <llvm-c/Types.h>
+#ifdef __cplusplus
+extern "C"
+{
+#endif

... in llvmjit.h.

Thanks! That worked, but I had to remove the "-stdlib=libc++" also,
which was causing me problems.

Regards,
Jeff Davis

#103Andres Freund
andres@anarazel.de
In reply to: Thomas Munro (#99)
Re: JIT compiling with LLVM v9.0

Hi,

On 2018-02-02 18:22:34 +1300, Thomas Munro wrote:

Is there something broken about my installation? I see simple
arithmetic expressions apparently compiling and working but I can
easily find stuff that breaks... so far I think it's anything
involving string literals:

That definitely should all work. Did you compile with lto and forced it
to internalize all symbols or such?

postgres=# set jit_above_cost = 0;
SET
postgres=# select quote_ident('x');
ERROR: failed to resolve name MakeExpandedObjectReadOnlyInternal

...

The clang that was used for bitcode was the system /usr/bin/clang,
version 4.0. Is it a problem that I used that for compiling the
bitcode, but LLVM5 for JIT?

No, I did that locally without problems.

I actually tried CLANG=/usr/local/llvm50/bin/clang but ran into weird
failures I haven't got to the bottom of at ThinLink time so I couldn't
get as far as a running system.

So you'd clang 5 level issues rather than with this patchset, do I
understand correctly?

I installed llvm50 from a package. I did need to make a tiny tweak by
hand: in src/Makefile.global, llvm-config --system-libs had said
-l/usr/lib/libexecinfo.so which wasn't linking and looks wrong to me
so I changed it to -lexecinfo, noted that it worked and reported a bug
upstream: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=225621

Yea, that seems outside of my / our hands.

- Andres

#104Andres Freund
andres@anarazel.de
In reply to: Jeff Davis (#102)
Re: JIT compiling with LLVM v9.0

On 2018-02-01 22:20:01 -0800, Jeff Davis wrote:

Thanks! That worked, but I had to remove the "-stdlib=libc++" also,
which was causing me problems.

That'll be gone as soon as I finish the shlib thing. Will hope to have
something over the weekend. Right now I'm at FOSDEM and need to prepare
a talk for tomorrow.

Greetings,

Andres Freund

#105Pierre Ducroquet
p.psql@pinaraf.info
In reply to: Andres Freund (#50)
4 attachment(s)
Re: JIT compiling with LLVM v9.1

On Monday, January 29, 2018 10:53:50 AM CET Andres Freund wrote:

Hi,

On 2018-01-23 23:20:38 -0800, Andres Freund wrote:

== Code ==

As the patchset is large (500kb) and I'm still quickly evolving it, I do
not yet want to attach it. The git tree is at

https://git.postgresql.org/git/users/andresfreund/postgres.git

in the jit branch

https://git.postgresql.org/gitweb/?p=users/andresfreund/postgres.git;a=s
hortlog;h=refs/heads/jit

I've just pushed an updated and rebased version of the tree:
- Split the large "jit infrastructure" commits into a number of smaller
commits
- Split the C++ file
- Dropped some of the performance stuff done to heaptuple.c - that was
mostly to make performance comparisons a bit more interesting, but
doesn't seem important enough to deal with.
- Added a commit renaming datetime.h symbols so they don't conflict with
LLVM variables anymore, removing ugly #undef PM/#define PM dance
around includes. Will post separately.
- Reduced the number of pointer constants in the generated LLVM IR, by
doing more getelementptr accesses (stem from before the time types
were automatically synced)
- Increased number of comments a bit

There's a jit-before-rebase-2018-01-29 tag, for the state of the tree
before the rebase.

Regards,

Andres

Hi

I have successfully built the JIT branch against LLVM 4.0.1 on Debian testing.
This is not enough for Debian stable (LLVM 3.9 is the latest available there),
but it's a first step.
I've split the patch in four files. The first three fix the build issues, the
last one fixes a runtime issue.
I think they are small enough to not be a burden for you in your developments.
But if you don't want to carry these ifdefs right now, I maintain them in a
branch on a personal git and rebase as frequently as I can.

LLVM 3.9 support isn't going to be hard, but I prefer splitting. I also hope
this will help more people test this wonderful toy… :)

Regards

Pierre

Attachments:

0001-Add-support-for-LLVM4-in-llvmjit.c.patchtext/x-patch; charset=UTF-8; name=0001-Add-support-for-LLVM4-in-llvmjit.c.patchDownload
From 770104331a36a8d207053227b850396f1392939a Mon Sep 17 00:00:00 2001
From: Pierre <pierre.ducroquet@people-doc.com>
Date: Fri, 2 Feb 2018 09:11:55 +0100
Subject: [PATCH 1/4] Add support for LLVM4 in llvmjit.c

---
 src/backend/lib/llvmjit.c | 24 +++++++++++++++++++++---
 1 file changed, 21 insertions(+), 3 deletions(-)

diff --git a/src/backend/lib/llvmjit.c b/src/backend/lib/llvmjit.c
index 8e5ba94c98..d0c5537610 100644
--- a/src/backend/lib/llvmjit.c
+++ b/src/backend/lib/llvmjit.c
@@ -230,12 +230,19 @@ llvm_get_function(LLVMJitContext *context, const char *funcname)
 
 		addr = 0;
 		if (LLVMOrcGetSymbolAddressIn(handle->stack, &addr, handle->orc_handle, mangled))
-			elog(ERROR, "failed to lookup symbol");
+			elog(ERROR, "failed to lookup symbol %s", mangled);
 		if (addr)
 			return (void *) addr;
 	}
 #endif
 
+#if LLVM_VERSION_MAJOR < 5
+	if ((addr = LLVMOrcGetSymbolAddress(llvm_opt0_orc, mangled)))
+		return (void *) addr;
+	if ((addr = LLVMOrcGetSymbolAddress(llvm_opt3_orc, mangled)))
+		return (void *) addr;
+	elog(ERROR, "failed to lookup symbol %s for %s", mangled, funcname);
+#else
 	if (LLVMOrcGetSymbolAddress(llvm_opt0_orc, &addr, mangled))
 		elog(ERROR, "failed to lookup symbol");
 	if (addr)
@@ -244,7 +251,7 @@ llvm_get_function(LLVMJitContext *context, const char *funcname)
 		elog(ERROR, "failed to lookup symbol");
 	if (addr)
 		return (void *) addr;
-
+#endif
 	elog(ERROR, "failed to JIT: %s", funcname);
 
 	return NULL;
@@ -380,11 +387,21 @@ llvm_compile_module(LLVMJitContext *context)
 	 * faster instruction selection mechanism is used.
 	 */
 	{
-		LLVMSharedModuleRef smod;
 		instr_time tb, ta;
 
 		/* emit the code */
 		INSTR_TIME_SET_CURRENT(ta);
+#if LLVM_VERSION < 5
+		orc_handle = LLVMOrcAddEagerlyCompiledIR(compile_orc, context->module,
+										llvm_resolve_symbol, NULL);
+		if (!orc_handle)
+		{
+			elog(ERROR, "failed to jit module");
+		}
+#else
+		LLVMSharedModuleRef smod;
+
+		LLVMSharedModuleRef smod;
 		smod = LLVMOrcMakeSharedModule(context->module);
 		if (LLVMOrcAddEagerlyCompiledIR(compile_orc, &orc_handle, smod,
 										llvm_resolve_symbol, NULL))
@@ -392,6 +409,7 @@ llvm_compile_module(LLVMJitContext *context)
 			elog(ERROR, "failed to jit module");
 		}
 		LLVMOrcDisposeSharedModuleRef(smod);
+#endif
 		INSTR_TIME_SET_CURRENT(tb);
 		INSTR_TIME_SUBTRACT(tb, ta);
 		ereport(DEBUG1, (errmsg("time to emit: %.3fs",
-- 
2.15.1

0002-Add-LLVM4-support-in-llvmjit_error.cpp.patchtext/x-patch; charset=UTF-8; name=0002-Add-LLVM4-support-in-llvmjit_error.cpp.patchDownload
From 079ad7087e2ab106c0f04fa9056c93afa9a43b7c Mon Sep 17 00:00:00 2001
From: Pierre <pierre.ducroquet@people-doc.com>
Date: Fri, 2 Feb 2018 09:13:40 +0100
Subject: [PATCH 2/4] Add LLVM4 support in llvmjit_error.cpp

---
 src/backend/lib/llvmjit_error.cpp | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/src/backend/lib/llvmjit_error.cpp b/src/backend/lib/llvmjit_error.cpp
index 70cecd114b..04e51b2a31 100644
--- a/src/backend/lib/llvmjit_error.cpp
+++ b/src/backend/lib/llvmjit_error.cpp
@@ -56,7 +56,9 @@ llvm_enter_fatal_on_oom(void)
 	if (fatal_new_handler_depth == 0)
 	{
 		old_new_handler = std::set_new_handler(fatal_system_new_handler);
+#if LLVM_VERSION_MAJOR > 4
 		llvm::install_bad_alloc_error_handler(fatal_llvm_new_handler);
+#endif
 		llvm::install_fatal_error_handler(fatal_llvm_error_handler);
 	}
 	fatal_new_handler_depth++;
@@ -72,7 +74,9 @@ llvm_leave_fatal_on_oom(void)
 	if (fatal_new_handler_depth == 0)
 	{
 		std::set_new_handler(old_new_handler);
+#if LLVM_VERSION_MAJOR > 4
 		llvm::remove_bad_alloc_error_handler();
+#endif
 		llvm::remove_fatal_error_handler();
 	}
 }
@@ -87,7 +91,9 @@ llvm_reset_fatal_on_oom(void)
 	if (fatal_new_handler_depth != 0)
 	{
 		std::set_new_handler(old_new_handler);
+#if LLVM_VERSION_MAJOR > 4
 		llvm::remove_bad_alloc_error_handler();
+#endif
 		llvm::remove_fatal_error_handler();
 	}
 	fatal_new_handler_depth = 0;
-- 
2.15.1

0003-Add-LLVM4-support-in-llvmjit_inline.cpp.patchtext/x-patch; charset=UTF-8; name=0003-Add-LLVM4-support-in-llvmjit_inline.cpp.patchDownload
From 51cc99259dc28120309e2a99f8585907d0baae06 Mon Sep 17 00:00:00 2001
From: Pierre <pierre.ducroquet@people-doc.com>
Date: Fri, 2 Feb 2018 09:23:56 +0100
Subject: [PATCH 3/4] Add LLVM4 support in llvmjit_inline.cpp

---
 src/backend/lib/llvmjit_inline.cpp | 36 ++++++++++++++++++++++++++++++++++--
 1 file changed, 34 insertions(+), 2 deletions(-)

diff --git a/src/backend/lib/llvmjit_inline.cpp b/src/backend/lib/llvmjit_inline.cpp
index 151198547a..8a747cbfc0 100644
--- a/src/backend/lib/llvmjit_inline.cpp
+++ b/src/backend/lib/llvmjit_inline.cpp
@@ -100,6 +100,13 @@ llvm_inline(LLVMModuleRef M)
 	llvm_execute_inline_plan(mod, globalsToInline.get());
 }
 
+#if LLVM_VERSION_MAJOR < 5
+bool operator!(const llvm::ValueInfo &vi) {
+	return !(  (vi.Kind == llvm::ValueInfo::VI_GUID && vi.TheValue.Id)
+		|| (vi.Kind == llvm::ValueInfo::VI_Value && vi.TheValue.GV));
+}
+#endif
+
 /*
  * Build information necessary for inlining external function references in
  * mod.
@@ -146,7 +153,14 @@ llvm_build_inline_plan(llvm::Module *mod)
 		if (threshold == -1)
 			continue;
 
+#if LLVM_VERSION_MAJOR > 4
 		llvm::ValueInfo funcVI = llvm_index->getValueInfo(funcGUID);
+#else
+		const llvm::const_gvsummary_iterator &I = llvm_index->findGlobalValueSummaryList(funcGUID);
+		if (I == llvm_index->end())
+			continue;
+		llvm::ValueInfo funcVI = llvm::ValueInfo(I->first);
+#endif
 
 		/* if index doesn't know function, we don't have a body, continue */
 		if (!funcVI)
@@ -157,7 +171,12 @@ llvm_build_inline_plan(llvm::Module *mod)
 		 * look up module(s), check if function actually is defined (there
 		 * could be hash conflicts).
 		 */
+#if LLVM_VERSION_MAJOR > 4
 		for (const auto &gvs : funcVI.getSummaryList())
+#else
+		auto it_gvs = llvm_index->findGlobalValueSummaryList(funcVI.getGUID());
+		for (const auto &gvs: it_gvs->second)
+#endif
 		{
 			const llvm::FunctionSummary *fs;
 			llvm::StringRef modPath = gvs->modulePath();
@@ -318,9 +337,14 @@ llvm_execute_inline_plan(llvm::Module *mod, ImportMapTy *globalsToInline)
 
 		}
 
+#if LLVM_VERSION_MAJOR > 4
+#define IRMOVE_PARAMS , /*IsPerformingImport=*/false
+#else
+#define IRMOVE_PARAMS , /*LinkModuleInlineAsm=*/false, /*IsPerformingImport=*/false
+#endif
 		if (Mover.move(std::move(importMod), GlobalsToImport.getArrayRef(),
-					   [](llvm::GlobalValue &, llvm::IRMover::ValueAdder) {},
-					   /*IsPerformingImport=*/false))
+					   [](llvm::GlobalValue &, llvm::IRMover::ValueAdder) {}
+					   IRMOVE_PARAMS))
 			elog(ERROR, "function import failed with linker error");
 	}
 }
@@ -619,9 +643,17 @@ llvm_load_index(void)
 				elog(ERROR, "failed to open %s: %s", subpath,
 					 EC.message().c_str());
 			llvm::MemoryBufferRef ref(*MBOrErr.get().get());
+#if LLVM_VERSION_MAJOR > 4
 			llvm::Error e = llvm::readModuleSummaryIndex(ref, *index, 0);
 			if (e)
 				elog(ERROR, "could not load summary at %s", subpath);
+#else
+			std::unique_ptr<llvm::ModuleSummaryIndex> subindex = std::move(llvm::getModuleSummaryIndex(ref).get());
+			if (!subindex)
+				elog(ERROR, "could not load summary at %s", subpath);
+			else
+				index->mergeFrom(std::move(subindex), 0);
+#endif
 		}
 	}
 
-- 
2.15.1

0004-Don-t-emit-bitcode-depending-on-an-LLVM-5-function.patchtext/x-patch; charset=UTF-8; name=0004-Don-t-emit-bitcode-depending-on-an-LLVM-5-function.patchDownload
From 77ee0a7bf15b2c962006b8a1d585f35830280eaf Mon Sep 17 00:00:00 2001
From: Pierre <pierre.ducroquet@people-doc.com>
Date: Fri, 2 Feb 2018 10:34:09 +0100
Subject: [PATCH 4/4] Don't emit bitcode depending on an LLVM 5+ function

---
 src/backend/executor/execExprCompile.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/backend/executor/execExprCompile.c b/src/backend/executor/execExprCompile.c
index 4d6304f748..d129ea7828 100644
--- a/src/backend/executor/execExprCompile.c
+++ b/src/backend/executor/execExprCompile.c
@@ -173,7 +173,11 @@ get_LifetimeEnd(LLVMModuleRef mod)
 	LLVMTypeRef sig;
 	LLVMValueRef fn;
 	LLVMTypeRef param_types[2];
+#if LLVM_VERSION_MAJOR > 4
 	const char *nm = "llvm.lifetime.end.p0i8";
+#else
+	const char *nm = "llvm.lifetime.end";
+#endif
 
 	fn = LLVMGetNamedFunction(mod, nm);
 	if (fn)
-- 
2.15.1

#106Andres Freund
andres@anarazel.de
In reply to: Thomas Munro (#99)
Re: JIT compiling with LLVM v9.0

Hi,

On 2018-02-02 18:22:34 +1300, Thomas Munro wrote:

The clang that was used for bitcode was the system /usr/bin/clang,
version 4.0. Is it a problem that I used that for compiling the
bitcode, but LLVM5 for JIT? I actually tried
CLANG=/usr/local/llvm50/bin/clang but ran into weird failures I
haven't got to the bottom of at ThinLink time so I couldn't get as far
as a running system.

You're using thinlto to compile pg? Could you provide what you pass to
configure for that? IIRC I tried that a while ago and ran into some
issues with us creating archives (libpgport, libpgcommon).

Greetings,

Andres Freund

#107Pierre Ducroquet
p.psql@pinaraf.info
In reply to: Pierre Ducroquet (#105)
2 attachment(s)
Re: JIT compiling with LLVM v9.1

On Friday, February 2, 2018 10:48:16 AM CET Pierre Ducroquet wrote:

On Monday, January 29, 2018 10:53:50 AM CET Andres Freund wrote:

Hi,

On 2018-01-23 23:20:38 -0800, Andres Freund wrote:

== Code ==

As the patchset is large (500kb) and I'm still quickly evolving it, I do
not yet want to attach it. The git tree is at

https://git.postgresql.org/git/users/andresfreund/postgres.git

in the jit branch

https://git.postgresql.org/gitweb/?p=users/andresfreund/postgres.git;a
=s
hortlog;h=refs/heads/jit

I've just pushed an updated and rebased version of the tree:
- Split the large "jit infrastructure" commits into a number of smaller

commits

- Split the C++ file
- Dropped some of the performance stuff done to heaptuple.c - that was

mostly to make performance comparisons a bit more interesting, but
doesn't seem important enough to deal with.

- Added a commit renaming datetime.h symbols so they don't conflict with

LLVM variables anymore, removing ugly #undef PM/#define PM dance
around includes. Will post separately.

- Reduced the number of pointer constants in the generated LLVM IR, by

doing more getelementptr accesses (stem from before the time types
were automatically synced)

- Increased number of comments a bit

There's a jit-before-rebase-2018-01-29 tag, for the state of the tree
before the rebase.

Regards,

Andres

Hi

I have successfully built the JIT branch against LLVM 4.0.1 on Debian
testing. This is not enough for Debian stable (LLVM 3.9 is the latest
available there), but it's a first step.
I've split the patch in four files. The first three fix the build issues,
the last one fixes a runtime issue.
I think they are small enough to not be a burden for you in your
developments. But if you don't want to carry these ifdefs right now, I
maintain them in a branch on a personal git and rebase as frequently as I
can.

LLVM 3.9 support isn't going to be hard, but I prefer splitting. I also hope
this will help more people test this wonderful toy… :)

Regards

Pierre

For LLVM 3.9, only small changes were needed.
I've attached the patches to this email.
I only did very basic, primitive testing, but it seems to work.
I'll do more testing in the next days.

Pierre

Attachments:

0001-Fix-building-with-LLVM-3.9.patchtext/x-patch; charset=UTF-8; name=0001-Fix-building-with-LLVM-3.9.patchDownload
From 5ca9594a7f52b7daab8562293010fe8c807107ee Mon Sep 17 00:00:00 2001
From: Pierre <pierre.ducroquet@people-doc.com>
Date: Fri, 2 Feb 2018 11:29:45 +0100
Subject: [PATCH 1/2] Fix building with LLVM 3.9

---
 src/backend/lib/llvmjit_inline.cpp | 23 +++++++++++++++++++++--
 1 file changed, 21 insertions(+), 2 deletions(-)

diff --git a/src/backend/lib/llvmjit_inline.cpp b/src/backend/lib/llvmjit_inline.cpp
index 8a747cbfc0..a785261bea 100644
--- a/src/backend/lib/llvmjit_inline.cpp
+++ b/src/backend/lib/llvmjit_inline.cpp
@@ -37,7 +37,12 @@ extern "C"
 #include <llvm/ADT/StringSet.h>
 #include <llvm/ADT/StringMap.h>
 #include <llvm/Analysis/ModuleSummaryAnalysis.h>
+#if LLVM_MAJOR_VERSION > 3
 #include <llvm/Bitcode/BitcodeReader.h>
+#else
+#include "llvm/Bitcode/ReaderWriter.h"
+#include "llvm/Support/Error.h"
+#endif
 #include <llvm/IR/CallSite.h>
 #include <llvm/IR/DebugInfo.h>
 #include <llvm/IR/IntrinsicInst.h>
@@ -100,7 +105,12 @@ llvm_inline(LLVMModuleRef M)
 	llvm_execute_inline_plan(mod, globalsToInline.get());
 }
 
-#if LLVM_VERSION_MAJOR < 5
+#if LLVM_VERSION_MAJOR < 4
+bool operator!(const llvm::ValueInfo &vi) {
+	return !(  (vi.Kind == llvm::ValueInfo::VI_GUID && vi.TheValue.Id)
+		|| (vi.Kind == llvm::ValueInfo::VI_Value && vi.TheValue.V));
+}
+#elif LLVM_VERSION_MAJOR < 5
 bool operator!(const llvm::ValueInfo &vi) {
 	return !(  (vi.Kind == llvm::ValueInfo::VI_GUID && vi.TheValue.Id)
 		|| (vi.Kind == llvm::ValueInfo::VI_Value && vi.TheValue.GV));
@@ -188,12 +198,15 @@ llvm_build_inline_plan(llvm::Module *mod)
 				 funcName.data(),
 				 modPath.data());
 
+// XXX Missing in LLVM < 4.0 ?
+#if LLVM_VERSION_MAJOR > 3
 			if (gvs->notEligibleToImport())
 			{
 				elog(DEBUG1, "uneligible to import %s due to summary",
 					 funcName.data());
 				continue;
 			}
+#endif
 
 			if ((int) fs->instCount() > threshold)
 			{
@@ -339,8 +352,10 @@ llvm_execute_inline_plan(llvm::Module *mod, ImportMapTy *globalsToInline)
 
 #if LLVM_VERSION_MAJOR > 4
 #define IRMOVE_PARAMS , /*IsPerformingImport=*/false
-#else
+#elif LLVM_VERSION_MAJOR > 3
 #define IRMOVE_PARAMS , /*LinkModuleInlineAsm=*/false, /*IsPerformingImport=*/false
+#else
+#define IRMOVE_PARAMS
 #endif
 		if (Mover.move(std::move(importMod), GlobalsToImport.getArrayRef(),
 					   [](llvm::GlobalValue &, llvm::IRMover::ValueAdder) {}
@@ -648,7 +663,11 @@ llvm_load_index(void)
 			if (e)
 				elog(ERROR, "could not load summary at %s", subpath);
 #else
+#if LLVM_VERSION_MAJOR > 3
 			std::unique_ptr<llvm::ModuleSummaryIndex> subindex = std::move(llvm::getModuleSummaryIndex(ref).get());
+#else
+			std::unique_ptr<llvm::ModuleSummaryIndex> subindex = std::move(llvm::getModuleSummaryIndex(ref, [](const llvm::DiagnosticInfo &) {}).get());
+#endif
 			if (!subindex)
 				elog(ERROR, "could not load summary at %s", subpath);
 			else
-- 
2.15.1

0002-Fix-segfault-with-LLVM-3.9.patchtext/x-patch; charset=UTF-8; name=0002-Fix-segfault-with-LLVM-3.9.patchDownload
From be1f76a141ab346b6ba8d9e8b38c81a40a427dc7 Mon Sep 17 00:00:00 2001
From: Pierre <pierre.ducroquet@people-doc.com>
Date: Fri, 2 Feb 2018 11:29:57 +0100
Subject: [PATCH 2/2] Fix segfault with LLVM 3.9

---
 src/backend/lib/llvmjit.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/backend/lib/llvmjit.c b/src/backend/lib/llvmjit.c
index d0c5537610..ad9582182f 100644
--- a/src/backend/lib/llvmjit.c
+++ b/src/backend/lib/llvmjit.c
@@ -462,12 +462,12 @@ llvm_session_initialize(void)
 
 	cpu = LLVMGetHostCPUName();
 	llvm_opt0_targetmachine =
-		LLVMCreateTargetMachine(llvm_targetref, llvm_triple, cpu, NULL,
+		LLVMCreateTargetMachine(llvm_targetref, llvm_triple, cpu, "",
 								LLVMCodeGenLevelNone,
 								LLVMRelocDefault,
 								LLVMCodeModelJITDefault);
 	llvm_opt3_targetmachine =
-		LLVMCreateTargetMachine(llvm_targetref, llvm_triple, cpu, NULL,
+		LLVMCreateTargetMachine(llvm_targetref, llvm_triple, cpu, "",
 								LLVMCodeGenLevelAggressive,
 								LLVMRelocDefault,
 								LLVMCodeModelJITDefault);
-- 
2.15.1

#108Jeff Davis
pgsql@j-davis.com
In reply to: Andres Freund (#50)
Re: JIT compiling with LLVM v9.1

On Mon, Jan 29, 2018 at 1:53 AM, Andres Freund <andres@anarazel.de> wrote:

https://git.postgresql.org/git/users/andresfreund/postgres.git

There's a patch in there to change the scan order. I suggest that you
rename the GUC "synchronize_seqscans" to something more generic like
"optimize_scan_order", and use it to control your feature as well
(after all, it's the same trade-off: weird scan order vs.
performance). Then, go ahead and commit it. FWIW I see about a 7%
boost on my laptop[1]Simple scan with simple predicate on 50M tuples, after pg_prewarm. from that patch on master, without JIT or
anything else.

I also see you dropped "7ae518bf Centralize slot deforming logic a
bit.". Was that intentional? Do we want it? I think I saw about a 2%
gain here over master, but when I applied it on top of the fast scans
it did not seem to add anything on top of fast scans. Seems
reproducible, but I don't have an explanation.

And you are probably already working on this, but it would be helpful
to get the following two patches in also:
* 3c22065f Do execGrouping via expression eval
* a9dde4aa Allow tupleslots to have a fixed tupledesc

I took a brief look at those two, but will review them in more detail.

Regards,
Jeff Davis

[1]: Simple scan with simple predicate on 50M tuples, after pg_prewarm.

#109Andres Freund
andres@anarazel.de
In reply to: Jeff Davis (#108)
Re: JIT compiling with LLVM v9.1

Hi,

On 2018-02-02 18:21:12 -0800, Jeff Davis wrote:

On Mon, Jan 29, 2018 at 1:53 AM, Andres Freund <andres@anarazel.de> wrote:

https://git.postgresql.org/git/users/andresfreund/postgres.git

There's a patch in there to change the scan order.

Yes - note it's "deactivated" at the moment in the series. I primarily
have it in there because I found profiles to be a lot more useful if
it's enabled, as otherwise the number of cache misses and related stalls
from heap accesses completely swamp everything else.

FWIW, there's http://archives.postgresql.org/message-id/20161030073655.rfa6nvbyk4w2kkpk%40alap3.anarazel.de

I suggest that you rename the GUC "synchronize_seqscans" to something
more generic like "optimize_scan_order", and use it to control your
feature as well (after all, it's the same trade-off: weird scan order
vs. performance). Then, go ahead and commit it. FWIW I see about a 7%
boost on my laptop[1] from that patch on master, without JIT or
anything else.

Yea, that's roughly the same magnitude of what I'm seeing, some queries
even bigger.

I'm not sure I want to commit this right now - ISTM we couldn't default
this to on without annoying a lot of people, and letting the performance
wins on the table by default seems like a shame. I think we should
probably either change the order we store things on the page by default
or only use the faster order if the scan above doesn't care about order
- the planner could figure that out easily.

I personally don't think it is necessary to get this committed at the
same time as the JIT stuff, so I'm not planning to push very hard on
that front. Should you be interested in taking it up, please feel
entirely free.

I also see you dropped "7ae518bf Centralize slot deforming logic a
bit.". Was that intentional? Do we want it?

The problem is that there's probably some controversial things in
there. I think the checks I dropped largely make no sense, but I don't
really want to push for that hard. I suspect we probably still want it,
but I do not want to put into the critical path right now.

I think I saw about a 2% gain here over master, but when I applied it
on top of the fast scans it did not seem to add anything on top of
fast scans. Seems reproducible, but I don't have an explanation.

Yea, that makes sense. The primary reason the patch is beneficial is
that it centralizes the place where the HeapTupleHeader is accessed to a
single piece of code (slot_deform_tuple()). In a lot of cases that first
access will result in a cache miss in all layers, requiring a memory
access. In slot_getsomeattrs() there's very little that can be done in
an out-of-order manner, whereas slot_deform_tuple() can continue
execution a bit further. Also, the latter will then go and sequentially
access the rest (or a significant part of) the tuple, so a centralized
access is more prefetchable.

And you are probably already working on this, but it would be helpful
to get the following two patches in also:
* 3c22065f Do execGrouping via expression eval
* a9dde4aa Allow tupleslots to have a fixed tupledesc

Yes, I plan to resume working in whipping them up into shape as soon as
I've finished the move to a shared library. This weekend I'm at fosdem,
so that's going to be after...

Thanks for looking!

Andres Freund

#110Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#109)
Re: JIT compiling with LLVM v9.1

Hi,

On 2018-02-03 01:13:21 -0800, Andres Freund wrote:

On 2018-02-02 18:21:12 -0800, Jeff Davis wrote:

I think I saw about a 2% gain here over master, but when I applied it
on top of the fast scans it did not seem to add anything on top of
fast scans. Seems reproducible, but I don't have an explanation.

Yea, that makes sense. The primary reason the patch is beneficial is
that it centralizes the place where the HeapTupleHeader is accessed to a
single piece of code (slot_deform_tuple()). In a lot of cases that first
access will result in a cache miss in all layers, requiring a memory
access. In slot_getsomeattrs() there's very little that can be done in
an out-of-order manner, whereas slot_deform_tuple() can continue
execution a bit further. Also, the latter will then go and sequentially
access the rest (or a significant part of) the tuple, so a centralized
access is more prefetchable.

Oops missed part of the argument here: The reason that isn't that large
an effect anymore with the scan order patch applied is that suddenly the
accesses are, due to the better scan order, more likely to be cacheable
and prefetchable. So in that case the few additional instructions and
branches in slot_getsomeattrs/slot_getattr don't hurt as much
anymore. IIRC I could still show it up, but it's a much smaller win.

Greetings,

Andres Freund

#111Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Andres Freund (#22)
10 attachment(s)
Re: JIT compiling with LLVM v9.0

Hi,

I've done some initial benchmarking on the branch over the last couple
of days, focusing on analytics workloads using the DBT-3 benchmark.
Attached are two spreadsheets with results from two machines (the same
two I use for all benchmarks), and a couple of charts illustrating the
impact of enabling different JIT options.

I did the tests with 10GB and 50GB data sets (load into database
generally increases the size by a factor of 2-3x). So at least on the
larger machine the 10GB dataset should be fully in memory. The numbers
are medians for 10 consecutive runs of each query, so the data tends to
be well cached.

In this round of tests I've disabled parallelism. Based on discussion
with Andres I've decided to repeat the tests with parallel queries
enabled - that's running now, and will take some time to complete.

According to the results, most of the DBT-3 queries see slight
improvement in the 5-10% range, but the JIT options vary depending on
the query. What surprised me quite a bit is that the improvement is way
more significant on the 50GB dataset (on both machines). I have expected
the opposite behavior, i.e. that the JIT impact will be more obvious on
the small dataset and then will diminish as I/O becomes more prominent.
Yet that's not the case, apparently. One possible explanation is that on
the 50GB data set the queries switch to plans that are more sensitive to
the JIT optimizations.

A couple of queries saw much more significant improvements - Q1 and Q20
got about 30%-40% faster, and I have no problem believing that other
queries may see even more significant benefits.

Other queries (Q19 and Q21) saw regressions - for Q19 it's relatively
harmless, I think. It's a short query and so the relative slowdown seems
somewhat worse that in absolute terms. Not sure what's going on for Q21,
though. But I think we'll need to look at the costing model, and try
tweaking it to make the right decision in those cases.

regards

--
Tomas Vondra http://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Attachments:

jit-results-bench.odsapplication/vnd.oasis.opendocument.spreadsheet; name=jit-results-bench.odsDownload
PK�[CL�l9�..mimetypeapplication/vnd.oasis.opendocument.spreadsheetPK�[CLPb^x��Thumbnails/thumbnail.png�PNG


IHDR��.xqfPLTE			"""---333<<<@@@KKKRRR[[[ccckkksss{{{���������������������������������������������������_���FIDATx��]�r����n�,�����_E�s'�A���\%U�t��8L�'����?H�����S�������}7�s.�N�8x�8����I�`�kA�fD��-��F5/|��^YX X}�"�h��Wkes������P��@�7/Y���HE;V$�P�<-�KB��eD���#kI����=���"��Z��uKTq|���e��#�+;�uOdgye>���Q�U�i����w#I����3�;��0������������^��e?���~�z�QFcZ�MXXm��T�����]��x��.�����j��P�m���z^�_����sL���
���������?�?�yMB��D�k\�#D���7�xa�q�Ome��;��O�o�p�;��?Z�V�`|��\�;�{�D��� �	�=�V�v�[�.����B��iA��C.��TPj�TJ�O{Ao��NZ>��~7��
�0���h����0E]E����`�?�=-�5��J��C�F���W#�6��o4)���,�x&�6?~c�2�:EBL%��Z{�O�/���ML�M�Z>LR6��&Yf��X�������bH%�O�H4����D#z�%�vTC��2� ���>U�
���,�2�+��N-#��au4^BaD�^����������G�%F�tq0f:F��nUN���	e��|��p���$���5F"QG|Q���P����n2����F�jJ�]�nM�"=��+<���_���w�[������b�jXpQJ��Z�G���N��;�U��s����e6�+��P��e����.�� �(�������-�����KZ�]#����J�leq��s��2��Ih8�V���d7�#���NW���B��p?�%-���1�*Fn����P��VT����p�:9'3���\��H��'��;�G���D:o�����h��u�����(�4-JS�^���{���x�S�Y�En�M��3��2	Q�4��)�������{��x��TR��%�0���Xj	����kC�����(d���H��AT�����`"��M�Fc�2
���f�u(��)�1*t�
���A��L��e>��_z���
������7�h�$b2/yt�����x�0L6�[y����!��)��Z�D,�7���|lz�S������Qk���L!���s��BZ�M���#~�8���3$��l������!�r	�A�=>}���7��q���4��P���������&�a}��A��_%2�8I��qO���MG�" H��r}��g�U5a��k�.���J��{��6��F��m�qL��C��$w��.����"_��M3�����h��^���b�PP`��6�������A��{k(�"�HW.v�_� �E NPZ���O��d���?�E�
fN�������-qQ�{������Z��L���^kC����X��W�z`:����Mf%~T+�D��[v�6���Q��`����7������
��~%�A�nD���v&��\�Q#�<�S��o����������M�RN������f�Rn/�n}��<\��;�-1rf1hn������"c*�%������.��0�0D�"�����_S����T����L�&x����(�������i�QA�{��
�h���A��@����~#�|�B�H�E?���8}���.��
��x�0hC�3�qj��XIE��A�f3�g>?zT"�����F�y�rC�-���v��O'�[����*
[�� �BF�:�C� ]�$��d�ID3������[�s"k�t�S���#�T�����:>��eD�Hwb����]�������:��eu��M��
"�e�$�B�sN���V��bkt�>^����i��N"���?�]����{�mn���b�J�����.���[0T�Tt5����?�/�,l��q8	
c���}=��R�;\"D���4b����<o>���9]74e��{�u\;d��d�,�0�zP>6���z;ne@���C���?��I���6�_zu4q��B�~�4�NS���V���t�}.McQ������PQL3
��v�	_��R�e<�����?*��f\t[��U�X�lCq�����7!��
�V���@@�����j�f�D�=
C����I�aw��+����t4F�	p&��B���?������;�e�l' �Pe�l�'��v�Q�4��
%D��B;��������7?��i��ew������_%��]���!d$lq���!�"{W�P{���zZM�"T��h��	�j]o��.�{��^x+���o�=06����*3���>�������K�,��?��%`�=^����oJSa�-����?6���Jwe�����7�.��,t��w��g~��b�)^���x'{1C�{���;����n+8`l�IRvq>���������g�7�O;�
�g����E�y��
!@��<H���s���xS����z7D��eV��|�"]��N���
��n����3��}���n���>9n	�r8��$���0��x���^5��#�^�
��%�}	s����yM�-�s�����B��J���(	��9:���O�>�E���t���j���xX������
�fLC4?��4��0�7��b���WtW<T���x��0n(�<��~2����7[�������Sh0�C����j�EL�1<��s�����I�����Slt�UX�y��������t����E�"��gG��A��������?��m�G���M7����Vx�=�K�A>�F��x+���	8t���8������!co��eo�ZJ=}�_hB	���p��	A�R�x����?�����6��$��1�:t��j2�t����L}��a�7Jv�;���Lb��<bW�F[H�2e���o��^��@������G����v>��?�-�o�a����1��x���q
��N���d�<�L�Z���(��ku��N�ADfX�A*�8�����
k��9U��
����D��q|u��w��o�w�1�>�=w��B�7%����5�������������}y|A���I�@m�V0�%k�Aq����v��n��gJ<�
���S�v�4qD�������:h�k�9�7h���3?v�W�Y�.����u�c=�<�������u�I>�u�G�����z�F��U��5����v�:n�c�8�j������&�	�^=�9�wYuEu�b�+��
r�G90&5NS;Cd����~C����?���1�Gf���o��.9�!�@8�X0�f���'K�� �9����K���.�W,��v 5L�VH_>��l@Qc����g=��h�a>[����Lm]>���u�_o�g�Q�{����x
D��eL��#�=������������\d���X>�H�E����?���������m2U���un�3��7M.�$7����nx�R��G}�������3�k���
e)�(N� }��w_��`>���V��T���u���f��aMK�b�g~�b�ZA>��"����T����������4��/���#Uo��Z�����5�K`�H���0������m-�X8���q/&�x��\:[i�+~t��vxk��������Rj)���r/i���An�*�CW��N����,zu=�zo�n�' +Q*��?�������1�@�F���6�
^^�Hm��n(p�j�$4�m���P��^#�q^������[��L%��c ]r1~�R���e�^2g'��_%����n	o�]����1K�#����1�^<cG�Q?�1q��W�W���3Q(��G����
r�R�LC�b4vq�W��^x{���;al����-�G��]mv�q����{/�%�y�o{d�Z[Z^�B|��!�oO}����e>�S���m�p.����N+��?'�-��`�����DZ�;�;T�3~�ab������<���AA J'�o
x��.yt�����x�Pf}1^/lw��3j�D��]�>Eu��M����|�v�E)�^]��d�i�J�a�GQ����VUqI���dE�t�������v���C�k��)��|�]��A���O�#���Q�C�������|@E�~@�����AC��'^��yu���_���p6;��M3�!��?�8a��4�TZ���t�g�T�:�z�J:�;vgr=���JBp�z�AiKV������]x����q���_��'
���,��DV?������7/��	�R�,��L�jE��no�R��=e���y��[S������q���,�q2�T*nu(�h�Y-��i_�d���������E=oS|e(��P���9�-;��d������8F4��{�j�Ur!����!���<�.�C�;���?��)_����D���)S������o�WS���U(r���G�.q& B�^$D'���}w���-u\,���-��W���Y$�Bb}���/���G|��$��B�f��X��h����u��n����.����r��8T�0����>I�
n����0�1Gc��������{�q�<�B �������_�9���������������?�����A������u]x/���������s������g^?��x�~*9\w���S��4�h|��
�������Yx��F*�s�X�h9���v�K%���L%U���b�����������H��F��Z�N����U���
��#q����b���_�W���G'RZW�/��#�p�/��_�a�.l����5#
��NT"Qw"3��q����;�k����%�d^q�=�����~��~�s_������?�������������7����_�H/�oF�[F�����r]�,U����"����[��o�������������]�P�����G�a�X�Ar!f����W���f�=`y�S��v��9����k_�_���&�D�&�t��{C���o-������I�>�����`���������o����u�W�{RS�i��m6��������W��b�q��i\�{G7q��j�������F����-���n<�2'�b�|���v�j�7��+C�(e�m��_�o��^*��gR��kj�=5��x�/��p�R��p���=����q�k
���4��]��*��7�������p�w���FIEND�B`�PK�[CLObject 5/content.xml�]]o�8�}�_d0������l*�����ZL��L0�bYv�-[^I�$����D�t,�m�������G�����������yU]})������q����u^�����������?���m�X�yq3���U����^w��W��u{�_}w���o��-��u�*��.��7���u��q\=�v/�������]��{�m������w������m[#jx��>����J�Q}���r����\������67����S�D��Y���z����c��cS�V�|VT�%kg8�3�vUt������I���}�-M�e�z���<zD|YNH�?d��c�5������^:�]e��D���/������l�B�:�������rs��}�����GS�
�u������~:���)��	����Y�����}��vxfZ$�;L��o�h'n ������O>����o�C������7N�u�e��2���IO��)6u���,�����h�C��������.��|oSc���o&^��,������A�\�h����kF���`��f�lC|�W�E��6.��k��x�Mi/e���&zB8����G+W��(��E��������u�j��1����w��C�z>�qvj����w�D����7~���^K��h���$���g�cW��V������m�����W}4�����/t���j��*�����o^.���e|=����y�Dl�h^��*��M���!1s��=k�����W�M��qiR�<�f�&�670���E�*��i�oY6����1]Z4]Y�WvZ�G5�o��z�����a:�)$��C����n��
�������TI���fQ�Z�_�C)|��6����m��!��n4������z��]���y�|������z�����4���y=;i8^�\l@��Umr�?�S���o�(�����i!���E��{q+(:MP~���:��E�P���:���21d�U�q��H.���p�Y��M���X��"Yf��)�]?B�I�l�����X��x]���7	��A1�ekb�KRe�E�T���d��2���)�:T���y/�p��r��)�{#�o#�G��y1�eK�M�Ne�v;���Q�a���|G���l�Bg������<����z�;�a����W?}����F��i>�����]z,-Fo=��6zO\�_�����J�+t~S��E����������x�)�7,�b�*�+�'
�oZ�9%��y�.��E�R�q�]�<Q}�"�!��+�'J�oXdE�l���D>����3�`|W"�yA.rV��}-|_�I��D[W������6�-��=���k�f������z�2~p6��������x*��m$A)%8_��=v��t I%r�{U|���w�i�?w/+{i��W�y��� ��}�x<�v�����U���#S����i�R�~������l�>��5�W}z5�����y��?6���
mng�go�#D��)�r��5��	��f��1��?�b�O\=_}^wEu�7*2��	ze����T�b=�
?%�}������I�S�;���p{�����+���~w�b��MUwI����fU��;�-��1����yS���Sfl���b�?��?�?���+�	�����E��!k������0zl�D���n��0��J9��*��6����&���D��3��X}<	IS	�z���V!_�`m[�Z�-�qlU���}�E�4�*k^���]#�������gg~���:��YU�����uc���}F����o�l=<���~o_�{+��2�M���j;7}$�������������l���g������n&th�f����>���%��69�K�Ov���4r���W�79-�����}t�uS��n���f���|!�.��(��W��Ie~<K�'��������0������0���K(C�W��Ie~:K��&��������8������8���K(��W���2��R���2�.��8_��'���,e~�T��K(#�W���2��R��t2
��SVU�uQ�TwQ�|z+<y�.L��rR�����wT��b��4a�*y(�y����q�n�k=h�N�c/���Ol

��X���W6�7���������I��G��v��<��CM�v���6�]�W����m����w�6��m~wFfx;���������*�9��C����nN��Pm��;����>��@=/�����=�v��{���r���������w2�l�-���A.��[�������0�m�]GW�1�Q|��|����.p��T<��Cg,a�6K~_HJ�3;cy;���
��T
���;c�;�)�
b)e\�F��U��6�/R�Xa����3��C�?�7��Z`!g<t�Bz�X����sDE����X_����hc7���l��Xo��/�o���!o)���i�AG�������C@�,U���=�G�4%��XR��)*�U�Ap��Z��HD=�0>���G�C�A����a��H�������1R��1e�Aq�TK""��c��`3:�����#{�1D��� Fm�[`F�4�!0|J�R!�Q3B	A�u,�)#L����1����!W��x� 0FN��=t�
���!`|R�cE{�I���T3��l�#��P���Tc�������HbS:�Q�� �d�c4��<��1(N�b�y�G�!(Fe�M�(�1(NlG'	�.A1�D���y�Xh�P�d�Y�)&;9u�AqR�����!H/1S���P�k2[i��@��R*�������	��jO�kT<�����XHV7�U�x�����X����12���u�G��L(�=����
-cM{�Qhm��4	��,���b����"L�F�b� �L@���5D��}������
�������h�CP^�����#/=�i*0�v8{NY!)"������;NZn�`%5��$�����z��)��D���4����; p>b,�����8q���Q<18]�"��cp�\3�v8{��!N��.[�Sr!pL�������
(i")�,L<����7���TkE�E|��qJ1�^�����R�"M�����q��
pT�zl������!�����p;jY��J2
#Z�|�3� b�C��0S����������@����C�P�����a8!0F�,k3����A(8����PF�w��c:&���t1�����N|��d�������Q�����G��L2��-���im2����A��h�J3n	;�#`I�dL�I�C��LeJN��9B`i-2�@8�F�9��F����2����&�q':�������C�a���2�2���<�����
��c�����"`|f&��A��� ����dT�����R��!0F{nY��=t��/Pu��<0����'5����;bP�&
Pe�[���Th~Gg������2�'��cp�*�%�Q����e)��E�#N�Bt����. B�����R�u=�'S�x��l@���JD|��B�����1J��c��$��4=���������hk�C��}�o���'5�{���	�t�9���Y$2�����=z�:B@z���*�;���I�x8QFHS�r*��_#�HR,�z�C���q���97s1����f%��|�\�$��&P\"�'*Vv�{���h�7�)�1�E��x�
DE��\�B8%,.Ut��������D5�����g���!P|j����@�i)�����dZ�b�M+�LI�aE;AT,�H�h&x�b�g	�EJU*�O�#�iW�cz�[���<*<�5BPU����Q\�{HS�\qN�
�-���~�Z����='��q<�h�\q������(5P��$eF��B����
E����y�L!;i8>�u�py�qMe�� ��cw�v��1 N�SNtt��Cp�L���q
��C��~j�3-�=�������W<�|�����,����R�����"�B��)���{���/�F|91�"m���2�2J�,w>���������XwI^�;����PK��S��PK�[CLObject 5/styles.xml��K�� ��9�KYc,+��)���LM� $SA�
�#� KA��PYJ����/�/c#w=�F��d�����bP
U_�����[�r�t����X�pe��?%7;'V�L�K�iE�a��
7�2-W���4	��?�Y�<�������=����������C���.����T�h$�1hZj���P?.����`<�~(��k��N'���������*���`���������G-��2��������nT'�7��ez��ru|�E�z�c=,�����C����<}G����\G8{�3*��h��q9v��/�Lk����b�[�v9H�>�.;��mo�����[g��e�������k>�>|^�����p�Vm�T�p������3KW���J��2��S�
n�����k�MTYy�{L���o���j-	.��Y���5	��Z�W�kLa������
�����=N�����L�
����Ct�PK�P���PK�[CLObject 5/meta.xml���n�0E��
�v�G���*R7��]d�@����	���(�����sF����p�+���J&��b��*�L����&"��!VE!8�\��Fi65f
���s)!��T�V�T�[j8U
����i:�'�J�����i(@��v��J����{�����t����V8&���.,�h�_��]+)�nA#>KOq��la�/t����w���a0d�m.������6��L��l5"���<F�4��K���Q:=�L��@`o����(dw=�G��nk��S��r�B�E;�!f^V�,`E�����x:��^���~�����~PK�A�5gPK�[CL
styles.xml�Zmo����_!(@���em����h��w@b����-QZ6�(���}��CJ����:k_�6��|8�y��#i�n�Sj�0�e����lg!�H�\�?��\�7�?]�8&!^G,,R�IG����3�.'���gk���X�e�f9���u��[�#Z����\-����Xa[k����5��:�h?w�����1���^P'fN��I����������2_��~�_����_�V���k\^p�QQ�b��f���k�)�h�~
�T)+�;�gS�$�y5�X�Uq9OPsM+�v����%#4�[�g���Ce��e�\�"�����	&�?�>���s�R�U!'�l3Kts=c�VU-(�]�x��[^7��I���yN�CD��q��8���w*�
�+�G%�����Z�x~�v�:U�2����f
4�Q4u�.�-$��#x��U���_���_�|�U�:��C��I}����2�J2�}�9QS��e���f�Pv���iHhV������A1�9�pHA��ucu+��X�!W|���9G�*P7�}�i`o��385cb'�!������Vy����?(��x�� H�,hJ����g�3������h�w����<bO�h!r"C(/;���
wZ���?��bZ�f�JB��9:}d["��x�2���q�:���+8��J'Y�n��8)(��z�/�n�cqY��
��,�1*h�������8!��6�q�p�o��
sI�W,�
RX�DDH���qy���*�����#��5EYR�fq�B(��v?��"��(����9����T�����X�7P|?-�mIWt=������s���'a�����)����}S�P������9:�-U��RZ��
VqkV� �ay��e�Q���E�;=K��\��[�&��;'^T8�B2�#,$���"�o��0/�P:*�V�D�Y�O2��q��S�I(��j1�1wR��|��,�"��uu���(=��Q���5�&���sCVMGy!�w	�+�y��������g�R�M��z/A~R�@yrf�Q,�4u�a�i�J���`������8?����}�����Qu��J����zvdUW)�t�����$D
PQo4 ��Y���>��E��Bl��<�zAX-z�1g�vf����0�=�v��G��
���)�p��O�H=��������o�v<�y]'yyx��-�YU���QN������$[�����l�o���oL��!���i!,�(�
oG��_>��j���i��W�>8��_A�g�;.��I|�l�T���VtX�C�����������/��e�:w��\q������zNIe<R����[�8K0J"����~�������s�wB'~`Lf���q�*
��E��:�g��E"Y�S������]�uL����9q�y���qt��}iR���C�j�����x�(:f��G�)	��[��B���q���Wm�_���,J���#����wOn�D�[��v+��������������>����6��=�9{U����-_��H���1m�W����;�3����hKC�6�{�q}�~A�������^�����Z�`����8a�a�;�������_��H2G�GW�vL��p�s��3�L�&����3nH��P�dq�|��N��TO�S$I��	�S�������<��P���3q�yw0d�Q�}�X��p������F�"��jZ�xS�0��y	���1)�[��o�7yR�����,���������O�k>�g��3�F�����&��8����^�S?5;
I��^��,���?&_�G�;Z����ZD]��A%i��E3�\���J�/���-�%zssss�v���CB�������W�Kn��R�TJ��}��7�5�z*Q-�'Up{<>F���+N�=f�����J���]������D�&���k�����!�I-"�S�{S��nj��S�$��_:^�xK{�y����J���2
���V #���z����������X�����0l��z�i<�6��������;Q,���������PK:�R��,PK�[CLObject 2/content.xml�]mo�H��~�B�b���R���/n6�L;�aw��4E���D��c{�U�����YHE	pI`G|������z�[������s���f�������\��Z��]����������4�YU����xX��.+�e�Gp�r}=�����u�����2_�����nV�r{�u����k������o��ww�Sw���-�7�;���q|���O�9������So~Z����/VyW%R<����wW�]���L��r���	��Ozt'p�k�zh������u:[O��O�me��*_h��|X�����������?�O�����)���d��������WN�{yw`N��7��������}��HUE[�N��:��i�����a���
��dx�~<��������G�y]�4�,�)
��	�����Lw��>p�����zz�����_�Q�����q���Y�\w��E3m���#���\5m�S��t�	�%v��w���r�����N�6q��>,��sU>�	�����'}#�������o{�/���zyq��|�f����k���iU�U�����=!���9����=������b7���i�l���e�����qthO�=.,�f:K����b���>k�����e!8����%��v��]��*��c�oo_�q��������������F���E��E��}�j^u������f����g���0�y��3��6-�j������z�5Lac�%!7xP��O;����W���7���/�����,_T�s����y���A�+�����r=
��6�����u�p�;q���U����g�f]u�it�C�}N�t�����<�T,H3@A)��f
'd���_���U�f{9��/�!����~����3j~l�{��Q���Z}�QO�d�#��6W@�����Ow2��Z������]�5-M�{�B�1��_���P}�B�eQ?L����N�eV�u
�d��k�K��a����-�.+��y����?��<_m�����,t��O��mg����#�\����Y���*cZ���>gu~W�xHu3�!��_TE���Q�G�����
�;�:ev
�cw}p�]���sp����Y������&e�8�����H��?U�h���q���C��o��>����HS����?9��#������6f��������-g_}9}�|��_�[`������u9���
t�/���G�����Y�������|�+|�Z�J�~(-�&�����S^�PZ>���g-��1�(- H����,������[I�w�e��?���S5�n�j��J!'���d�M������k�&����>�^�2�������x��a�L���X��/C&P�-���{���m9{w5o_w����*����u�^oTp}������%��(]��B�`1f���J�����=#��{���}����q����d4}h{�4j����u�h�d���������I��V���]"
7<��������/�T:��?@���~��������+��?�e�~z��Wme��T��r9�/"�x�t0�W[���Y��v@o7����U�6`����Q��`U7]��e��!��a�>����)����-��{���]�,���^����I��@�s�}bv��������n�0'&�Kf��7���X�������p3��i���i�?���r,h�����e}���=�p�t*�����L��v��RWm�����i����� r_A�ap�h�a�"��]�\�7m�@g��94g?��MvD:>����}�?\��U�����tc�����^�O�f��;Oq�-��j���>�y�����&�e��_�������:{��������e%�+gx��xpit��o����US-�]�qU��Ma��H5�:NQ?_9�+��Y�yX9�/�q�r~9��_�R�/����E�#�W�����p�r>V���(G��������,�|<���Q�>_9�V��g)������"�1�+��a�|:K9��$�d�y��z�j�K�7�!����EO������Y�s��
w�
�p�p����|Z��'>,�k�
CGo�c���<�!�M��EYC����mzo���+I�0������,��;K�r�������-�����t�'�s ��CN�uq{VV�|{��d���$3�����OT����^����>�BP�=-���K|<��K|�����o �y�}<~#��V��pu���R�:����^���O���
!�l�N9���8^O��3�Wx6��(����C+�2�W�9��-��3Fk�����E<�:'����`p�k�7L����@���c��[����i����+��C�D�c��|p|��d�J.��FG�#A��g�H��Xq�+�s�i��3h�a���w�T~�'�bJp	^CX4�:'(#�����"��������J8%�b��e� 	`����3m�2�M�����0.c�X�?B�f (�).��B�@��z��7��T"A���ZX��`�B���V�%W�;�}���D���3��Yv~yl"�@CZI����1D'$�`��8��R��,�����;����� :w�d��~I��q�Pi�i��R�k� y�5�@d@��Y��c-�Cs���[�xf�,O%�� :STl�Y�}80�Y�(8�qi �T�{���_{n�Q�R�CF�8X9p?��������Ny%���!����xC%�G���@���d��^�R�*u��@X�= ����8���Q�	#;� L�d�`r�BLR�A)E�ZBl�~E�v�����0���9���$0�-�V���E���3�hO
c���ZA��#d�;�����A�;#�-��5_�=�YB��w����&�t��Y�>,�r�,��4�d��f�c#�]��2e8^o�Gs�����(F�����@�-�\���!����A2�<D��bCt	�BA(�w81@%WgB��Y�r���prp�\:g�;����L!LjF�s�+��a�#���\AT@!+��e&9���������a�j�w�c�B��1E�t04elR�F!I�^
^������zV�;�e��b�������Nv�B���$�_�k�9�B@��A��P����@��S]'�����U:�|�c�Nm��~��LX*��	D[�D��&� F�p3�)>�3�G"�l������Bc�%=����f���#�,�F�
|&d_�K��BW)��*��r
b�p��+
s������ �N������*�A�e�P�FH'�ZI���o
$r/���!t�@���O�q�\���a�Z)�����)=@�D���'a�T89C�����}+�h ��$��A���I��+�!��6�����$7�BgD"}��#��I��,X{J�"�r� ��=]����9�.a�B�xi��2�K��0D�$;g$�`IT�:W���4�B�|r�A��N21)Xc��&8�z����8��I�����q(R+����Al��)��B2����W�����qp<�(P7��I4�����F�P�!x�<*��(uGBh\�p�,>��B�`�X��|�Dg>�Nr/ ������3����C�a�A��8s�e��z3^r+^����5���k��0DY�w�]z^	�$�1B�?�r-��Q���D$��NY{��U����.�����#�sq�&<w�
D_�R�8�9�&PC����Cth'�����>9{�!��@���HC�P�hpQ0�N74v�����+�������a��qI������Q]��>�t�&\��sV'�@��8�5�k���!���<$��$�D��������'�	�(�h��-W^�������Vi�F�!,e{��Q�U�����;��"�ZR�X\B����B�\��x8����$�R(��A�o�O ��=���;O=!�n)1vJX&�tu6Q-�80D&3��S��1�\$���A\�'�^sN*��GDY��	�a�)#���Ct�(�,�X���)`�����U�&y���8�[/�qS)\��� �B�;�Bq"�-@�Q�I`!���	aL�����ER����TP:������M��kPu�k��"����3L)1GY���?|
������bD!a��=~,MR?B�����b+z�\�P�/<����;%e�?F.�
DtQ��D�t���d��B��� lb��Cy y�
��������c���!�T]H�9�� \FD]�����
�=�?F��@�����U-��$��sp�v����@�sQ�H��;���Ip���#�ma�R��Ga�I#4$��%'D��)2�{�lR9�%]T�%�<�^���+%�>�X!`���#d���
Y��K��c�r� ��C�O?�Z����KyB�f.�
	����� ��f�E�4!�M��!���Y'���hA�TA�I
_���9��qI��TQ�-�O��d�0�8E��%�W�����)6���r�������W��xX��.+�e�o�PK�������PK�[CLObject 2/styles.xml��K�� ��9�KYc,+��)���LM� $SA�
�#� KA��PYJ����/�/c#w=�F��d�����bP
U_�����[�r�t����X�pe��?%7;'V�L�K�iE�a��
7�2-W���4	��?�Y�<�������=����������C���.����T�h$�1hZj���P?.����`<�~(��k��N'���������*���`���������G-��2��������nT'�7��ez��ru|�E�z�c=,�����C����<}G����\G8{�3*��h��q9v��/�Lk����b�[�v9H�>�.;��mo�����[g��e�������k>�>|^�����p�Vm�T�p������3KW���J��2��S�
n�����k�MTYy�{L���o���j-	.��Y���5	��Z�W�kLa������
�����=N�����L�
����Ct�PK�P���PK�[CLObject 2/meta.xml���n�0E��
�v�G���*R7��]d�@����	���(�����sF����p�+���J&��b��*�L����&"��!VE!8�\��Fi65f
���s)!��T�V�T�[j8U
����i:�'�J�����i(@��v��J����{�����t����V8&���.,�h�_��]+)�nA#>KOq��la�/t����w���a0d�m.������6��L��l5"���<F�4��K���Q:=�L��@`o����(dw=�G��nk��S��r�B�E;�!f^V�,`E�����x:��^���~�����~PK�A�5gPK�[CLObject 1/content.xml�]]�������L����%~L'Sl6�l�n/�-P���F�=���+i23���!��b9�1g��I���s�C����=�z^WW���-���k���b��y�Y������#y�������e�7y�=��Me����^��������~l67u����&]�M����b3���k�X.���Kuts[�o�����M��mz<�������������o���m��V������iWN�x���/o��n{�X<==�O4���+��t48�m�����EQ��]�/����K�����M�<����hi�.��W�O��G����4�C�=6l��{i~|���o�N���>���t�������B�>���
���r{���������T��MPk.A�-��W��`�����������U6*^����������0���i@�x�������O�{�P��]�����r�v�f�Lc:a��d����Fa��L�[d���[W����UWM������=����>���o�xxx<���L��-0Z�J~��RSgd�d����
-���vA�\�|���hJS�V��Mp�W���W.�A8/�j��K{oS�����GO�z{��W�f�|����������0��-�������0e�Yu������\�
@���:��Yd#v{w�b}�z�������_����U�.7���n�����s_/�n{�y�#���\�U�����$z.��3�)<h�P�j���M�����7�������������^d���d���-�Vwi�te�^�i�o����l�������t��'s����h[�eg����OSwv�D�fe�(d�qEf(��Z�z8���-�OW�t���p��`��+4�{U<��'xM���!������y�^���I��J�b=���j������kW{YV�Pw��7?G�	��p'(:M��,A�MV=�E�P�y�����tY�U��?0��"��wM�vQ��v/��"�TD�t;�i��C�Fh��&��Q�H��~�{������������/Q��U�RU�R�5>��l"OS�u����)2'Q_n�rzsSD�Z�_F�E��y���+�u���e�v�[��Q��a���l"w�\�^��3b~��cZ����=�����^�����:�����iu������`�K��k��/��W��W[��N$7%4�)�U5f�cs��w_�x�3)�W,�r�*�)�g6
_��9%��yf_�������yf��,
���D��}�"K����7%������L1�	�7%��o��EN�l�����{�/)��U���9��f���b�E����E��s�����_�k���|�ok�S�������l��{(���@dQ�����)�o��x��^�F�����c���m{	n��f���a��S��3�jV=bDL��Bj��2���a=�s�����?G�
�o�W�},���������E_�v����}`�1��8�J�@w�ID�~��R���~���W�W7]Q]��
�4��]�>3h�a��*V�&��/�-�}����Nb$�`��*}��y�n�#���~w�b�`[�]�6E���^�����1j�~_G�<o
���O���/6���w�ofJ>:�������C�������0z��������L?����d:�e����;Y��MV����i��c���$$f�$L�)��YB>g����4GH�!�����y����m�u��D��������I��gf��Nni��*F�LC��1A��>#s}�q ;{����������i��������A���	���Y����	�����SMb�:�O�����n���>4��SZ=mtB�������id�����7;-����>�h���.7�x^�-�x��|!�.N�c���+���2�������|	e�����U��Y���U��%���+���2?������p	e�����U��Y���U��%�I�W���2�R���2.�?_�g���,e~�U��K(#�W���2�R��|2
��SZU�u��TwY�|z-��y�]������>?u-�Zg��{�0�=i^4fs����a�
�i-���=����b�������z��~�hdB��~HZ?��+� ��xfD�{��3��w��������w�=_X���$:/������v1��]7|%{�MUn4r���26H����9��CY���"�}(��4:/����{(����l������
�C���d���ZP��=�lp��
�]�Y�I�����J�k��4�t%���f7���&q"�Lv.����xOX,�b�1�����:��������)#t��w�0�lNgWz��������2S��b�3��C�}x_x��s�G�X:m����i"q8�t��zhC
��1'{O����������M�K����3���[�{�M*�6@�Q�0M|:�@�%'"�s`���?���Q�&|������Y�Mb$yr�r�{O�)��X�� �<�G�QLx@h0>L(g�E����SK�CF�N�d�h��������0>�p(:@��[/�j������h�0>�
��	 Ay�	X�;&E�y8��q����!`|�3�����N���W(���+��=U���%�k��1&
�$dt�P���#p�J��DS�yH1U!����"(��"`|���|�X0�|�K�%�$?��(
'��1r&y��Z�O!,E�����������,���"p-�X�g >n�����#^���s�� ��I�������	�-���~$T�A`�:��$dtX&��$�C������1��R���x@.�g��i=L1	wa��I��=�C��#��;@�	����i��P���S'���C�N�)7��bS	�(��!��^�u)����?! >b(�#�1�X�?	0>���t��4E�j� �Q���ZLS�8'����9fa:�b�#o��`����B�`�e��%OH��"`?:�P���E�����{Y���'�"�����v�\��SQ���)B���Bp�D��O��Q�*f������G��$%8��C,��.xl8 `|B�������p�h���b��C
�;]&s� ������7I�����S<��Y��1������S��A�G��#������SDC
�G8�<��Ap�D�H�����/7��4f}�����D��HbFD�<#f���G{Q��I'j�O%x�g�%����G��$W8\"-r�`�4�����������1�E@g(6����s�-	O��s��I��O�D�|�>������\�d����D�"��V4���cDR��� `|s&>�����!�����Q�B=
�'	��%t��A�'�|2>5r�@��6!���*X�-�f>����*��E=�&T��y@{.xeq@`��!1y%�!`|I�B:��1)���"���~����I,���;���)���^
��b!Y2�\����
�\v���������^���#p����A������[#t�P�?�z�������L}@��G<�T#Uz��F��H$#�*��M��q��v���@�
��
�Y#���DJ��������F1�����h���Gd�5[=�&B--�e�b���	9�`Z2DH��C��t2������'�����A�b��!4 p|,���1��H�/��0>F�cL����\�i��1b~.u����g����0��L��]. xg��4]�*0
���c��� `|'��:��K*'�:�)<!��R�|�#M�,��2����������N���/������������S�(6��
���o���7
����?R�(6D������)�����!t7����1��qr�~g�p������tQVo:����PK���Ik��PK�[CLObject 1/styles.xml��K�� ��9�KYc,+��)���LM� $SA�
�#� KA��PYJ����/�/c#w=�F��d�����bP
U_�����[�r�t����X�pe��?%7;'V�L�K�iE�a��
7�2-W���4	��?�Y�<�������=����������C���.����T�h$�1hZj���P?.����`<�~(��k��N'���������*���`���������G-��2��������nT'�7��ez��ru|�E�z�c=,�����C����<}G����\G8{�3*��h��q9v��/�Lk����b�[�v9H�>�.;��mo�����[g��e�������k>�>|^�����p�Vm�T�p������3KW���J��2��S�
n�����k�MTYy�{L���o���j-	.��Y���5	��Z�W�kLa������
�����=N�����L�
����Ct�PK�P���PK�[CLObject 1/meta.xml���n�0E��
�v�G���*R7��]d�@����	���(�����sF����p�+���J&��b��*�L����&"��!VE!8�\��Fi65f
���s)!��T�V�T�[j8U
����i:�'�J�����i(@��v��J����{�����t����V8&���.,�h�_��]+)�nA#>KOq��la�/t����w���a0d�m.������6��L��l5"���<F�4��K���Q:=�L��@`o����(dw=�G��nk��S��r�B�E;�!f^V�,`E�����x:��^���~�����~PK�A�5gPK�[CLConfigurations2/toolbar/PK�[CLConfigurations2/progressbar/PK�[CLConfigurations2/floater/PK�[CLConfigurations2/menubar/PK�[CLConfigurations2/statusbar/PK�[CLConfigurations2/images/Bitmaps/PK�[CLConfigurations2/popupmenu/PK�[CLConfigurations2/accelerator/PK�[CLConfigurations2/toolpanel/PK�[CLmanifest.rdf���n�0��<�e��@/r(��j��5�X/������VQ�������F3�����a�����T4c)%�Hh��+:�.���:���+��j���*�wn*9_��-7l���(x��<O�"��8qH���	�Bi��|9��	fWQt���y� =��:���
a�R��� ��@�	L��t��NK�3��Q9�����`����<`�+�������^����\��|�hz�czu����#�`�2�O��;y���.�����vDl@��g�����UG�PK��h��PK�[CLObject 3/content.xml�][o�J�~�_axp�eA�������INs�a���4E��C�E�����&u�jK�,���8�-~Mvuu�WU�-�������s���f������U�(�I�������2w����m���(o&M�8/]V4�~^��������~l7M��V7�|^�n���Y���]7q�������{�O��o������7�������������6:�����>mN��yUg��>_�]�H�\W�?�]?t��f<~zz=�Q����{?�����������V�b\�e�l5�#>����]~�|�m,��q~_�'�&��W���<;�">���x���m�o��WNN�^9�������9q��������-��S�
m����Z�<��u|�4[Q�
����
��xx�~:��������G�y]l5���)
��1�����L���:p����jr�����_�Q<��|���r��Z��|��L&��H��-�M�m3=�0a��V��n^v��n����doSG�������U��'�������F�������o���nm�=���(��m���y\� r��W>/��
P^����'�6_7g<r��' :��z��!�}L�d���I��������?�����d�>1��b���>k�����e!8��{��q}�����n���g������k��^
ld}w�7v�4�Z��W�^��7�fU����w��=��>F^����}�q~��IYT����u^��8�0�A�=���\�Aiw?mE�_n_�������x����|^�/�Rp��-�6_>���0�e�U��*8	<�m��,�E��.��Xw�xw����!:�������z����r����z����,�T,H3@A)���
'd���_���e�fs9V������y
�a���5?6���n��m�V_m��7��df�+ |�@F��{�������7m��MK�NV(;����N��m
�g)�Z�������\dEY�@&��^���XZ
C�/wm�wY9_v/�'�e���f�r���f�`��,���SGl��x}�O$�_����*cR��l_�:�/k<�����C>��"QO[��T�e1�h����:ev
�c{}���}���8�`��jW]��P&e�8�����H��?W�h��Q�8l���M�7�pi���)v�������Q�����o�sZutJO�����N_2�7�����q�L@����@���r�_
�?}��$�����S%X�Ci�@��}ky"���|�6������������Z�{��-������{���E>��PZ~kQ�hYri�������X5u5�zK!'���d�M������k�����}3y���e������K�TM���`#)x1��P�e�@1�����m�<�����h�y��,���0�������j������\��#,�nD��.hz�1#��F
P$H�|x��a���T�w��=�W�}��j|5yl�R��-k��sy�5W�&��O����7����7���i���4|$�=$��IS�Lh��YH����
~3W�W�]Y_�CZ�����{%�F��Lu9+���ET!�7���F`=bV���������y�/�
��r�pT��X�M��m��m�g��KbY�)��d���
�=Y���\���G?}s���F��{N���������2����,F�����qs7�:�m7�&4\��i���iZ����,g����h�;Q�������	���V�a�c�f3/�������e[���%{�?5f}9����nh �$�cU�u����K��
t���Cs�3��xk�A���}�?���������������s��������f�f�-S��Y[M�>�'�7���ihbU����p!�<�s^?���
��������'��3<��<��$��0{�]6���.2.K��	8��T3���������r���������"��+������,��rX9�\D9�|�|8��g)��a�|��r����xX9�R�����x������a��z�r~=��_/�s�r>V������H"I����������i
���V.z�6����������l��n ����`�U�P���
u��|���p1t��;�^��3Z7�v���/>l�{�<%\I����dl�=`���Y�`���*�j1���T�pe�����
u�!'���;++��|s��x���$3k���=��P�������}<��{R�3|o��x\���lU���@���x4�Fb������T����:�q�^�=�w�)�Y�]#$���*��]����L�~����Jf��"ZKL�s�����|hldS�1o$�����^A���cE�7�QVz%<W����%�9�XQ�-��K���R
�
2J�������`h\j�e�����sb����[��w�{n�7��$���x�
�o08m���bN�xp	tN@<V��^��C	�v$RL��T�$�(Fh�g#����;�,P'b����B�YL{���p��~e���c����6L���"����^j��7
�F�,�;��pN
e�"���Di�N
�]X���#5`�L��V�������N&��^�3K� :ct�+�����`���LH���J`;@�8X2���X�"�@��������%DB��Tj�=g2���u���g�I��IT�����r�A�,��1B�?�N	��1�!t�%{�$p��x�1Bg{�Z)�7��`�Caf
E�U���y�.FQ�L�m��Y����=�D'�`�		���)� �N.o�c�z�3�����
+<�Raw�����L\yi�O�8F�f@��P���*&]ne�P(J��A��H-t��p�^[�����:W�>�"�l\j�YCt�j����8��0D6�1&%x�p
�B��W�8��C��#��P�b��L�d�Cd�5`�����h�
�D�A�
�J_J���$."�L�; �p�n�qX@]\�F�n/ ��a~�!��j@[�d���]n��$�[H�qn#d����V@9�a��B���ZYn��2%]�"��t�� �ie�O"3�kv���*�$+�1B�^�����^���B:���(�i��!����"��\1�g F5`!�2
��@��"�O��!f����t12�j��#�\����%�j����_A���D]���z�����C��l�d�#Fa���*�OR���
s�yp'�Jr"�I�����8%���H��hV�#BQ��_E��[��*	o�8(c�N#��+�����!����Us�.��a0����e^''b��������-0#�.@�wP�	�D���$M�����YV�Dj�BGG�~i%��y��������W��$ �p�@�p��Za�m5�����R������
GY��\�d�C�kF��`mR��'kF1t9:�Y�r��������"�����q�k�lm"�.7p��vZ���c��?��C1���I\���9��rk�jB�����~z�@��CtT�����i(�]�
b�$<�i�i[��c�$i:��$��Ae
?��!	0D&�4�{c�v�I�`�r��)��M��"$D�v
�a��;@�,��{��>Y���~�5��!��I~�@�#�xM�n�9D�+��2�i�a����������=��jG��+���<>��!��Aj�����%��@e�"�8!(��h� �Y��(�h�3��aXQ�!p(N$��K;�r�'p��+!3>^��d�A���@�����L�a�
U��V&��5B�1���I�tr�Ats�t�^+������E(��L9���"d�C"
����F��C�#�x�p�����!{���"�nu�AN�������S��Ju�~���5�v�H�7�5�Tm^�o;��t� >����.�IIx)-�����<��f\�D�q�>�.G
Ys��o���/��L7�b�.:@>(lX����!2	xX���3��+���CO&|dD��N�3C���q�x
��<	!t+	���7b��x%At+	V
9	��d"�.G����(BKHK�^'��b���W*�"��8�E%�I9H(��Z��b	D��|�����t�3Fw�@�*%Eb1B������o�/,&�F��eaT(��rt�
 �`mx��
��.-Df�P�����OB ����G9X�$�0B7�ZJd����(�'.dx�Z��Ad6�'��Hk>����S���4Z�������� :����r"�u�[���>F��T����:���L���UY ����c��A8����,%.�B����	U2���D��0qlxw�g�}��$�
"���yL�	t9:�|�p1����NI�r�f���~����q�I�!���qi����$2��&?��'��$;@e�b�w�9g��j%���e�Td��l�"�z�g��tAA����#	�^s!!e�H�l�"�N(K���	��T��7������}�����>c 9+�!B��\)����$��� �u$'�
��^'G�1D'A8�d�c��Co$���
_�������������g7�&M�8/]V4�~��PK�8��	�PK�[CLObject 3/styles.xml��K�� ��9�KYc,+��)���LM� $SA�
�#� KA��PYJ����/�/c#w=�F��d�����bP
U_�����[�r�t����X�pe��?%7;'V�L�K�iE�a��
7�2-W���4	��?�Y�<�������=����������C���.����T�h$�1hZj���P?.����`<�~(��k��N'���������*���`���������G-��2��������nT'�7��ez��ru|�E�z�c=,�����C����<}G����\G8{�3*��h��q9v��/�Lk����b�[�v9H�>�.;��mo�����[g��e�������k>�>|^�����p�Vm�T�p������3KW���J��2��S�
n�����k�MTYy�{L���o���j-	.��Y���5	��Z�W�kLa������
�����=N�����L�
����Ct�PK�P���PK�[CLObject 3/meta.xml���n�0E��
�v�G���*R7��]d�@����	���(�����sF����p�+���J&��b��*�L����&"��!VE!8�\��Fi65f
���s)!��T�V�T�[j8U
����i:�'�J�����i(@��v��J����{�����t����V8&���.,�h�_��]+)�nA#>KOq��la�/t����w���a0d�m.������6��L��l5"���<F�4��K���Q:=�L��@`o����(dw=�G��nk��S��r�B�E;�!f^V�,`E�����x:��^���~�����~PK�A�5gPK�[CLmeta.xml��O��0������1�b{�i�Vj*�-2fH�:vd��~��l�C}��o����.'����5"Q���tRk�c�9,�S��2}/������'p<��z`k�F����AL��	f���vO��hU.J��5����a<MS4���#&��/�
���;�V-T'0(�L"�7vN���f�>�1�f4�k��.����}�]�
�Y�}B�x�*a�����wOP�mw��T�`��$&e'aL�$aI��(��)-���V-�������-w�����_��~\~�%�CC�����G����m�ek���gQ�!>=K=^/e~���8����a��h�r�6i{�3���}�Y��dIq������^�����"Xt�[�0�v5J�*
Pj�HZ�U7����M���?z��_PKn����%PK�[CLsettings.xml�[�r�:}?_���L�q�������\�1&��l�A�<��!_d.mJqK���3������^�kK6��.- �����NUJ�x�Gdz������c��k:� �}�E$��C!d^��	�o�o���:�:�u��i�nX�u������#2�QfB��r9��w��;�������u���G�M�5��������d����1MU����Ji����hJc����[��$`�������v�H������)��}?�F�����Q�B���P�u�G�7����y�|1;]�.����=�����k��~��/�����`|�.��H~��1�������P	!*o�4���2"�r��!��<���q��#!���!M�G~��Gz�D<1w�����Qv�!��}��]��\������Z�5�	�4%<'.���'����Q���6y�P�Td�PX%SF'�6��>����zj�&�������3w�O�.��4�����x2����R<��b�i|��[����S���saJS�j��jP�A��(����J���r���e!
�(�p�(hG;�P��N��)��M�B
U(T�$U�Q(D!�y����u�~(���������<F1vK}�TyU-H}.�M�|�`����c���������������Y�	j�b���1M�QE�]jZ���}�!*=���Q@L� �!���p���&�>�FW�K1�}������=YB����)�M�����3VY�	-j.�>��0��s�<����	�$W�����?1����c�?�\-Ou?#����J�
��D|��
�(A/�,�����!�;p(��gs!b a�[���A`9\M&��CN�G����;R�`���[
|S�}J�)���$�����-@<��g�(���&+A�X��G��18dOD���:����Y7�*��/,k���N�]�9��1�R:��,��yE���0�y�=yn�/����{�%�P�	d�+m{��{�;�[D��I?%>��;����l�r-q�H��^���o�-I������U�VJ?��-�>v{�w�Q�s�{S����~�������c��3��y���3��s��0����nG}�i��WU�����9O���U��p�w�U+�e�-���`�G�����zc��/�.����l�����3@��[�.y��Zq|���wF���-^ ��3���������5g��=v���yr�gm�����?�R�n>���Er�`������g���a^]���u;���C�jV�V�9�y������M���m�yg���5����c�a���c���9���C�q�>�gvKn"�'���A� O���NSwZ�~pQN�)J�PK\��l�2PK�[CLMETA-INF/manifest.xml��Mj�0��=���X�m
E����m7�yl�H#c�Cr����)%��d��=��Z�v�&[���X����P��`S���G��V���Shj$��d����-����*� Q9���`���I�������@��O�Y�6��~�?W���i��-������AeTJ�J����h,[���0���C���B@L���n�Aelt\��+V�S
��|����4%�B{���8�+
;��}��B��H��~t������*��:��:��:,�_�,6�,2�,*���P�=���C�ps"����`���0O����U}��X�|�X���+"����������+� u��]�O��PK)�z�X-
PK�[CLcontent.xml�������w��(�1���p���i�F��n�n��nd��P`���r�pQUY�u��Z;yV��<�D|���|�����?�}��o�>��}������������W��}������/����������~����7�yu�����w���}����_�����o�_������������~���������7��o�����/�������~����w���G�7����7��|�_��Ww/�G�`�E���{���?}x����~������������~�����?���������}�n��{�[k��_���_~���{sP�^>�ys3������/��������_������������?����n>t��s��������_�������e~��w�g�CU�+\���������?������s���?�������[���.�������I��ooo?����������A����w�?��}���E���7/?_����]�����xv������q!>��o��_�x���������/�p���_��~�����/���������������������[|��w+|�n������W����W������}�?�������������}h������w���G�����w�}��������9���O�o�^�_z���m�������on��?r�i_�	?�_��Y?���I��1����~�2t�o�������y�����?n�~�����?����C�x������|���1m��a�M_,���_k�s,������5��o_��y��������9������������u�0������x���@�������w_�o/��~����~�����?���]�}�����~@���eP�����a��_�j����}��?�����A���?|�y��|������_���?�x����{~�z��U����~���_/����������w�����������������r~�����>��~���s>{���}/o���l�+�q���|z����;�������ws����������7w7/���77�G�����^����j�������������\���\��e_-�Z_-�����[���[I���}��k}���z�=-��nn������O����?�Z��/���K��?����}j�a��-����������_�}����������{|q��^��K7w����������}���������O��^x��������Xa���goo_�?�����������s����O�����}5�Wb������7}}���sy����g����m�W�������z�����W��_������#��|e�����Q�
/���_�{�����w��/���������??���_�����q�����+�_�����S�������Gp���=������?��?��w��?�������;���>��y�������������]�pu?O��?!��x��g |����������^��{{�����G�/��������w7����M��q�������s��������U�W��5�������V��r��o��0���J�s��\��w�z���Eg��`#��y��C-�xC�������Pk�_����k�w/Cj%�W���_��D!��?���W��x��.��0B�\.��G�����6b=�E��sm����-�~M��_D����o�V��K��/L}���$_�����?�~����������������u����}���>y^��/����������^�y����/~wT3�����^��z����7�O�����_���������$b������/�������g��s��/�Y�/����#����G���|��?��6���W��^��~a^}����������N��7����7Gf�r������~������������}��C��'3���sC����F����������W/_�����t����?'x^`����c��/	�~����=�g<j}�$���s�����y��~�W��M��_q�����o�3�n����7?������a��>��}'��e����V5�=�����+�������>�������?�_��}������7�}z���}�>����>��
�����?<�������^v����=���7�/>��W�������~���������1o����������O�>�/�$Q�\�
s�d��9�"v�m���:�$2'v���=5�*8MX��[���2���(����p����D����I���wX�$2'Q����x��c�a����D;�����l�c��X�$2'�������7�y/�X���;�ow���w~�?`id.�����Z|����^�B��3A�,o�W0��u��'q��r��e0���2�5R�[h%����J!s
Q��E��g�R��B�8y�ob�'��J!s
Q��>��>b	�d��9��Q����!�d��9��A��"����R��B�y�q����p�A��\X��`IdN"� ����Kt��%���C�Dp�����vp���u��'q�A�B.,��ID���i�cOp��B��F�C��_�l�$2'5L^�=�
X���'/rh���D�$����=:����%�9�������@i����S6�e�-��c?F��B��Vm���Y<Y)dN!v�s���h������C�J�+�c�	�L>����O�.r+�cA��;)}����J.p-�@%�9��5��F�o�d��9��5�}e����2��&��,�4VUNjP zEr,���g
V�{��$����]�`IdN"nMr�J
{*\�$2'w+�{���}�K"sqd���WpC}��%���C�CpWM}-���N����������1�d�p����D���>��F9�D�$�V%�����/\,��I��JN[(*`�4aIdN"vUr7�'|B;`idouKnvQK�4,��I�nv����	NX����Gcom�f�K"s��h�lu����D�><�d��%���C�N��]�
������O�>��]����OX�����"]�2%�c�A���.j�
�!w����D�X�X��x�K#{�f��Q5�b�a����D�X�{C��D,��I������h�`IdN"n��>C���e��%�9����t/2+/X�����?f���u���K�������.��P">Zt��������Py������`IdN"j�<����d��9���r8O?��@���O��rl[|gx����D�H9o-Wp[b�R��B���{����J!s
Q����V�-��J!s
��3+ENV
�S����k&���B�"�h.�F�I��^�B��A��\|��P�����O�.��(�G!���J!s
�;)���N��D��j�������,��B�����o���=�-X���#/b��D�D�$����=��]�K"sq;����,n_�$2'����j��X�����O\v��p����D����E�3�.��uIt~�����E~�s��������Py�F��,��I�}��y��F5b�Rve��8
V���K����/X��/3Z����J"���)��=������A������|P�K#���5�>����K#���5��x����D�������|]�<�N;�+�%����^���5+�e��es�$l�2YIdP"n����sNV��1oqG�T
T�/w/<<uT
T�.o�5p=4YIdP"n��%��d%�A����k	��h����D�X�X�`���J"�qc�-��p����D���X���g+���������>jQ��J�,���42�7��f��.p�l����F�����^�	K#�qs�nFv�,�j����rg/`d4aidP#nz=�;
�&,�j����r'��7,�j�M��9b��K#�q3�1O�K&5�I��F����x|��%����+����q��g�
��42�7��[�ms�	K#�qs�n���',�j�����FVT��F5�����K,�D&%���}�
}z����F��_�MX���bw3����OX���bk�?��42�;��n�\����%���\<�373����J����J"�Q3���R���J!�
q�>�|��l6YIdP"jz=�p�Y���D%��}8F����B��|��T����J"�qO>�|n�� ��D%��|����
��D%����9~���J"���-����?Yit�}D�����}��"� ����A��U�n��P�	K#�q��������F5�V]w3rH��p����F���n�^�+0aidP#n��`R�MX��[w��H1�k�K#�q���>\0
X��[w}�S��%v���A��u�c�q�E�H�^J�-��Z�2s����"6MV���b���Z�����D%"W^��Z�v����D���>�$lF��$2(����.`���J"��k�[��G��J"�Q����P+v&+�JD�����v��Y���E���u]\�'+�JD���+��/�;+����`���T��^���u�����A����e�����`idP#n��x���'Y��$2(�����|�-�42���z�/�^�VZ���A�����������F5�V^w3���2��F5�V^�nQ�D&%��]��3�	K#�����=�q���K	>�<�������b�h3�	K#�q+�������,�j����[���@&+�J����K�,�j�����^9;aidP#n���Z�,�j��~����+X�6aidP#n
v��Bt`��	K#�q;`�g���d',�j����3UD{`��4��>�
�k[��a�-4�E'*�*D����k���$2(5�b$�k�d%�A����!X�0YIdP"jv}�.��l����D���].���A������f�d%�A�������.x6kz6�(5�>����J"����c���'+��M����z��W��yWA�,�jD��c�\�E��D%�f�1m!;,g��$2(5��b�����d%�A������J�A�&,�jDM���l<\�42�5��f��vxu}����F���?�����s����A���u_4���!�F5"��1l��F��H����4��3��v��	����`�K#�ql����>NX���aw3����0aidP#n�=����E����A��9v7#%tKm����F��m��hr4aidP#n���;5gX��F5���}�j1������A��9v7#��X���c��*'���K�{E#��:���c�-��k=YIdP"j�]��3Xp4YIdP"j�}����p����D���:
T
T��^/v���d%�A���������&+�JDM��h���J!�
QS�1����'+�JD���	|��D��A��y�0���E�}�}��t�E��>��������7������������7��|�I��1o1d�����F?���n�B��C,��9����J�p[��C���C����V�MXYs�[����8�{b�C��Bw-|��\����
:me�����C���@�������!k��x�����C�b?��%|6;`Yd-�#W>�R����Ut~�T��}��i�����$n"5J�[�����de�5��A��b���� kQc�aE��NT�X��!w)Z_����f5@�J��W���f5>�J3��� kQ��a�����`e�5���q���[X'*��2���������/XYs�;��f���'{U�<��w����:,7��U��'q������
V�C��F�C��W!�C�C��������*��C
���M*���C�������k��!kQ�c�|��w��G�'�9B>�8�c3��e���k��`[L���'*��Cn��jJ�@��A�"�5���z�We���ClB�k�c��������4n"��8v����f��8��h�v�`e�5����}f�� VY3�\}sH�:��2��A�������A��A��W��+Z�~�r����x��J��,��9��?�Zx�x��!kq�`��Dl2_���w16��\�
�	_�C��	�]1�{W�.�&|U7�I�Fn
r�"%��{�r��C�:�1���C�����yh�/X�XYs�[����ak�',��9��C-�3<
V�[���Y�V��!XYs���"y������SF�?����5���2bn�[Y,��9����C����U9t~����x4L��U��'q�M-R�`1����5��M-Rh����C�b7��Z�K�r��C�0���S���,��-J�qrH[_�T��h�r��C�89�����`9d�!ns�C����,��9���3��`���!kq_�9^�;_���wo�:��U9t~�[�Uw�w�W,JZ�U��'q�q������C�����:=�s�r��C�8y�{����E�&j��x��Q����5��qr��Z��0a9d�!r��JE�W��f�	s�s���� k��0��#�&+��Dn�����
���A�"7a��J�	'{U�<�F�Sr�/�jvM5o"�Sr.
<�h�2��A�N�yOp����C�j|�����GY���5>N�OO�������5���q�����qh�r��C�yh�������w�b�!,��9�����8��oE,XYs��ZO����~�C�����%N{�,��:?x����;l�t�2����O�6���1�x�]���!{���+����q,��Y�����*�f��e�=����cE��C�b�KN1�[[�E�,bwL�5�����e�=����cJ
��>`Yd�"vC�X���`Yd�"vK�xIk����6-b7e���_�UYt~��Tr<`l���U�h�:���c���p�l.�94Y9d�!n������<�d��=�����P���d��=���r_���"����!{qc�-����`��=���r��Ut.;X9d�!n���'���~�r��C�@ylz6xM=X9d�!n����b��;Y9d�!vR�W9=��de�}�����Q�����hD4aYd�"nV=�`7��"{q��0���-X����W��e���,�E�,�&�C�4�`Yd�"nf��H��v�r��C��zx��*,��Y�M����G	.X����[1|���,��Y�N���C���G�]Ip3��"jv��%t;����E��:n}�*��6aYd�"nv���{xLX����]�����E�E�,�f�qK
���`Yd�"nv����+C&,��Y�M��{�����E�,���c�r	^]�,�g7������	�"{���1����i�G�]I�I�����ug�VlJ����5�.[|�h�r��C��7������ {QS��E�	'+��9�=��{����C���f��wx*����4�����
��C���f��(;�Pg��=��%�5�K�C��C�b�H�W9�������n"�c�X�<�������3aYd�"n������p�r��C�
k���"X�6aYd�"n��]����e�=���]��`��e�=���c��h��e�=���n��'+��9���^��Q��E�,��W�����,��Y����j���K=ayt����c-p��u���;6�NV�s��[���	<v�r��C����\�v�r��C�
��xH�d��=���mo��?X9d�!r�u�3�����!{�+�[��l<X9d�!r�u[�6i��C�"WX�=�5i��C��WX�}����������o�X��������}�	�"{qk���.�,��Y�����!����"{q���9��Q/X���[e=��Xd�E��U�Cp}�2��A�
�c����1aYd�"n���6���	�"{qk���g�u�	�"{�k��S��a����+	���5�0�����nLX���[e��Z]�MX���[g���#�&+��9����^��MX���[i��=��g,��Y���b��U��C���Z�)*&����e�=����~+^uT�3�[k����2�p6`Yd�"v�uW#���	���n$���X�X��:la/	�
��C��f�n�lr�2��A��zh�"v&+��9D��/�Fi��C�������C=Y9d�!jV}z�-�&+��9D����	�MOT�3��S#�
E9d�!jR}���lh�r��C��Z�������H��R�����_�,�g5��ys>����"{Q���P\�r��"{Q��8�o
�U,��YD���h
�����"{Q�.F�)�3��e�=����X0G����"{Qs���)��c��"{Q��1����U,��YD���������`yt�G`��c�����n�i���e�=���u#�
���E�,���n�c��Xt����E����Q�
��"{q��.�����"{q��c�s��H�3��\w-Jk`�8aYd�"nr=��`O��"{q���������,�g;�L����	���<S��:���\����c��d��=���u�B@'���!{QS���=V�m�r��C���{�BA����C��&�����LV�s��W/������!{Q�����OT�3��V-�ni��C��f����p�r��C����X�8�'i������]���w��~ss�����Oo�}xvw������WG��$���6W��&�_��~��%w-�Z�c��!kQ���={0\���5J�S
���C��F�}h)y��X�`9d�!j������GI-XYs�%���|=t�r��C�0yhx����5��a�������C�"��C����q���Z�G.zn.��&{U�<�����������^�m~7�%�-���j�2��A� �[Qk���'+��D���{j�,v�2��A���mv�d��?�����;��de�5����XW�-�&+��D
���������� k���1�������p�>�8��Z���w�Z�����r���!��#U�w�%��m�Wu���m���]���]��!kQ��E��'��C��F�cz
>���	�!kQc��Et_
XYs�$Z��?�XYs�%�S��84`9d�!r�<�H{�-�,2��M}-l�9�/fMVY3�[���6OVY3�\������^�A��A�C�-8l���U���q�u��0����f�9���u�2��A�J�zA%rU%�=�������:Xd� v%����h'+��D�D��f�����!kD�J����26�.XYs�[���(;�Pge�5��{����=�	:a9d�!�R�k����N��:?x�-�zi����nM��n�����:������!kq���%���,��9��C>��v����5��u�}hq;x�����5��u�]�X����"s[r[�Rx�����5��m-r�	L�',��9���Qb���l�r��C��%U��~�r��C����>c�W����ClI��Z���M|U7�I�Fv[��k�[�����EI-_�h������E�y��|���;N�[F����2�$a��at�i<�q�r��C�0yh�#.XYs����o>��C�C����w���	�!kq_��Z�
N�'+������z�����������������s�*]�U��'q�Qr�����)o�r��C�(y,CZ*�C,��9D����=X��`YdmB����m)z��?Yd� ���[��&+��D��\B��>Xd� j�<�3NT�X���z�xvH���f��r���
VY3��z����tmc���ClA��#���o�Wu���M$�G.>%,5���f�?r	�<1����@�
�������l�r��C��8�mO�a/XYs�w-j(�B��A������Rx�����5��
����w����C��v��Z$��^����e�s���C�C�����-70_��Ut~��5�X��h�_��~��$�sH�-�E�n$����"�&,��Y�>n/�.~,��Y�>r����`Yd�"n��.��`A��e�=��'�5���r����E�3����
��"{�O�k}�x����E�s��V
|���"{�O�k�$�<�	_�E��I��%�P����[
_I0^}���0��e��&+��9����X��v�r��C�pyK�w?Qd� n�����'8����7V�R�	u�`��=���r�"^�P�C�F�}~J^QV�s�(w/�����C�����Q=��@e�=��9u_��
?�V�w����
��e�~�����e�=��9u^Z��\�,�g7���O����e�=��i�����,X����Wb�W`����E��z,u�
�	�"{q3�>���1�,��Y�M��h����g�E�,���}x	�h,��Y����bgw��OX�w%����
m��u�Jm�I:aYd�"nz��S��	�"{q��!FD���,�g7��b��p�,��Y�M��(�@����,�g7��K��N��e�=����^x���e�=����^
�MX����^����u��E�,b��]��"�E�_E�=�?`r]��x&+��9D�����8
�x�r��C��7�pA4Y9d�!jf=��
<�d��=���v/\O�:Y9d�!�i��k�`�e��C���f����NV�s�{�a[*�/m�r��C��7W��:Y9d�!�yD}t	�k���E��Fp����y�5�yK{_>;Y9d�!n���b�����E�,�VXw1��E�E�,�VX�-�m:aYd�"n����v^�	�"{q+����c����,�g�����\+�&,��Y���b���:,��Y����K���u��E�,bWXw5bL`g�	����$�>���]���<�u�r��C��:m-�������������*���C�"WYw/�����C�"WY�����2������e)��C��n���xNV�s�\a�J��������-p����!{�+��*L'+����`U�cm��+��C���"{qk�����]��E�,��X�����E�E�,��Xw1*�*��e�=��5�]��w�d����E��.��2>�
X���[c=����m����E��1��&f�E�,��X��%�`f5aYd�"v��`�&F�G�]Ip]�X�
3����Bs��"{Q����k���g�E�,���C�>��uV�s��]w/R�{F[�,�g5��b��
f��e�=����c/���e�=����#���E�E�,�f�c��B����E�,�f���+epd����E���������s����	v�{��,fv�,��&���C��&��ClC&+��9D���{��&+��9D���
<�z�r��C���[�3��C��f������s�r��C����[�MV�s��W���r��C��Zk���Y�9C�O�z��gb>�6��*��VY�����j����E�*�0��W�@v����E�*�!F�@�&�:���[n��y�E�,�VY���K�[C�E�,�VY����Oh,��Y�����K�
B�,�g���o���h�E�,�VY�������"{��������,���K��c���f�n����|LX����]w1Z���C��&�n�����l����E��z���c,��Y����������E�,�f�}x�M',��Y����z��Dm����E��z<u��E�E�,�f�}��n��	�"{����F��X����=��v���l�f00����5�.��#xL�d��=���u�"t��g5��Z��c1�d��=���u�\K`���!{Q����2������5����h��e��C����c�\�����!{Q�������'+��9DN��J96���`��E�?.����>��������7������������7��h�I$��o����y����4�"3H�V��2���`)dL!j����R`s�d%�1��1r�"�A��@��f�]
���$^�2�5BV������B��&������b�B�����������1��������+4`)dL!r||,px���J!c�w!�9W�@6�k���!�������������$�!5:R��=�OV�w)B����2&5:�R��;Y	dL jp<F�=a��d%�1������U\��J cQC�1-9�-��J cQ#�1�x0���2&90>����et�2�Z����[_��;LX
S�;��;�J��kR���!v��T�u��;�>���������xX�R���K!c
Q��a�w������1������&p�a�R��B���X��}�&+��	D
��9D|%4`)dL!j||X���9�B�"��CV��C��%���jn�q�{����J cq�@����I��2&���5�R'{M�<����>Ld��t���=�����n��@�b�����+��	D�9N
����2&��8��bOk��@�"����[��2&���10Y)d�Q�[s��Z��/&,��)��9�V�
6�]�2�w�u,9�;��B��.���<��kR���!v���~�j���i��t���]��+*x�����1��5�i�]N������1��U������;a)dL!n��x�no,��)��:>f'0C^�$���%7������J c��V��p��2��#F���sX
S�������2��#�^]�G��&��b����y��W5�������������	K!c
�W����',��)�n\��p�(4`)dL!v����#>
XY[�0#����Z���K!c
QC�FS���9a)dL!n�����M���	K!c
q��������B�B��������'�	K!c
qw�����_�B���]p��:���k��O�.RC�����-X
S�"�el�`��K!c
�C��
)1�	�K"c�	5DNn��d���R��B�y�dU�8��J c���=�h����@���]�=��d%�1����ku�+��	Dn�\�Kh_���@�"�V���Z�d�I�����{ �?����01�k��O������z��J c���R����J!c�72�[�|�a�R��B��8���i������1���qX�w	��B����}`�s�Rh�R��B������x";`)dL!n���T������1��o���%xp}�R��B���nEDOV[�5)t~�;�w�u>���.����������_��$2w����P��,��I���������,��I�����o���D�$bwBv�F\�K"s�{!;�>�/X����h���5��%�9������7����D�$b7[v����$2'���+)��_�D��3��#��K=Vo��t��	>@<V����K_���94Y)dN!n���2�j9Y)dN!n����G,K��2�7P�bm�+��)�������9Y)dN!n�����
���B��F�}rr��k'+��)�
����;Z'+��)����SV��Z�`��9��	�X$���`%�=���y�|�Z���R���J sq��nE
��%�D�$���������%�9��	�1�L�K"sq3��E�h����D��z.1���K"sqsj����Gr-X����T�
=J`����D���{��n�MX����V���b4�?ait���N+�����/
}���$2'7�[l��ovLX����Y�-9���&,��I������S��%�9���u�"���D�D�$�f�c���:aIdN"nf����&��D�$�f�cp�he��%�9����\<z&,��I����!'|B�4��B���z�ff�u�����f'+��)DM��V}����J!s
qO(�|<��d��9��i��"�9�d��9��'n���r�R��B�
���>
uV
�S�{BaY��(�Y)dN!�	�cd���'+��)�=��k�'x-4X)dN!�)Ccl����$��.���<V	��:o���=OV
�S�[Q���v��MX���[Q��5�c��%�9�����.�h����D��j��#<��$2'��z�P���,j����z����	K"sq����T��OV
�S�[M=�8L�NV
�S�]K=���Of,�����X�X�ZfV���x��d��9��Yu���Z{�R��B�Z�VKCw�V
�S�\K���n�T��\I����+��)D��n5�����B�"WR�������B�"WR�2f�d��9����}d��z�d��9����m�`���J�{�"�,��������9t�c����D�Z���>C�W`����D�Z�������u����D�Z��e*xJ��%�9����cp)`��K"sqk��($��	����V����&,��I���>f'�
��%�9�������#_&,��I���N[�i�5:`it�����5�0���6�r����%�9��yu�"���j����D���{�w^�K"sQ��1�����`IdN"j^=�({���2�5��Z�=F,fX�$2'5��^�=���l����D����"�;��D�$�&���P��>`IdN"rb=��b�
X�s�F<����L���\;�OV
�S��W���)�B��B����CtA4Y)dN!jV}�,����B��&�C�=`_a�R��B���Y���d��9��9���I�D�Y)dN!jJ}h�Q��R��B��Z
�#(DN�O1.pH
���a�0<V]<��:l�EP�K"sq����[Z�$2'���{�����%�9����aK)X��D�$��Sw/z���%�9���c����>`IdN"nE�\
�a�`IdN"nE��R�`;�K"sQ�����|�$Z�$2'���/{OZ�4�G#,l��6��Y���6�_�$2'7��^�>���2�7�v[����`IdN"nb���m#3aIdN"nb���[�WD,��I�M����3x���%�9���u_*WW/X����X����
V
�S���-qO����%�9��yu7�7�,X���=�	u���l%����J!s
Q��������J!s
Q����T��&+��)D�����g/LV
�S��Tw-�V�NV
�S��Sw-�_���2�5��Z����J!s
Q3��E��w�&+��)D���SV��B��B�"'�]����d��D�>�I�^v��}z�������o>�}�������o^�����c�����f�Wu���m��<��f����	�!kqk��V|��x&,��9�-yZ�X7a9d�!n�s_����	�!kq������	�!kq����z��� kq����W���	�!kq�����_0�������Q���XY������&�=N��:?x���c����[7M��n����� �[�\���&+��D�����'y��D
���#6Yd� j�<�6���'*��C����&p<Yd� j|<�������f5<�V4���D��5����6F�*���1�}����<v,��9��V�������������z��T���{���_��~��������j�2��A����b����!kQ��19��`-XYs� -�-��� kQ�aEt�x�r��C��Y�����C�"���������"s����������'+��Dn�<���=�={������
��:?x�mr�qL�n��U���q���1�
�1Xd� v��z���������f��8��
��� k��������7P�c�z�qW`���k�����������6>Y������kB�&,��9��McC\L/XYs���CK�,���U9t~����C�^&|U7�I�Fnr���,,��9��@�Z���`9d�!n
r/7T���	�!kqk����XYs�]�<��b�W��E���v{�+�&,��9�ng�7�.,��9�������',��9�����o���,��9����|
�8t�W����ClIpW�es>E,X�U��'q�
-Z�~�����5��--��������5��--���8y�r��C�8y<���8`YdnQ������0'/XYs�'w-��k�r��C���]�"�����5���}���*.XYs���O����=.XYs���?N�v���������������y{�N���$n#5Ng�������s�'-B�J.XYs�'��l+
,��M(�89��{����� k�;$��vl���f�Grq|�f�2��A����y�����A�"�_��oh����A�"�_.����MVY3��~9���{U�<�&�Grn5��������$n"�Grn��]�VY3��%9���Y��nl�����U,��9D
��>��{�r��C���kC��,��9D
��.��]��!kq�|��e�������5���}�������C��������`�`9d�!�N~���[�/��:?x���������i�Wu���M$�����7|��,�w#�G���_p�H�e�=�������Q�X���}���6i��,�g�S����&,��Y�>��.����e�=�������D,��Y�>��?�����,�g��1�I
-�X�,�g��s	>Bb�W����ClP�S�cM��g&|U���`,�X	/3^.�o������!{q��-����P'+��9����X�/���!{q���zNV�s�+o���p����7T��w|0;Y9d�!n����3��u�r��C�@��q�����!{q��-���
V�s��Uo��V���,��:�����Q��V<�MX����U�-��2x&,��Y�M���7p�}����E�������;l��e�=���u_0����h����E��z����>`Yd�"nj�')����,�g7��b�����E�,�&�c����,��Y����b=n����+	� �X�
5��[�.�MX����^�-�>�����7��[�Ht����E����.>'��q����E���/{u�X4`Yd�"nv=����&,��Y����R'e�	��e�=��M<R��&,��Y��������v�r��C���?v���h����+��<�L����
v�����5�.[
�bOV�s�{��6SC���C����������&+��9�=��{Q2x����!{q�3cXl=Y9d�!�y���.�
V�s�{�a[X";Y9d�!�Q�z���s�-��>�h����d�C��D���?`B��V+|��e�=����nK��m',��Y����b��p����E���.����z����E���.F�	|�z����E���c�j�X4`Yd�"nuu#6����"{q����#n��e�=����]����9Y9d�!vu�^Z�`]�ayt����z�.3��[
1c��d��=���u�Z�+Z{�r��C����EF�aV�s�\]�Z������5�'��
'+��9D����S�`=�2�����O-l<X9d�!ruuk�`����C�"WW�V>�uV�s��U��r
h�x����������N����w9�u&,��Y���.[(|mq����E�*���]Z/X���[e������
�,�g��z/��NV�s�[c=�h`���"{qk��pa��e�=��5�Z�cX������/��:,��Y����j��?�wV�w�U�cM*��:�-F�U�`Yd�"n���J��w�,��Y����[�>�E��E�,�VZ��=�z�r��C�>������&,��Y����[ni����"{q����R[���X���[o�����]	,��Y�������`Yd�"v_���)
=�c����	�E>�V3�[��'+��9DM���k���'*��DM�O-.QHt��Y/�NW��C��f���[���C��&���
��C�����g�����!{Q��s~�`*�A��&���n�OV�s��S��6NV��a�1<V�<3��q�)��l�`Yd�"jN������E�,�f�1l)��=�/X����V��%&�h�E�,���C���nW�E�,�&�]��NV�s��X����_[X����Y�vuX�,�g5���Q5ZN�`Yd�"rr=�:�%l��`yt�G����45�v[i9��h�E�,�f�n��E����7���Kl�a�E�,�&�n�]��3��e�=���u^R�^\�,�g7��b�����E�,�f�C_����e�=������w`�x�r��C��z.n�	�"{��k�������G�y�~�u�3�.[���M���C����e�-�/�LV�s��[w/b,`�p�r��C���{26����g5�Z��U��C������36�NV�s��Vw/J����A��&�C��B��C��&��
������9�>�8`i�d��E��^v��}z�������o>�}�������o^�����c���� y��t���]��?�-����`)dL!n�s�b��>��B���>�-5�,X
S�[�\�|�MX
S���c;�Z�K!c
��u���e�B�b����k�(4`)dL!n�s��dp#b�R��B�R����K"c�����D8�k���!v!���-z������$�!5@�[�&&+��	D���;XA:Y	dL jx|H�5��2&5:�R���Yt���@���K����+��	D���%�S�`%�1������*x�d%�1���q��s�y��B������F@��Y�2�w�[�K��b�&��b��;N��~W��f��t���]�������Y�2�58V����`)dL!jt<� 9zX��B�������V/X
S�+�>�`)dL!j�<�h)�

X
S�!CK��t�`Id�����VF�� ;Y	dL rk���G���2&��9�=��{M�<�����9�S�d��.?�{��:N%�}s&+��	D�:N�6�d�`%�1��U����9<Y	dL r�q*��k��J c���S	
��&+��	D�:+x�2�(��:N[u<�q�R��B�����=x��x�R��B���>������	K!c
qb����l������C�<pWK���V���	_�}~w�[u�����v'+��	��9�R���OX
S�[s<�9�

X
S�[s<����U����1��5�cv��SY�%��-�qEr1�e�,��)�n\[��{�,��)���k��X,��)�����.X
S��#�������I������`7�����"k��w��+bk��w�R��B��1x���K!c
�W�Z>

X
S�"��l�	�;z������"������_,��)D
��m��`)dL!n���e�6�/X
S���'�n�Zh�R��B��y���'������1�������26.��:?x�}���������|M��I�Ej��V��^�2�5D>&���d%�1������.X�tX�K�rr��9`����1��u�u.p#k�R��B���%&�y���@���[�����2&��r	9�'Q�2&��rq!���V��Z�x��h��$���C�=����k��J�����$�!��qq5��J��@���?..�3�`���a�����+��^�2�54N~k�46Y	dL jd����q5a)dL!jh���='T�	K!c
q�w��)T������1���{��3	-X
S���N����4,��)����V���k�_�B����]p���va_�5��'q�������E�%����>Do�<�z����D������>`IdN"vd���`IdN"vd_K�G�K"s�;!�R�&��$2'����|�x����D�F�~�`��`IdN"v�e_��h����D�f�~�x���&��bg�G� ������N��ay�d�+�����)g�R��B�Py��E�8���B��F�����"NV
�S�(-�'��2�7N���hx�R��B�0�k���!&+��)�����W	�V
�S�$oq�[�MV
�S�#�%rE�>Y)dN!vB}�p�Kp�����F����Q���V����`IdN"nB��H;��g����D��zxQ�U��%�9��)u�"�
��LX����Sw/J_>^�$2'7��^���=�	K"sq��1��	
9NX����V�����l����D��z��w���	K"s��1G���K�{.$��|����Y��te}�R��B��:n9�;t����D��:n)W�2����D���{Qc'�	K"sq�>C����	K"sq�>����5�K"sq�>�xb�`IdN"nb����oM/X����X���g|M4`IdN"vb=����,����`��X�����n���94Y)dN!jb]�=��]��J!s
q�(�|_(��\��2�5��Z���_�d��9��g-��z�R��B�3
�����}�R��B�3
7_��2����>��<��d��9���v-<���d��9����sW�K0YIt�]#��*��VT�-�-B��$2'���m�7����%�9��5���� 4aIdN"nM��R�,���$2'���{Q�Pg��9���C��4=aIdN"nE����e��D�$�VT��%�F�K"sq+��J�����D�$bWTw3���:ait_j�����u�j�
[MV
�S��W����0Y)dN!jZ=��[�MV
�S��Uw-bK@&+��)DM����e5Y)dN!jR}h�/���&2{
Qs�C����'+��)DM��
<cz�R��B���k���C'*��	D�����{��l�����n6>��9���n��?aIdN"n=u�BI,���$2'������;aIdN"n=����1Y)dN!n5���:�/��%�9�������"���K"sq������h����D�z��E�`I4`IdN"n=��bG����$2'������f�'+�����|���W'?Z��
�,��ID���9d0�^�$2'�G��R��'+��)DM�-B3NX�������O`��AJs�p;T�a�.|���@���c}���-X������oq�y����D��}~�`W��J!s
�{T�*��v,X�s���?��3�[l;�r�d��9����|�X:u���@�|��\QOV
�S��O-���2�5�>����2�5�>&�[�OV
�S��QZTl ��2�5�>��`���)D����M�R��J!s
����Q[�MV���aw1<V%<3��y��b��d��9���t[I\-X����P�����D�D�$�f�����,��IDM���_ �K"sQs���*T/X����T����1.X����Uw/R�

,��IDM�c����"�K"s���nF)<yj������ex�F����m5y�y��%�9������s	\ZOX����Y���ef��D�$�f���2.��%�9�����rK���%�9���u��V���K"sq3�>C���q����D��z.��9��%�9���u\��D��B�b'�n+����.X���=��t���l��EU��B����e�{7�'+��)DM��q��NV
�S��Uw-�o�W��2�5�Z�	[OOV
�S��Sw-RO��2�5����>�
T���P��)'�LV
�S��O��	=3h�R��B�|�������%��I�]���w��~ss�����Oo�}xvw������WG��$����x��t���]d������K!c
Q�aE.�I��B��������]�2�5@>�7%`�����1����"�����1���aEs�Dv�R��B��[�|ihy�	K!c
Q#�nEL-��,��)D���%^ ��%��|���|n�&{M�<�.U������������$�!5@�R����0Y	dL j|<��`���J cQ��.Ev�;��@��F�]�X�����@���C
n�NV�w)��5��2&54��`�>��!���|�a�R�X����}\�=f����1��C`�2�:�k����!��cT�q�Vx�8�k��O�.R��g�e\�K!c
Q#�c`I	�,��)D
����'J.X
S�V�
�K!c
Q��aE���2&58>������,��)D���%���K"k���j�xt�d%�1�� [q�c�c��@�"2�PZ�z��$���C�?�������'{Mw�i�Cn�q�%��+��	D�6N-$�����@�"Wg�t���@�j���_t���@�j��\D�w8X	dL z�q
��c�`���G!n�q����K!c
q�����/=,X
S��������&+��	�]��a%��'{M�<��w�4~���|M��I�En��X�z��o�R��B�z�>��P�7�&,��)��7�KqK,��)��8s�}5Y	dL v�q��Z��/XY[�R����3��=a)dL!n|�����t�R��B���[�bG�	K!c
q�n���|�B�b����o>L��:?x�=�r�������k��O�.r�n�o�.��J cq������9��B�����A:���K!c
����),��-G�rH[I��',NX
S� w+v�D�`)dL!n�n��V���K!c
q������Y>a)dL!�[<���#�D�`)dL!�N~�j@;�.��:?x�]��{���?6�5��'q�!��@��^��!w)���=`)dL!r�<��{�D^�$26�P#�����D&+��	�
����X��h�R��B���{�4Y	dL n3�m����(V��PyO,���2&���b����J c�*��eX��^�@���@�z������d��.?�{H�z���\>Y	dL z�����i:+��
���o��`d|���@��x�#�``t����>���;1�����X
S��a���=�/X
S����,;��r�R��B��=�]��}��J cq���R��p�,��)����3��~;�kR���!v��m7~�W�|M��I�Ert<~�s��5��%����>4o���O�8`IdN"v�����b����D�������%�9������p�,��I��~<�������%�9����3X�`IdN"v{��c����$2'��r�����MX����d�ep{t��$���C�L���#�������������2C��������2�7R�|z:Y)dN!n��%�2GNV
�S�'�2?���d��9��a�������`��9��Qr��xp;�d��9��A�����d��9��1r�b���2�7D�OY|Ut�R��B�|��p"zP��J�{.#�H�X����o���O��J!s
q����q���$2'7�cKE7�',��I���GS��+0aIdN"nJ=����	K"sqs��Ej�h����D���x�B��&,��I����9]�&�$2'7�^�r�D�D�$b����V�	m����	���Xa
5������D�D�$bg�m�Ht����D���9��[�$2';�n1x���%�9���u������%�9���u�8���A���u���W`����D�����/�:+��)�����;X;aIdN"~^��sLg�F�\H0#y�glf^]����d��9��iu�jK&+��)�=�p��a9� ��9}�)u�"�G3��2'�T�nE;�OV
�S�{*a�"���J!s
q�%�|AO%<P	dN ���}q�;Y)dN!���}`���,��B�b�,������B��C�X��T��[���?D�D�$�VQ�-�!�M&,��I����^�
�`IdN"nu�"���OX���[E���}���$2'���{�k����$2'���m��
uT��[C��XK����D�$�VQ����^�	K"s����3���E,����`��X+[f^���j��D��B����ys���f��B��f�C��QOV
�S��TZ���MV
�S��SZ�GqNV
�S��R-2>�eMc��&���>�OV
�S��Q-����J!s
Q�cn�g1�cNr6��(l�1YIt�]��k��ZI��z
��%�9����ik9��&.X���[I����lq����D�J����lY�`IdN"n%�\|F_�<aIdN"n%u���
�NMX���[I�g�
95aIdN"n5�X��/�X���[M=�9��ouLX���]M=�@�X-X�s!�����ff��=�Y/X����Yw/B�C��%�9���u�"�}�Vf�D�$�f����#��^�$2'5��K�^�$2'5�^�>�.X����Y�������D�$�f���k����%�9�������#��%�9����H��z�`it�}��k��Y�-������J!s
Q����l(��2�5�>����LV
�S��V-�n�R��B����l�?Y)dN!jR}�ov|��2�5�>Fl5v���@���W����2�5�>�}��J!s
���C��ES��D�d{�]�UO���pD~LX���[Q���{��',��IDM�C���'lU�`IdN"nE������p����D���.�'����%�9����@����	K"sq+���-X����Vke�
D��B���S��eK�,��ID�����#�d������$�����]#rb�k{�/X����X��#,�K"sq{��-��`�X����X�>����,��I����h��k�K"s���G��K"s���x���%�9��=@�����K"s�3k�����K"s�{���%����,������:ff]�2x��d��9���u�\�
�
��B����]�������B����]���
�'+��)D���
|���2�5�Z��2'5��V�Ta�+��)D����2>uV
�S��Pw-"��h�R��B�|�[*6N��J4����x~����on����}������n����x��H��D~��-�
l���+��O�&R��.E�BXx�`d� jz<��|u�2��A���V<X��`d� jv<�p��1h�2��A����"��<�A��f����J�� [Q��C��_�,�ad� jr<"��<���e98K���,���z�e�z��d�������z���=90�����'q��qw���=�MV����w'Z�1�'+l�C������x����=��x(���?Y�c�jX��p
OT����%<�v����5&N�?��k��C���AK�'+�l0�=���=��� [q�.E�^��^�?��������L�|E��I�Dnmq�"��x�2��A���1�x�a{����?����D�\nOX�2�[Y|LK_
X�2�[Y|.��1h�2��A���1�4w�:��2��A������
���A���u�e�$�u�+l�C.YN�*�����[��K�sr��O���9?x�-r]q����'zE��i�@nUq�CB����?��!������������8G�m5Y�c�reqJD������8�����?���W�U��G��� [A�����<XY<ad� neq����OX�2������-����ew����`�|E�<�fw���\v;X\<�+��O�&r�����`]��e�-����cX��:ad� nuq�B@7�,�l��.>V�	��,�l��.S�`y������,5:.[q!����e�-���q��n^MV����'"�g�2��A�����S�&,�l�]�w)j��*h�Wd���Cl=pW�e����QN��n��������?ZC�RLX�2�w)R�����e�-���q����jMX�2�w-j��,��-F��q(�����,�lD
��)�[K/X�2����l���&+l�����7W
x(��e�-��/��Q%|t�2��A���.E���"��b���������u6����$n"58�����K�A���c���`K�� [���15���f�r��TB
����P��,�l�>/�
��w����?���-e�����[�p��n-��2z����?���-����>X�c�r����m���[��&�������"�b�����e���@��?�H�i��I*{l�C�h�*��T��dm�F�~9y0"���e5"Nn�k���`d� jH����F�`d� jL��(�Ux:`d� n;�.EM��z�A�����R��m�`d� �:]�X���,�l���K��A�"��b����v[.
|�n�Wt���M$���O,��{�r��md�Wc���!kq+���}E;�NXYs���xh��}�OVY3����[�v���	�!kq;w-BEv�����W���AOK��������E�d9T�2����k���NVY3�o��l�>�+r���!�"�	���������Wt���F����2���9���'+�����G%�D���f7D���2��6Yd� n���(Td�=���h��^���A�����=�����A����}fr;>�uVY3������=���A����[l5�;�'+�������&���NV��*�%Q��Q���R�X���7����k��	�!kq��>������	�!kq���E,h�����5����1�8��c�r��C�|�/qZ*���	�!kq�1=�������A��z,������5���h�+<����;��!zP��e�O�#��>VDC�������s����5��9u��C�b��{B�?Yd� vJ�\��-XYs��R���XYs��R�99|*���;��K�k�NXYs��S��6���!k�s�=�h��A����{���,��a2v����R���9a_a�2��A���n���4Yd� �I�[�����f5��V�=�
���f���-��c�NVY3�{�`�"V���� kqO�VT����?����3������'+���=�p�K�a�'+���>1�?_��'+�~z��F�3i_��'�I����5����n4��`��	�!kq+��mO������v�m�5���	�!kqk���������5����}z���k�	�!kqk����^2�U�e���N�d�{����5����chqh�����5����cpi;l���{�Z0��L��6�I�&��� kQs����WlY?Yd� jJ=�h`��� kQ3�a�a����?�|�U"v&+��DM��)c��de�5����1���BOVY3��L�J�
���f5�>��/x��$f� r*}<`�[��C?��`��cm�S���V\F������z:m�&�zz�r��C���4��*��<a9d�!n���"��=,��9���N����&,��9���Z�r�C�C��VO-j�
',��9����Z4��	4a9d�!n�t�"����C�bWO���v��}���}��kBa&��l):p�l�r��C���kQ\��C,��9DM���d����C��&�ch�5ac����5��I��"6�LVY3��S+r�C��A����cy�}����C����C���V��C����cv�������5��)���^��s�r��7�+z�
+fF�<X�1Yd� jB}�0��'+��D����S����f5�>��bz�2��A�l��������A��f�G��-�&+��D����1>�uVY3��L�
��l�2��A�\�Wvt;Xd� r*}�M8�L��P����
����>�wX,��9���v[�����C��&�}hI,z���f�n�ma�p�Q����5����Y����l�r��C�tzh�
x.����5���t����a�����5��	uh[�|*[���5���E�ez.��9�b�����e�O�#�\�X���9u�j��SOXYs��S-j�,��9����h���� kQs�n�8�\
MXYs��S�m�����C����]���},��9����"9d0�����;��)zp�l�r��C���OO����-XYs��S��r�1�,�~z�x����c��eK-xlA4Yd� jJ]6_B��d��A��f�������OVY3��Qw+"�P�����5��R�\���de�5���t��^�����f5�����������eG�D�w��E�|��9�2����2���^��n�2�Q������
���o�ts�}���M�2�U������M�.}�6���NV��	"W����bK�������'�_�����������}��_�7_������?���������������o����_����\����_~������~�����-������������O�����g����?~����?�����?����?~��������u6�������������??�G�/�1����R����PW��#��~���#I}��z
���2��b���������#w��/A^02���I��;F�w!�>#x�����#��FD_�?i1r���V�����-���cD}5r�/k�O�F'-F�Q��\0�������cD~Ir/T�m�OZ����]fJ����
�������Ly���;�^#�#�����RW?��B��L���R���
�;D��0{��{z���"w��a��2�NwX��!�����K`��WV���v��SKE/�xeE�!nC���}���
�;D��0{�J��;�+,F�
5�W##�n�-,D��'��Ut�����_�n�;[��+u`��'�^c�#F�{~y�� ��;D���g?�xi��#w�������VF?���c�=�|�/�`���#w������y-���"w��g����v�z�b�������5�����7���j�Sda!r��{�v�h\�,,D�Q�������l��B���W���2������{���Gj�y���o\���CD-0�edM�+
�;D�������<�a!r��Z\>.�.�MZX��!���^y��_���CD.-��rj`C���G$���2Cn���U,-F�qO0��e��.��B��U�q�s��[Z��1�n��"gB�[���~��(�{�=	�^�s:�~���#�=�����'�/wZ��1��`����|�����#�	�#�,-F�q�0��m�<�����#��3���>O��b�o��m�Q��qp���#n���^����B����z��'�#w���HF(���-YX��!"��KXk,�y��~/F�|��
*����6iY��F�G�#�MF
5��6���b���MF
��,-F�Q���������,,D��K��������b�os�,1�Zm������"��3���oM-,D�q���e�#��B��C�jL��a!r��{�m��Z�]a!r��[������+
�����
����'�����H��qd���2�&x�����"ja���	<�ea!r��]X>2��]a1r��P�y��������#w����<f�)N� ����#�U����r��FOZ��1����(!�~����#n��C�c��h[Z��1�~T�a��x�I��;F��#}�G�~�'�^�^?��w�g�=z����;�^#�#��Zf>.Z�`��'-F������f���'-H��n�9��w����#w����<BI��-,D�q���������c�-4oe6�+��#w����
���z�b�����a�T��OZ��1��7�+����b����}�������{1z��+�Wp{������O����G�$��|��sG_rZZ��%��<R��
[X�2��G���P-,FQ��[F�%����9dD-7��p#������c�����b���U���&��
�CD�b���r�vg#���'�seexgt���!#�{�j����~/F�|����C�ya�%��X�#	�z���=f�9�S�#��CF�B��QK+�_���CF������%�6Q#�����##w�6/��CF���3>��9d����lw�g�FK{#����:��NoF��b���c���>�#���m��8'F��b�������T���;,H�)�*�w��u�VB����b����}d�R����b����}M0c��NX�2�����5���W#���u��:~oa1r��Z�>2b�g�+,Fq/]��;�`4���d��Z��xN�c���9d�m�v&�>0�#����Dn���YX�>I��wB�6��a��M�wV�"�����K[ �WV�"�6�8O�l�ja1r�����������b����G	�'�1��
�CD��|/����!#n��##'�w��b����G	������b����G	+6�dt���!#vG��v�-�������?��������BI�`P��CF���Qk��[X�2�V��
{��F#���U�=��;��ZX�2�V��:����!���5��bu�a����!#j
��(��Y!r��Z��0F����#���w���b��ZX�2b�n���<>1�� }8��SJ�����
v�-�\3�KXZ�B�v��5��&�Z�����/���x�����!#j�,Ui���'-H!q;c	�oda1r�����xr�~��CF������g���$�����7��?�J�CH����F)�4wX�2bw���|���{�����h~�n�Y��+�����9DD�g�rj���9dD�fo)U�B,��CF�j���u��b�����e��
Vx��9dD�e�Tx6��b����}��\��}#�����k�S������!#j��`F���9dD�c�.l�oaA�p$�S�����Y�^)��"�O��b�����e����
��CF�:���S;�YX�2������+h,,FQ���:���!#���u�3���������!#j�<|����
��CF�:����dtg��!"j��R�ulwfa1r��\��v��aaA�p$�e����������i=������ 9���/�ZhiT�;#K�CH��"�F]k�����!$n��C�N�4��$���F6�so�)���!$n��M���6�� 9���2rh���O�--H!q��\s�[�?iAr��e��0JDO[Z�Bb�9��^+��E��?&���]����BN	�(��b����F��k��B�������"wV�"�V���+�[�WV�"�V��H<:sEE�!!n;��X||e��!"n
{/P��U_Y!r��[���K*���"�����s�x���
�CD��u�7�t������>l�w�#�f]�ix���~����j}h��������r]�sMlV��9dD�]#���I�CH��������!]iAr�Z�>4�Z	_��� 9�D�d���n��� 9�D�f_�U�`��'-H!Q+��Fl����� 9�D�j���8�����)���}��h�i��C^�j�I�CH��������/--H!q�d�t�C#K�CH�s��F
=�fiAr�{6{�h�}diAr�{B��h���'-H!qOi��j���HWZ�B���>4V��=iAr�{Z{��Oa`�'-H!�Ol_Ob	�,����!%�(�]UA���j,`���CF�3�5�Yx����CF��[F��lt���!#���-c|bQ��b����v
%��=3ZX�2����L�ft���!#�Y�-c���,,FqOj�	����
�CD�S�{���]a1r��}F��0iaO��������t�����������?����������_���O�������#����S�m�h���1����E/i�oP--E�qOOo��/O--E�q�No5�~�ai)���{n��t�B��ZZ��)���.J���2KK�7E���~yFlY}�R�M��t����u�'-E�q�J_.Z���v�R�M����1���x�r���G-z�P��_�?�~+C�|�k
���BY|e���1����a�r�V��7C���aQg����!o�����"����,,C�Q���^�����2�����Y�63<]a�f�ZT����`���e��!jI�L-�I^���y3D.(}T�Bt���[���N���-���'-E��'�����"��[)z��+^Kpg�k
H���O����G$���v�K��YSKK�7E���E����OZ��)��X�.j���\i)���{b��tR*�78��"o��'����2X�y�R�M����]
x���� o�������O(:i9r��M��~��b���a�f�{�v�����NX���vs>S����p�����_�z��l�]���~�����m�<BYhg'��7C�N�#��Y��������^������y3���|����g�+,C�q�+�P�/���y3����a�����y{0��T>OZu��>i)���{Ry��s��'-E�q���E������"���������X���~��%�;�������-�VC�#�{RyO#���OZ��)��T>I�`�'-E�qO*om5�J�'-E�qO*�5*��?H]i)���}Zy���
|gt���������@�m��R�M�F	-��~�~����"��?%��:�%���"o������F�]i)�����/��+f\��~+E�|��
r3�b�?���o5�?b ��0J�+e�1���"o���0��6v���'-E���a��H/���y3D.0�z+,YX��mL���9C���da�f�{��f�'�P��2�����fQ:Nhg%�� �g�#�QH���7C��k3�V�;XX�����6�����,�V�^?���Te�Nm�d����1��r�fQRX	��2�����Y��}sg%�� r)��h�����"o�	������xt�ZKK�7E�br=�T���IK�7E��'G����J���"o��%��"�5�����"o�����c��Q~�R�M��������-���"o���D����h�~+E�|��	�S\���1�_�I��P��������#���IK�7E�s�5��&��=i9�6!pK�y�G�4KK�7E�s�G��;#KK�7E�s�Gkdpgdi)���[b�.j�
������"n�y������;,C�q��E��������"n���P}4p�oi)���[������W��~+E�|�k
n% �0SJ����~����.0�I����'-G���Zb)�=�`������"j�y��Y����?C���!�U�������"j�y��s,X��"�������(`i�K�?E���F�	[U-,E�QK�#����VUK�?E�c�{z�<�aa)�����m?v�<�}�~+E�|�k
���������,�VC
$X�������4BI1����a)���{��u���}����"�u~�H`�'K�?E���Q�'���S�����(�SK�?E�y�q��������S����a������S����<vM�v.K�?E�S�g�3;��ha)���}�v���]����������J��u+a�T�u��R�O�z�a����
K�?E�������;V����SD�^�E*�����"����3��:����R�O�z}��5�7i�"�����e-�M�����"��	%���S,,E�q�����5��v����"���{����k�	��G	�I��#���%���|ge��!nc�FM(�;,E��[{������R�O���/fyE%�� v[�s���a)��������������"n[�k�6����S�n�1f��W�WX��)b��u�76[X��)��Y1��ZX�>H���������g��kk��vF�"�������I���SD�\=�M�-,E�Q+����#��YX��)�V���2V�����R�O�z]S��Op_t����"j���
����R�O�z}`������R�O�B���5sw�wX��)b�[�BZ�`���G	v�������u*5�SL_�i9��������F�FOZ��9�v��5�X+�b��r�����J=M�������#n�������4K��?G�����u�6�����#���������~x�r������9�����2�����qQZ�}����"v��M#���FWZ�>�[�����2k�y�Xc�JG�"����<���r��R�O���a����4K�?E�*�
�,,E�Qk�FN`?#K�?E�
�������R�O�~}-R3�s�	K�?E�����O(�a)���Z��`����,,E�����2?1��}4�������+��v����SD�^o��+��R�O�z�a���h�"����
��Y����R�O�z�a�Q�������"j����5���+,E�Q��g�3J��E',E�Q�����r��R�O�z}`�9����"�������)������[U�w}�C�#�Z�y���<i9����G��[��OZ��9��92f`K��?G�>"[F�������s��#rf��&�����#��}D��j��C���s��#�e��pF',E�q����N�lai9����I��Smjt����"v'�C����'-I�-���wM	�j�
�����R�O�����A]C}
�V����n�^Y�g�[��&�S�;+C�q��a�����WV���V�C_}�����?C��u8w�w���2���f�����WV������g?������!����-cU����J�GE>l�w
#�R]�
%/���'-G�Qk����s�a=i9���Z�>2��������#j���(kt�������#j������u�'-G�Q��GF��c�OZ��9�V���jd���'-G�Q����0K[�=i9���Z��d��>������#r5����_�=iI�H�����?S�^����E�KYK��?G���[��
<,r����"�	�tv�|������#�)�#c�	�����s�=��rH�T��K��?G���g�I�3��I��?G��{����}--G�qOe����/�--G�qOf��j4�xt�R�O�l��arK�KK�G��:�w���COu`{}K�?E���%���VB���S�=��a�
�,,E�qOfoy�� ,,E�q�e��%��i���S�=�]B.��+��"��g�7�Y���-,E�qOd��������S�=��a�
��na)���}{/S#��U,�#A�����������������?��������~�������_��}?���r-�v���[
��H�a��b���������"�a������C��"o��G���1W�J[Z��)�����8���JK�7E�c��E^�u���"o�����5��[DKK�7E�#���Hl�oi)���{@�����+���"o������G������+�Q����DpE��o%����xIA5�kX%%p���[
��Fjqy��kF�4ia�f�ZZ>SK�{���y3D-,_,�;Y��yD-*��i�N����7C���f1f�,[X�������&X���y3D-'��eL����e��!r1�L.[�#:a)�V�!��av���'-E��'���	��i��R���W����V{�R�<Oa���1����{!Y3f|���R�M���q�2xM���"o���������OZ��)��V>�F3W|.��R�M���q�������"o�����U+�'�IK�7E���������ZZ��=nS?�!��6-��2����e$�!��!o����Gh1
l.��[z��+^Qp��P[B{
����1��N��E�.`C',C�q�,������;,C�q�,���{`XX����X��Ckdx-��2������Z�����2������Q���8WX��=qO,�j�lQhi)���{by�X)v�������"����F��x���R�MwS�g�s�_���[)z��+^MpwN{�z��i��o5�?b �'����=x.��R�M����A?���2������[z�<�li)���{^yO.����YX��b�V>FeV��s������Y^+���;XX�����h��7WV��	�~>�B�
[���yD���z���WZ��)�>��8
]������W���7�h5���~����o�������"z�5ZP��ySD-(��w�)����!o����F���s9��#w[fAy��R��[X���^x�B�K���2����]
��	��2���3����>!�a�f�{^���2����2���D�Y���=�~+C�|��	�����R�B���j��02K���z��-z�!o���k����,,C���g�J��Y���P��y�0�o�x�R�M���G�u���IK�7E�'Gi�����ySD-)�Ci������"n/�>C>U>L�����"�Gc���}�����"�I�~�TtE��[)z��+^Op��z
-����~���I-.��C��`��'-E����y���4��s������-1�F{�{�R�M���[h�
����R�M���{���W(=i)���[b�.b��%��yS�-1o�D�!���7C�����Y��fi)���[`�\�	��yS��]�%���]��~+E�|�k
n%`^Jld���j��@��G�^O���+-G����c9��x������"j�y��YD�Y��R�O��|��^�ea)���Zb�0�J��pge��!�e`)�Y�n��"��=�S�5w�@y����"j���Q��w��R�O���^x��++C�q���0jL�S�~+E�|�K
�������fO~���,�~S}�Z\N#�x���"��W��P3z��++C�QK�gri3�����SD--�O�w���S������`�K�?E�y6�Z�;,,E�q�p��r��\t����"���{z	l�ka)���{����F;a)���}�v/Si~�`t�r��_�������]��@oXX��)���7�4*���Y�g�Z��.JKFt����"j���.�y����?C����\f��_��R�O�r}6�}5x=��R�O���3���=#ZX��)����a��?�]a)����m/Ri���,,E���y<�	�V`a9�h ��M������u�a��/���SD�\o������?C����m�ia)���Z��0N�^��ia)���Z�>���_�NX��)����^������?C���Y�F��[X��)����a���gDK�?E�+fh5wxWt����"v��z�� �������>qfV��
55�1����?C��u�a��1��"����
c��������"j�z��ea����!��u�3��9��DK�?E����1����R�O�r}`�^$na)���Z��)�:��i�"�����C�����;,E���*J!�����}4������l��?��\�2C�
m�fi9�������wFM�6�I��?G�~�����R��r�������G�E���#��=���y�
~�ii9�����z�T��������s��{}�)+lji9�������hlC�����#n���$�'x����#������9�����IK�GK���wmv��|>��,,E�Q�����jaK�?E�j���'����R�O��}`d��}K�?E�J��Q:��aa)���Z�~M/�3s��\�P���a��Nw�wX��)��������w�',E�Q+��"5��"�"����k�Zvt�����I|�+vf�z��������R�O�z�a�>'��
K�?E���l!���������"j�zO/�,�zma)���Z���K��e��R�O�z}��QEwX��)�V���y��>���SD�^����6ZX��)�V��:?Q/:a)���\��[����r��@����=�n"���`��'-G������V�h��;-G������g���i9����M���J����wZ��9"w�3LM�q����#r7��\�I��?G�n"{�ili�����#r7�~}�������sD�&�W���C�OZ��9�wia���'�+-I�-�m�wM
���
=�~�p����"n=;���j�++C�qk�a�������3��c�Y2�v���!��5�0cD[��2���~���Zv�2���vf.|8|ee��!n�:��X({ee��!n�z�qxA���!����0S?���R�Q���]���U�YB�	m�gi9�����z��uDlB~�r������{���3OZ��9�V����*x��I��?G��[F����I��?G��[����z�r��������I��?G�>�[F�{��a)�������������#�����
k�6���$}���'�u��z�:�PfE��[Z��9����2V�4`GWZ��9����2FJ���r�����1c���a)���{����ai9���{��(��YX��)���>��1�s���#��'��	f����a)���{&�����,-G���eo}%��YKK�G��*�w����R��y`K�?E�J��1�o*���SD�com&������"j����a5PK�?E�*��Q[����"��5�
���Tla)���Z�>�K��<���SD�`_��o�vV������>]a)���\�>�K��������������������o��_����������������/W��GT�S�!�L���4�?b������G�YZ��!����,�L����9C�=}X�����J�3D����EM+��,-D�q�F��O :i!r��{2��h���I�3D�c���VZ����"g��������`�sK�3D�#�g�*����b���G�u��bLh+�W���~�o&���[(-���-�N��#F��F���&�M���3B��[ENl }�E�!n���b�W��Yr��5�L+qa�!g��
�[H}N��!g�������2��ZX���6��kS���PwX��b���.
�"�����]�:�<�IXX��"O�1���,O���~��!�'�c��6�(��~����H>���-NX��"�K�kH�	l�mi!r��|.9��6�I�3D�s�1�Q�#��B��\��(�\�B����"����@
�p��"g����7�V�^rOZ��=eS?�?�_%�c-��3B���#����-,B�q;4o+a;�;�N�^?��w\b{���`w�;�N��#F��>y��:xE��E�!n��3���!g����G�����!g��]���T3x���E�!n��z��XX��bwL��Q��"g�E��,�E�
}�ni!r��{2y/P�U�����"�����6��9C���m#
�.mK�����}w�����M��~�����=�|&���q��B��l�)���	DWZ��!��M�,��uFt���"����b������"g��g�����`��'-F�v���9�^���,,B�qG��bJ����"���S�R��	-,B�q���P�(�Bv�E�!�C�
k��i��������\"x.���4�?b���5�9o�MW!g������D
�4YX������������!g��e��b�Q�������{�m
#����!g��X���������3B��u5�<6ZX���~�ZC��ZX���O��'x%��E�!nYj�H���~'B�|�{*�3t���-�N��3F�ZD�{������
�3@��yj}�o!��9#D.!��e�#��B�l-����l���!{�E�!j	9�V���'-D�q���9k��m���9CD-#����x!��"g�����
������9C��0�����ewX����*����O���~��#�Oo�TO	��Z��F�G�#��|6"1��p��9CD.)_{������9��E�\B����arF�[T�y�g;x��"g��E���h��'-D�q���E+1����"g��E��b��n�--D�q���E]<�����"nYy�X-��t��9C��Xo%�O�DW���~��&�E�3�X���'�N#�#��]V>;�1�3��#w#I-,�F_[�,,D�QK�#��:�����;B���fQ��ZX��!���y*�g�"w��W{��
l{aa!r����7��r��T�;D�����&��m�-,D�qO��mN���YX��!��_K���3`�wB���W��`/xg��s�~����,�~S]�ZTN#������CD-*o����9"w��e�kr)���!w��E�3��V������C��`{�h9��NX��!�^��]d������"n���������B����q
?�W�"w��h��V{�XX��!b�=�K��XX�>�C�{����1+���S��1h�;D���v�R,��fa!r��Z�n9�1���,,D�Qk���w�wV���V����V��-,D�Q+��&gTp1��B���J�[P-,D�q/@���=��2�;D��g�E��]a!r���yc	9���Y!�`�:M�����zu_!�~fa!r��Z��3����,,D�Q������AC���#D�V%M�w���CD�W�\D�Rea!r��Z����9������"j���\Z���-,D�q�Z��[3G���;D������Bea!r���Im�T:x}�����q?���/���C�h���B��b�]�	����"���^�Y�\2���B��b}\�������"j�z��9VlWfa!r��Z�>;���� "w���3�������B��b}\�v'���C���|�P#�3�"w�����%�����}0�`��j���X�2C�����,-F�q�Xo�&�	����#n'�#������b���r��yd�nK��;F�~�y���'�;,D�q�Y��?����C��g�{8}�AE�#w��������6&���c��i�a����b,-F���Z�=�Z��e|K�J���w�r�5����U��"w���<B���hwV���V�7��c�
]a!r��Z�>.��~�;+B�Q���EK�D"w��u��b6��ha!r��Z��&�X����B��j}\�^�`a!r��Z�>�������B��b}M/y����}0��-��������Z����"j���-c�"�;D���v1�wE"w���3����%��B��f�]����~�;D���q�����B��f�]��6����CD�YsM�/`a!r��Z��uos
�����"r��lt���������������	�5��������#n���B�u�����c���a�V8%ZZ��1��	90������c��r�/��i1r���)d�H�����#w���B6�;x^�I��;F�^!F�y�[�+-F�q{�lm�����c��r��V��YZ�>�S�[����u�j�	����C��b�1�;+B�q+�a���wgE�!n�:���H����nV��++B�qk�a�aB'+B�q��{mB/�����RVMh[�WV���V�����WV��bW����WV�>(�a���k���<f���/9���cD�e�B�
���I��;F�~�3�8���'-F�Q���2U���I��;F���3��������#r_�=��������cD�l=�~��/����#ro�Z������cD�n���Y+����b������
�������?$�O���9S�X��]4�O����#n��
#��I�b������QN�s���#w��������\[Z��1����0j�����#w����7�8���wX��!�����:������c�=}�:=~fgt�b�����_�E��b����U	/��}�,�}W��Y�.%��;X���B���]rXmelma!r��Z�>.F�_��B��z}\�3���CD�]o�v��4�;D����+�X����!w��u�k�\��-,D�Q���E��
2"w��5�������WX��!"W�������D'��]�^����������o��������������������?���_�*���*���n$-�,���j��@rFo)�v[��yS�=}\�>�?i)���{,z��ha��2���L�a1"���IK�7E�#���2?������"���k����c��"o��G����z����yS�=}f�
���'-E��Do�u�k1K�������Bm,Y���~�/)���[(9�o���[
��Fn��j�{���y3������Wx:a�f��4z�X+�����y3�����:2�w���7C�v����-,C�q{E9~b?��2���Q�f�f�
��y3���a���}p���[���N���r_�[Z��)"O�-�2*��J�������w���7J[�P_���1��������>KK�7E��g!Y�?i)���{b��Q�ulB|�R�M���v�cB�I��yS�=��]���s���"o��'��~�
�������"���3����o�--G�������K�`��;,C�qO��0�����y3����Y� ��[z��+^Qp��PRN���o5�?b�M����
Vs,,C�q{,����7-WX���6Y�S�\���y3���|�H�����7C������`a�f��ay�h���K���#�����5�	|�ni)���{by��3�7K>i)����~���z��i)����);.V�#<��R���W������B�
�j��o5�?b����e$���XZ��)��W>[�>�G�;,C�qO+��%�	�W��yS�=��'�:3�$~�2������,�QqFWZ��mo��0j����"KK�7E�v5�������ySD��g��%��kKK�7E�7�5����]i)������a���+�V�^?���f5�T+����o5�?b ��0j��O||����"jyy�kYX��"�����~@�����"ryy��j�XX��mL���9CJ	\�^Y	�&�{���U���e��!n�2z���J�7A��Y�������2������YJ��ZX������/|3��o%����x%A5vV�\<U\����1��R���-�,,C�QK��.dDx���2�����7"�t���
K���ZH����Z���'-E�Q��y�P#xI��e��!�����\[���'-E�Q�y���/�}�R�M������������"o�����0.��#?i)���{J����\�����J��_�z���G�}�{>���1���r�=�aEwZ��)"�����2X_~�r�mB���
y��li)���[`�#�\�=��!o����b��qDWZ��)����^sK���"o������<�E��R�M���]��^*OZ��)����Rzz��R�M�v�]��F�I������5�pmj��~�'�VC�#�]`�2J^<�ei9�7���H�=(����R�O��<��^���-,E�Q��#�;�u�����"j��L/�c�swV���^	�]�9�������"n��r�������?C��v��@�DwX��)�����~r�g���!������|Gt��J��_������0{�u[���H���]��1K�����l�~����"�%~F��a)���{��e��m^,,E�QK�gz�|�ea)���{���^z��}�wX��)�^�����36ZX��)�v�<����}����"���g�3:��ha)���{�vouf��3�	K�?E�����X����J�GGp>����v�J��8��R�O�v�a�X���;+C�Q+�gr�`�;+C�Q���E/�`���"��u�c��I���SD�[�}N������S��4���+���R�O���
���U=-,E�q����N���zge��!���{�S{�VU��G	�������v%���n���3�m�QB[������S�m�QB�a�"K�?E�f5�V6ZX��)����a������R�O��G
���=���S�m����J��[X��)�6��0����v����"nK��a�u`������"v��J��OV�>F�k�����Y������3j�"����
���������"j�z�(�L�����"j�z�qtlU���SD�]��eE�++C�Q+�e��h\S���SD�\��rJ�
-,E�Q+�g��<sma)���{���^r?����S���h�hea�3��G���w5Ud��S�a�vt��R�O��u�!�>�?i9����������x�I��?G��u*)�6���OZ��9������"z������#n���B��L��r������1�<�I��?G���[F�
,=i9�������0�j����r������cj����'-I�-�i��6��zv�a�~]da)���Z��#��3�;�a)���Z��0F
�-,E�Qk��������"j%���	����R�O��}M/���NX��)�V����s��"��5��L�U�����"j�z�J�_��R�O�~}h�U��������DoQ�X�^1����F�"����
c�4�u�K�?E����^z��dK�?E�����:�������"j�z����kK�?E����1#X����SD�^�
si�\t����"j��L/�W�I�
K�?E�����I����"�����L��������[U�w}�C�%���|�c�;,E�q{��~nk��i9����KdO0��
�	,-G�q{�l��	o���s��%rdd���;,E�q;�l=��3��r������7�>��N��?G�N"{�i�W��}K��?G�N"GF/�k�'-G��;��=�h���������wM
�j�
y��wX��)�V��hy�/_Y�g�[�}o���`���3��b��_�c�wV���V��HS��J�?A��u�����++C�q+��c����2���j��
5tee��!n�:�\��wV��bW�O�4�<�u���6����Y�.5����f�'-G�Q+���0S?&z�r���Z}��c����#���#�t��5K��?G���5��\�I��r���v}d����OZ��9�����:��h�"���#�������#��U�##��V�,-G��+����z�����%�#I��a�u��z�:�0W�>i9���{�:���B�[Z��9����2R�wt����#�	�#�u������#�)�-#������#��g���y-���;,E�qOc�u*�~mmi9���{"��S��O�j'-G�qOe������GwZ��9b��>sL����;,G9���U���.a���]�����"������fa)���{2{����� ��g����V����S�=�]B���i���S�=�]B�_[X��)�����K���!wX��)����[��>��>a)���{{/R�D|E;a)���}�<��	;��?���~������������?����������_���O�������#j�i��zn�K��H��q���,�J�@t���"��YB�����,-D�qH��e���e��9C�=}X������9C�=}��&���9C�=�Y������"g������S��9#�=}=�G��K�3D���g�3z�����[��Z�\��6��;z��+�LP��j^��#��;���CjAy�(��!g����������9D-%kL����"����|�+���+,B�Q��[En�`�-,B�Q���������"����|��������|&�^�@v���Ya��
�\cP���B�y�!������;!z��+�Bp��3v+Gp���;���G������<����"g�������@�ZZ��!��J>,�K�OZ��!��J�,r���^i!r��{*�l�g��s��"g������*�`��B��\rla��PFwZ��=gS?�a�����wX����a�U�{t��9#�������3�E����������?"�y���i��(r[(�0s_JXX����O>KN��wX���6O�K_	l�~�E�!n���$�pBWX����M��X���!g��=����
x������c�tr��9+�W�ZZ��!��N�,�`��'-D�q_����D--D�q7d�E[����~'D�|����i�]j����,�N#�#��{:��"3|�{���"����b���G�+-D�qO'o=w�2K�3D����Ek`��'-D��O'��
+�u�'-F�v���5�6�#�wZ��!"���{����N�3D�o}jh��/'��9#D~��g����3K�3D�]�a��#��������x7Anz��n�������i��8��^��HN��t���"jYy�PK+����E�!r���<���m�I�3D���U�Y�{��#o�fQy����kXX���^j1C�|�earF����=N`���3B��W���o����9#�=��'���v�!g����s�������D����xAEv�����Vw��F�g�!��<�g��(��9#D-#��c���,,B������ZGt�B�l5����fQ����'-D�Q��y��z��I�3D�%Gs.�V�'-D�Q�y�g"<�i!r���<j�����>i!r�������r/gwZ��!�
�+�Q#&�I�����������J�ta�w�1����a�j�_�I�3D���YGR�et����t�-,�bZ	�)=i!r��[X�3����N�3D��ra������9C�-,������OZ��!��7��JF��;-D�q����sX��9C�-,��J��[Z��!����U�v��������x;�-\cW�gFz��i��8��F�m�+,-F�F�ZZ9����,,D�QK�#��x_����"ji�����j"w�����"u������"��_gr)�3��;D��9�Z&����B���|&�\"��ZX��!�����K�8�+,D�q����2x����	��_�v����������,�~�
y��raoex��"w�������-bI�;D����������"jI���5c��;D�����1������"�5;�E��_��;D�6�#�T���+,D�q?�?O�=~����"���B�������"������������X�/}W��Y�n5���o,,D�Qk������[X��!�����6��,,,D�Qk��E���YrG�Z��,F���YrG�Z�>�S_��[X��!�^�ZO�g�����C���L.e��+,D�q��mc��_-,D��?m�2��e���������%�����B��mG���q���"v��^Z{��a!r����cD����!w��M;f��<t���"~��	^�ca!r����c���T��B��i���`��B��i�L��3�	�;D:��2�b���{�N��%3�b]S����~,,D�Q+��E)`���
�;@�j�Q���7,,D�Q���E�|����CD�W9�_�ZX��!���keT�;|�;D�z��\zi�rv�B��^}\���g�+,D�qo%O���,,D��o �����MR��lz�]M���T[�i�K��;F�>�F����,-F�q;Yo)'����#w����k~I��I��;F�n�e�Rf�Y[Z��1����1�V����b����uiF��/����#nO�=��:�'�;-F�q�Z�F\�%���c��k]r��������c�w�r�U��B+b��,,D�Qk�y��������CD�`o���=�YX��!�����>���,,D�Q����({����CD�]-F|9;a!r��Z��\��U�YrG�Z�>�[1��YX��!������x�����"r��Z��[���}0�����z���W���,,D�Q���E/|ka!r��Z�>.j�YX��!������O,g;,D�Q�����,,D�Q���E]�K�;D�z�q�V���"w������Nl_fa!r��Z�>.Z?����CD�X�5*�WzZX�>G�����v��)���R����c������	�n��;D�>!��\����b���O���[7��#w��}B6����wFWZ��1��	9������	�;D�.!�E
�Ydi1r���%�,Rk|b�}���#n��k�J�O�'-F����������'������?����5�r���t���"n;��2�[��!w������?!��"���vF�|�eE�!n�:�4���dE�!n�:���k�^YrG�[�>�S����#��V��%�M����#��T��g����"���J}^_Tx);Y!�����b��QdV�K�!���e"w������^,����#j�������A���cD�Tu�O�iWZ��1�V�_�K����vZ��1�V��X��iOZ��1�V�/��O0:i1r��Z�.e����I��;F������[����cD�`������ }	�3�]G����S1�O���c�=i�a�2��wX��!����.J�`O�'-F�q�[��e��/iWZ��1���>�K,<$bi1r��{���/�t������#���k�j�����c�=}`����@,-F�q�`�������b�����Q�S�OZ�>���H=�]������;,D�q�b�P�j���WX��!����.
Xz��"����f1
�����C�=�}\$������"�	���V�	��B���u	y�o����CD>}����J��!w��'�C�����B����9u��*�	�DF�K��C�~��?���~��������?�������~��*�����y��z\�/a�w�1��c��p�y�B��Xt��wwX������}�H�I�3D��{u���WZ��!���9���	��3B���i�O,f'-D��B��>����"g����{�`3jK�3DA�^?���b���G�s��;z�������_�^��,�0"Z
��;���EjAy��q4�p�E�!jA��(k`OO!g����K�#��
�3@�R�AQS��A��3B�R�V�b+�!g�����b�?�]arF�ZF>*J��+,B��������Dv���Yi��.-m��bs�!g���h5�K������_���l]��]�+�N��#��Z@>����dearF�Z@>�J���P��3B��V���	]arF�ZB^W��o���9#D-!oy��BWX�������4s��!g��%�3��vj��9{��~(?��^vbarF�{4v��*z��!g��M���3��������-Y3�����i��(r�$��z� �;,B�q�$��Z_�ZX����H�*bE���"���C�V�����"���Cri����9���|M,���9{(�6c))�������9#����7���P��3B�W�{b-F������"�f��X���I�����Mw�Tbh=�-�,�N#�#���yO���$��9C���|���G���N�3D��������"nw��"��vG��9C�����9e��XX���m�%�Q��b���E�!n��fI��G!g�����t�9��"���xHq���B!g����5��+H���������E#�6����4�?b������{t��9#�mm���m�u�;,B�Q����1#8YX��b��8��;x_�������[D�a�R����"�����b7�wX����:�a������"���K���-����E�!�	�z���5!g������
<�j�w"���W�������a���i��(R���_
[�,,B�Q��gR&����"����|V���+�-,D�Vj9�JM���I�3D�2r=�12xm����"�5�#��+���I�3D�R�a�R[����"g����F��[}b�'-D�q?�3�4�����9C�=�Y��8Y���~�o%��o}�2
�j�I��H��q���6XU~�B���|`����J�����[X���
�\��9#�-+��(�ZZ��!����^��/�}�B����f������B���|X������"g��e��@��3x^��B����Y�^����B��b�Y�9���~'B�|��	n	`]�1a���~�����.*��lj�u�"w�H-*�R`��;D���v�������B����]���
�;D���vQ�j�lha!r��{C�^���'[X��!����
��'��B��}��+W��6�;D��6��2��g�"w��o�bH�$�A�~'D�|��	��i��i��H��v���K-+�z�
����;D���qQx�����"jY��<Taa!r��ZV�&���
wV���^�}69���NX��!�^�sn`k	Gt�B���f�����YrG��9��ZZ��\ha!r��{|��-����B�����^R����}����}�E[����Y�n1��3�����CD�W��_#[X��!���[
1W���B��^�'�5{��D"w���=����/���CD�X_���caa!r��{����U�}����"�{��2V���"�����f1����',D��?n<\+�����<_�]G��;f�evps���"n��s�ik���wX��!�6���upE��"���m��g��\�;D���E����;D��{�*��_��a!r����c��k���
�;D��{r����;+B�q�U�SK��,,D��;�l+��_-,F�#���w}���W�R]�X[X��!�����\�kUwX��!�����������"j�z�(ctlkma!r��Z��.j�X�����;B�z�aQx����"j��lrR�9XX��!����&��	o����C���|��9���"w��w��N^X���
���=������yf�:�J��XZ��1���.5��>�?i1r����:��Z��wSwZ��1�V�S��y�8����#n/��L�Q&�A���c��f}v;����'-F�q�Y�����K-,D�q;Z�rN�Y�'-F�q{Z�E*��vd���c��j�i�?�J�J�5���*v���
�$���CD�a����70"w����"��ma!r��Z�>.J��"w������7�FX�;D���q���|�;D����+�
��fa!r��Z�>����YrG�Z���>�#�yDD�Y�*�	?�]a1�`���E�����gV�g����C���CD�Xo=-lM��"���^�Y��3�;XX��!���/sa�;D�z�v�K��YX��!����.���DWX��!������#����B��^}=o%��!�;D���v�F�X���B��b}�J�YX�>G���w}���RB����'-F��;�������i1r���)d��3���=i1r���)d���.�o��#w���B��R*�'���cD�����5����"n������2����#n���������b���S��_V����J��;F�N!{�3R~[Z�>�S����kJ�V�W(3���wX��!����*i��WV������,#���++B�qk�������^YrG�[�s%����!w��5�0GG�W��"���b���_YrG�[������"���RVL~�?YrG�]��02z)�++DT��Q��5��
u�=���ux�b�������&���I��;F�~�F�9��--F�q;Zo-�N��#w��=����;,-F�q�Zo���Y~�b�����y���~�I����#ng���25+����b�������5��n����c��o}�0`��WV�>�3���|�Ag�)��Bi��/B,-F�q�Yo-�	�����c�=k�a�^��E�#w����7��x���"������1�u�I��;F�S�gz����b������2�
>�?i1r��{��,S��-g,-F�qO`�����������#�)��~t�jiA��e��`���N
�0��B���]rH}��G�;D�
�vs��lha!r��Z�>.Z�p���CD�_�*f�Z+�;D����\"xP����;B���aQ������CD�[ee��ia!r��Z�>���<]a!r��\�~���k�,�c���������o��������������������?���_����)�j[�~[����G"���Q����� _��������?��%�� j)y������,,A�Q��El�t�%�� j�,L9��`,,A�Qk���*����%�� j�L+mD�y���K�z|��Y��/� _�����}��XX�|����z������H��_��������"��
��Bn3�Ro+=ZX�|	����a����wX�|	����(�V��������|&�6�����m��Q����wX�|	�v|�a�R�[����m�\Co=��a	�%���y��[J���*�p���0K]����Kw	�!�R�U��o$����x�@56O+�91j~�a��H-okTp����D-�i����v-,A�Q�g�J���� _����EX����K�p|��&����D-o}����K�p|&�8&��]a��H���}�sQ���K�/A�s�=������%�� nO�=���6��o$����x��5�G�]�7�1|�f�{�H|X�����t�Q������mt���c���_Y�������L*l�ca	�%���x��W�x���%�� vw�rm�6�d%�����J���|�[Z�|�~n�U�1:��>i�e���u���
���2���mk����od����x���1��K�c���~����H- ��B��c�NOZ�|���_[�������!_��e�kf)h��'-C�Q������i�e�\J~=���fWZ��ml���QC�%a���%�� n���@/�ye����|sO*��EWX�|	��*:
�[�
����-J��ax���H��_��{Q��~�	�,n�7�1���3�<
���� _�����3|Q�� _���+rX��WTYX�|	b7����ACwX�|mF���J��C��%�� ��%���;+?��p;����a���%�� ���{V��S�	K�/A��q���)����-gnyFx��o$����x�@5���Vx���o4�?b���������WX�|	��7�:+�����K�p|X������ZJ���<s�9w��WK��/C��q3�V�����2���q��\������2D- ����
���I��/C�NP#�8
:
���K����b?e��[Z�|���c?����z��+^Dp��������O���G#���{�Ox���2������~c�;_KK����[L�1�Y"���I��/C�br�������!_�����b����,-C�q��i�������2�-&�N����,-C�q��{u��3k���!_��������0��e��!n�z�u%|��od����x%�}��CW�LX%�I��@��ad����k_lYZ��
$����Su*���a�f�ZP�,�,����e��!jA����YX������!��6'��2����Ei�~�w�e��!jAy/O#�	����y3���CO<�ja�f�{�>�W�a�f��Vmo����+�F�^?��W��.�Z�����7hx�r�7�s������3����� o����KE��_���7C�R���Ml�ma�f�ZJ�,z�`���7C���/+ZX���^��Y�VqC',C�q;h��%�-,-,C�q?���������y3�=/�Y�vm��y3�>-{�c�W�+,E��w���U�c��[
q%����e��!j����R����y3D�T�&lWfa�f�Z�>�SY����!o����3���0��!o����=����
��e��!���g������e��!���E]����!o��-�N�g�o]-,C���c�0�������"����R�s��K��YX���6�ha�
6Y��y3�m����}�
^��y3D�So}���2���N}�Di	,s���M�5G%�	����2���J}6�e�mz-,C�q�O�!�	����y3��4�L-}�k��!o����Z�ul6����0��
���:u�!��=�Y	�&�Z��*RG�YX���V�7�<c����!o��U����6����2���J}��>2����y3D�S�������2���N��Z&�Xv�e��!j����^�aa�f�{��^���?�Zv�2���f��@������ b���]-�U�TR#���,-E�q;Tos�����y3��P�Y�9��JK�7E�Zu�+��y�R�M�Kun��^�C0��"o��}��
1G��KK�7E�N�g����R���"o��������f���"o����K5v�[��!o�����SW\u��,-G���D�@�X��3�5;��YX������8*`K��� o��U��b-�l��e��!j����yb��7C���a1��6��yD�V)F|3t�2���V}X��	C',C�Q+���2�:a�f�Z��������2���N}-P��ma)��a����Y���0k����e��!j�z��}���,,C�Q���E�����y3D�S=ElOha�f�Z�>,������ o��u�����ZX�����7�8F��-,C�Q������'���!o��u���������2���N}=j��=ZX��}����n�z��>�NK�7E�> u?o�R��ySD�RC���u�e��!n���M�I���"o��}@��s?���yS���w��-t*z�e��!r�k������R�M��~���|�������"r����|�����"v�-��:�v2wZ���/	6��	�Z�^a�����y���w9m`���y��b�D��J�7A� !��7���M�H�c����y��b����y���R�`��+*?��p{�Y�4���������OT~��aw�8,*�6�����+b��������87'���=i)���[��.z��J[Z��)�V����5�]a--E�q+�gv����IK�7E����]�����JK�7E�
�vQx`��2���F}X�2�����"o����������[--E�q+���(��WV��	b�����FGw�wZ�>�K����u�W�������yS���q\�-Wt�R�M���v1����k���V�%0�~	��s�-���eUhQ�����X�KkK:��$���yWNk����+��q�{�%�s��0��/�3�7):4)�������?S��C���N���������I��I�~'��\��%������w��F6��F�M�M��;D����o0�F�M�M��;D�er��n������{��I�h�����=�#c���R��^�h��f�>��C�����	'�9�|����d��dh��k���=�7:4�k�Z�"Do�W}&�&C�&C{�Z�X@r��3�7:4�k�Z�rD�?4��C���f�U�a�L�M�M������d2�}&�&C�&C{�V�y������������s�*	�����R��'�z/OI�i}���w�N_=�"gw����������?������?����7���=y����3Y���/���7p��b����C~r��o�����;�rb���|�n����;Y��>$=�4%������N�_�:}���e�������_�_]>�t}q~�~~����������g�p~}u�����O��?B�~�
J��L���2���~,2�����2��"��"��"��2��"��"��"��2��"��"��"��2��"��"��"��2�U����hUd�*3:+2:+2:+2:Cz��^u\�����w����������f�������o>�����@��x�a����wW?�|�������G���>��������/~�������V����p�z�q}yw��������hHxd
�a���������W���cY��"��?U��c��Q��Q��Q��Q��q��q��q��q��I��I��I��I��i��i��i��i����kU��*�Z�y��y��y��y�q4)4��B���
��=�?x�W>}���:����=�����O�fO�
����W�����������=������Z��bNy�d��k�U1�`k|����������e������=��v$��&�/E���������`�|?/Me��Hx��]�|< (��8�w���e�:���}!��}���mU�����cJ���W����Y��O�2��������bb�$����l��2���h�`�)�b��&�d��5��@>Y�N�+T�) ��FZ��xwqx��~��f<�D=N�7W��l�"�o2���j!�`|��y��v[>������7^�2��l�����E)�t	���)���������.Y�
)�X��1�u���H�8�B����`=�3��
�DF�O���`����'����I,K�B}�
-,�g�`��g��5"�?�-hS��~�gg��;��^�fa����>�"��<��'N�����[��
o�Vyx9�-���������*���q|x]=�S�1�@<��jE���V�O�G{,<������W7-�]*%�����Rq�\}��u��R��y���\j�f���J��V��k��0��1�^�L���z8��)���0~��d�Ng��#G{f-��\QJ���h$5>s���A�J\��h���Xv91{P��}�G/2�3�+��F{�;���h�����������]���Y�0m�~$��h�����%POH�F/���P�&"l��L|h*z�-�r$�)�o�t�>-������CP����u��b�����KU��h��.k7<m�9m��
��%sn7����s�`#������:@�aJ�S�3�X�c���F�@�G�]vS�`,BT��zYX&��U�����9����f��U���L\��6�3��GX��5���D`]@��������,m?��1w/��/g$�
�X��kJ�'���U3���s��'X�G��������R�@��O��P������L=8��u��[*���5�<�ce��W3�o>&J���K!
�[O����y��Eu�X<�����^������[v���	^�Z����I��C-}���+�
����)O�
�<Yk`��>hY�U5���b�36�N
�������L=~9ch�+;a�@�j}�z�����<B|x��q��a�&N���g�C�)[�4�)���c4��8��OX�uZ�L<|�9�6K���MYz0�.���`����W���f7pG:����:y�`n�P��7 p
6���ek<�l������/����!��npx^W8&��w�B<�u<N�����9_e�Ct����Gr��"��E�k��@X���o��w��D������\X:k-��e��op�������2e4��p�^XZ�O�V�4��udlht�r����F���2�S�)[�&�W5MY���o��f��HB;8����Zr:�b<k#�x�S��^*��w8��7�B;8�,9%�W�_����� ?R��vfG��S��bNm�e�e�����{���8~Pgk�9�O���%����|a���:�t��?���]f�T��Hd-g��NE��IPK�]6V�*�`AX���5���cR�\4���z8@Ld~�W��oq�`}�����K����v����9y5S���&�����C�a5���7�&�l\?7�^F9�u��>�a�>���OgWt�������Z���$y������C4/��rg7Idd�j��pF[�`�;Bf��S����{���cD�zpr�P�$z��Z8|i��7hR��^)yMdc����B2Oq�N}x5�����E�nUk %�lu�����xZ�V����*(�����L=\ct����Y>�2�V3"�����a������)�,]���=��1����Cvv|8�+���o�g�QJz�W���8����wvXA�D
��}*�+VM82;�qW��������sWU���q�����Y�d3�a����@G�x���sdus������Y�;w�Q�������6?���������W>}��}~��^���/t���G7%�<���������}Z���.����z�O��>0@���f}x.�o�n>��[��;	O����L������*^G7vf,�]�O�_>�z����L?�__�e��W������7���w�o�/riA�������o�s��}�G����=:d��[�F�l��}������3�(�C��������O�&��1/S����Ul���?]
&���v�B��lvp0��j�y9�.��<qH���2�i���dI'����X��D;�M?a�-cZ��-�����C�<0&F��[�P�.��h)x��8#����~�����4�g��b���L�v�<q�'-b����t�A��;��4���c���k�o� ������F�;��>c��p������9R�@��4u;vq!��-���������^r,8'�#���V��)��L5��
�o
9�Tu���]|�����>5
�}�bZ�Fd�H�pJ����@�t�����CM�U`��X�Xx�|���Y�R���B�&?�.bs�^p� ����
(��v�?h[`���a�fw��C��x�^+�>�u��jN��\������]LAv�������������wQH'-R�3����nKD��?mXyE�o2�Ti
`�]B�U����/�R���vgY���I�����Q����||���8r��)��	���H�Q�)p�)������(�x�I�A�1��C���`)x�c����.c���d�B�t����I�/';��nr�Q��#�����-���X\5������@�Q���=�c
Z������g��+�&w��m
ls�u&|m
�fw����P���U�C]n����9�8H"W5^FN������U!��������B�>��|1aIt)�\z+�>���-"=:"�ij2�y�sq����OD�K��
y����5�
G������9����A�[�����MA��NZr.8���j�,r.��c}�>3D��S��8��s�]B�����RD�`�|.�.��t�^,�C��������.��i������>@)���d�uIo��lF�)Q���.��Y����L���*A�;��M���bQ���� o6'/���DI���E�uY�>a�R�s�0�>���!�r{y���z�9��Z��Y���M�L����PjB,���)N[�Dl!�L���>������8@����9�r�z���H<��\��X��uc�����h�����f{��%�h>�$4�-����,?�NSW��^�\`�	�\����H����$�w]��A��8��j�Ae���%�i|
���tu^��6}REM��Df�	!�� �*<a
]���6��>$�j!U&$`���`����=�p�C��2d��@PU:�G����F�1#�
�����(��&�Y�/��G��TJ]}B�6����H����T~/��"���:o)��l-^�wI����� ��8�k
s���
>�'��BT�$��=;l�`�G����=�����Yq[C*�QTJ��iC[_L�J��@��%�}�H������<W�\��w�� I��9;�i	��.��i�����DH1����:��&�A���\W�J�)<k�/��)���M��H^�m��'/�
��6�����AL�uK\*Qu]� N��M�r�6d��<iuvM�#qC�7�����@����+]�>w�'M����R������*����8m[}I{�ai�{�v�����V?$	����!%W#�aJ]n����{D��\F�;�a�O:�d�W^6���m��!�E��cd}��J���Zo�mX_% 1oX$�B�p�.��q|Y���-����LC��hm$z�AX���SJ�M�Y;�D=�:��nd'%	�e���v��������~��
��pB�������W�i��//<��4������E��+�������~�,�5d���j�k��8n[}��x��}��t�T'�����'�����*s2�E;�������SJ}z�6�HA_�����w�`k�>�M@�;\Y�����O�,���6�7���T��N�[���6���u�_"�4�J|M�>M�K�s��'��u�l�j(O���.�?�
>���I<�������6���,�����m����vr%�d`�1P�0�>#���s'Q[����n���m����48�}�!,i��Q����������8j����y�A�Mj*@S��������R�]����UJM�%�q�%���B�NcQ���\��y���k/{��SWM�D�F�����N�
M�/�'kOF�5%n
���q�u</{���q��B�E����
������S��r���(��"�X���4A����@�N����i�����'H��|�u�z��H��&���%���.��}LC��`�����k>�:���.h����WZ��wO{,R���k�����aQ7kJ��w���N�-��!zQ��r�e�N���	>i�OL���U��:�������n��0TMl�66�
>�\*�@�����\��Z�'�����D[*���'��
�?J�?������)N�I�[C4t�����D\�����SSb�,O���9Z����p���Uc�B�4���	>��<$�8s;|�R��&;�S��1:���>��������}�	���#������>N�R�c@W5��u*=?k���E��E�$�
���'��/����]Z���3u&�"_�B�i{�W�w���
Z�(��
U3��S��q|9��b�b��J�Z�N���0�,�DmU��iJ�i��k��X�J��O�R��$q(b���f��V���{k�/�A�
q���'���m��Dc�G�?����3�Ic�<�~�
m�I��H�}�:����7�P@�A�x�����/8i����2q����U~{�?�$�9�}dSWM��.]D�-����S}{��^�M�;��IU�V���a�����W�C�]���]���=i�\�TS����
�D�@H�n]���D��b,�?W}'@}���n�&��jm[� a\L�H����}����Gf���q��<Y�a��&������G9�Czm���i	����j(�{h2���_���mt�O����������-���w�r���z}���tqs��on��������_^��/�l�������T�?��G�!?����?�������g>����'������{��������)����~}�,N��jZ>\����syu������.���8�[?�z����������8�������������?��
?z�?�
����U���EF?�Xd�c��Q��Q��Q��Q��q��q��q��q��I��I��I��I��i��i��i��i����hUd�*2Z������T�s>�W?�����w�|x�??��Y�y�lz������|�����?^X������/��?���������Or�E;_�����o<�������?��^{��������hHxd
���P�q�]4�+E�����|Y
���*����������������������������������������������������kU��*�Z�y�������������$���3��:��������?��W>}���:�
�������O�f?���h�����������������=������Z��b~el'K_�lN������������q���~���i}������@b3����������@������O���������4���#'M���rx��}'�	=�X���3�TQi+�l_d-s����1&���^T�����,[�Io���|0D�S��SF�J���������G|�&�P/���0�-`g\��|0��SP��|�������������W�+N��Q���L�O�^S�b���[n3s?��`����
����tT� ��S�T�5>%����l}wJ�hl���C7V$���)�p����V�E�
_��U��d"�C|��-��(n�7���c�=�w*u���� � 84:f3�h�����4*�x��c��i�}�'�J�
�`��J%�[�p����v&Ai^�C����,��Ig�a��c2S?n�����f�'F���f�+��R��mG��]���p��(,=�h^�1�c�K!�
��K������v�y���
v15����*47�)3�f�}�O�����ID�;i�(d'3$o��*�`��<�����J=�-qK�J
	*�x������l�GC�8(
}�P�G#L"�9X�@%.��u*��>@}Ns�����oa���
��(r�i�4�5������s�Q������_��;��U�^��a�����7�u�-��Se<Qd�*�x���+l�o�W_��h��&���xJD����OD���Jq�XTv�����ceR�1Dk���]��5@4��f����:����ne��tJ�u�q�
�I�7����cF�����K��z���~bO���ODu��#��D'^L"c��Rv�0$���p���!F}����3��E���6&q7��!F�s
�G�(t�B$g=,J��E��g���`\U�X(�E��6{8�����<W���0����B;��Q�Ji��q��ElLE������0�����(��U�S`�f�7��!��������ir����~&�akt���>�����j�pT9����^����3�F�|&.��r6�jB<��+������F�8 L�Z�8S�a"*���p�G\��
�if������5)�+�����I��2��?�m���\o3�81E2���������}/�(xg,��������lcmt��u��1]6S�E�e{���w�`�f���(s�����;����F�x�>LOS��z��zp�yf�lS�����������s�[���zp\%,#'6*o�\��Y6�J��~�����<�5����x����|�5�����6�=R+f����(�3��x52s<{=!�#����zp�;�<_�����w�&�`�;����`��y3�p��h�f���;�)�7��2�����H=��llBQ��Nk�9$cD����%����-����RT��������L9�v ��{���1J=~���:fb�����6�/\����~+���0YK��Y�f��=&}��<��y�} �V�`MM��������q����u�"�d/�3�}]��o\Z�L>z�u~d2����=�V�:1�u'Wz`�B�U|@��������i�F#��������[��xpzTX"�����
��'�:�S�G0���lMC������#�FOJ�yAl,@���*o-�����J�Tt�q��#uaf1s1�-��w������"���W����J,�r�<���H����\����W\UJ�W:��_!����H��R�n���h��R��	����@V�]3�Hu'*<R&x/��<�qC>8*�A\k��L=<����t�95>A����y��|�>�l�K����|<����m)��qADSp��	���W�A�	=���o�~*�������	�d Z3��������5A�x��vY�G��1Z�}j�*���]=�Q8�dT8{�,����E�'M&��U������Q�hk���|�XY�)`4v�����C��\����3���%N&L����zx�;�HgN)���t�DK��5-�!-�Ng�c��!���4�(#���DU����sG|:C��/3=V�%�����4�L=�������J>���eI��.��v!�'�l
��z����t>�17��{@�zg_��v����lm�V���\yr�NK������+j4�V����xf�q%���+��H�`0�S������/���G]\
>}n��������u�'�����^?)�C2�z��7�uP��k�8:���o�'�O��0}�����O�[m~t���O�����>|�xy��f}�>�[_������^������y�v������%�������"�H�_~x)���/�7��yi���b�����A9��������x,�4^QEl`�	���.���/�]����_���/�2��+��Vt�������������E��\�%���?�E(�eQ���R� 9&�r }q���nC����?^>p���r����m�wZ�����R��}�Sa����������<x�o RS���
$��W
b��1��]i��V��S���������r�Ts�
���d~�-����r)=lmv���v^v�C)/��]�c�K�������\B�rj���������wYt�(������������I��+��)�]��i��'Q�>8���2�������g��c�W���|�B�b
Z�+$�
S",�s��6����7��v'�ie�Q<�������Sp]LAx��3�h���-�V�,JS��!��I�i�p��u��'
�S`	R\>M�OX�"���!I��T�N+�<�1��'��b�%�I����6�)L�%�<k���)Fu$���/2�c���.AuU|m�fw�"[@�[�\��C����"�����SK$�*���Vw9��-�1a����-����4�H��B�;�;�!hYy-��!�5�!Y����Y��V#'Q�T�������Y�]
��(�b�G)���!��� lv',-9��x5*ID+uI���GG	I��R�j<v9��-�AlA��q�\��N��d)xU����Q�J�)K�4uIS����)��3E*��R�'�\5�����b���~,�)t9�g
�E�#"���	_�@8����V���j�k[7��L^����]iT��s����R�����h~����p3����1h@?�y�.��\cb�[�������SL5�L��)uY����Bb�Nz����N�4���`&HL����-����-X>�����h��dJ:��	[���� _�����D�F
��QNH��'�i�"����or,����B�Qv�f{��ZP��]��I����L�!��S�B�p����R�h�sb1��hR=�R��Z��������P5�v�&��5`��9B�������rX`�8Y�,��%��������u�V�^S�Z�:Z
~��G�ziPY��'�~���bc����=M��?i�=$YxX����j�N[��c���s���XA�EjVM+��v^�(�S�V��mA���k�y����2���6�lQ�����f{��%>������=]�>����G#�$��g]�~���'.hB��s�G�biBb!I������)���$aB�R�sg�_"Fq&j��f�]��U��tIG9%D�
���]�������)��}M� ����?h��j��1=�p�A�,]$$��8���Z�	M���$�)B�������8n�(%`�)o��SE��r�sM���Ex��^��>�B|�s5]t�W�P�+�&�	�3ie8�xa�>��&�Q�������4�	v\>�i0�"wiF���@X����jG��M�=��L�b�j�$�Lb���=O�S����8��]W��������211b��|�Tg�,��PP&_���M�WM��Y��\����z�O����
>�zv��8���=�f��&/{���i���e=��!��a���Ow�r��re$Q���u���gVE��r�6Y��gU
1C����6��Rx��!�\�t���<m�N,�>�4���L�E�WM���U�����2�,b��2���z�%�IC�*��K��e�u*/����2�w�����|��|��
�����%u�5a�3^;Mt9n�O!@Ql����4���	~�I���@�jfot�=m�}�J>K�,��N��Q�����s������_�����������/��m�q6|��e�o(�E�I�?���f[�G'��?x�T����.Y�g�Q�u���\S&��;���Y+$3:�������E;�6����h�����J����MxP�HA��T���iXh�/�WuR��?���{�]L�}!,���E�
���K��L��&��Z6��g��/��4���b�EWs��I�N�IM�����)��jJ�U�v��d�y�*"���{�8�.��j�/�A}t��
�%`�3p��	�D�.hV��PzHb+|�3]q����"i��f�o6�E��Nor�;��`���g�Q��$�N1Qr\5�/tK(5���eBF�57����>i�������^��.d���<m��(>�(V�1V���N��	~o�(��5��-�Y���Q�A�@qU�R�i��6������������O�wT[���2�h9|u�$�����b�jlvj�>n�zE"'DLs�*�^����g�o���Q�����@��
�K ���?�b�^��VM�I��sq���}���e;k���,#�U�����`��aW��a��[�]Z�����{r^/BsMN`���������5���E���zU�6��pG��J���S�yM���������O��i��;��	�j�u����jY|��������:�N��gM�j�6FjD?�����ml�����{qa31Mv�8OuQu�*����u�YpA�n���I���B�������E�9�h'�NW%'m��c�u��:��}lC|Q�I�JH�F��/c�$�b�I�T����� ����X��(x��^����A���Cc�vh��J�%-��%��^��rV~��h9|��"�tHo�5�
�;u�(5����A���|5a��U'M����>&����F���OF�	�c-���	����N�2Z�'�KuQv:T��?�^�����,N��k,s�	w�=�ml����q����.�ieu���Ju%|}�'<Z���������i}�l��~r@!8b����.��
~P������uqC��9���RN1�j�o��[5�����.�����i��Y#|A��;H\y�N�S����Vs��h�oL�E���K�p)P��Z��&�
~���l8������x7�{����*%�s���!�D<^�4��j�=P�j��s���jRz����D7�'�(���d_5m�:e����kG7�����_�����6|�����z�������������[1/�a����������?������������������;����PK�����LW!PK�[CL�l9�..mimetypePK�[CLPb^x��TThumbnails/thumbnail.pngPK�[CL��S��{Object 5/content.xmlPK�[CL�P����%Object 5/styles.xmlPK�[CL�A�5g�'Object 5/meta.xmlPK�[CL:�R��,
I)styles.xmlPK�[CL�������p1Object 2/content.xmlPK�[CL�P����CObject 2/styles.xmlPK�[CL�A�5g�EObject 2/meta.xmlPK�[CL���Ik��+GObject 1/content.xmlPK�[CL�P����VObject 1/styles.xmlPK�[CL�A�5g�XObject 1/meta.xmlPK�[CLdZConfigurations2/toolbar/PK�[CL�ZConfigurations2/progressbar/PK�[CL�ZConfigurations2/floater/PK�[CL
[Configurations2/menubar/PK�[CL@[Configurations2/statusbar/PK�[CLx[Configurations2/images/Bitmaps/PK�[CL�[Configurations2/popupmenu/PK�[CL�[Configurations2/accelerator/PK�[CL'\Configurations2/toolpanel/PK�[CL��h��_\manifest.rdfPK�[CL�8��	��]Object 3/content.xmlPK�[CL�P����oObject 3/styles.xmlPK�[CL�A�5g�qObject 3/meta.xmlPK�[CLn����%ksmeta.xmlPK�[CL\��l�28usettings.xmlPK�[CL)�z�X-
�zMETA-INF/manifest.xmlPK�[CL�����LW!y|content.xmlPKm=�
jit-results-bench2.odsapplication/vnd.oasis.opendocument.spreadsheet; name=jit-results-bench2.odsDownload
PK_CL�l9�..mimetypeapplication/vnd.oasis.opendocument.spreadsheetPK_CLS��)�%�%Thumbnails/thumbnail.png�PNG


IHDR��u��!cPLTE###,,,444<<<AAALLLRRR[[[ccckkksss{{{���������������������������������������������������_h%IDATx����v���-��j����b���g^��Kr��8���wU�����)�BG��K��?T������B�Gw���!���o<-�gi��!ol=�d��:�o�'e�������;���oZa��Z����N�\r2�f��^�����K���������%���E�hC�p�}��_�^:`x�KV%s�A�d�U�,���&5�<�J����;�@��cf�?Z���<NkD��xdV���K~nS���u.��'���H1U�\�2���?+3��K#�A�9�}�����!T�4�u_>.sw|��R���?��>��������������]�Q1���p����1�>���g��5�m�]*#"`0��w��*UAu���;��<�
�s�FR��u=�'�D��e��8�xn{|']��Nw�0�L��yA7��]���k����Ox�I5���T&�����J���S�_������)�(g�0�l)��#\�{z\C�_�sw�����<=����<���
��]J�efBZ:?!�P|��qh��z�[�O1'���Sc��`H����s�w�qb�Y��v��m=��
�(#��Hs�O���������S7��� ���?�4��i�s�.�����k��<���wo���'N/�?7�=g���n���{��s���������n������v�4��������w�����5\�� s�g��Wi<���@0H�(L�������b�L��TS9)?��M�\��kk�J�� ��|������q���N�y�[rn��|P	P������SR�>
���Y�|<u�$��I%���(��J,&�u��v�F��V��z�KX{d���$��/�(�O^��fE�a��3htd
*T4����K�=�������-�;�}�A�t��?,�����Np��N�`k0������Y�Aa�������Y������o �uUl��6�+g�
DQ�����q8 K.A��'��3��_'�VZd|���������e{����9a���JB0p��a�>�I��l��'N�F.�+��m���?p����=�Q���t8^�OHi2%�
��i����|��.�up��Me>��+��1T^6�*q!�gC$cGf���.X�T�~.s�|>w��K�9][���O��r�����������t��~�uSW��x�����h��<�W�[O$�x���xq����YBy|���f?+m�axJKrD����h���u�I�#Mg��}�q���+�\��\���'C���{q��*0x�%X�����{sxj>8��-�{���C�'h����r����m�o(���W{����eP����t������i[���[?e����=PT���"��
p55����*-K-^n�e��+�j@1�Y�f��Cv�9�r�sb���rMP��Z�/��D�����
����E=#�q�{����>BJ���V�P�, '~���L�^2i����"�s;���Z����|��V���z��6i�;���}/$L�g|��Ls��������=u���;���,��'5x)J���m���6U�R:�WN~������k�w]L�N�8)��9elm�y�Qkt��� �*��2��|)D�)�� u{��$Ps�6�pa��=��l�{��DqB0^]u�Z6�����T|O�M���/�4�v������4���"����������8� +�����(��gT�#	������ ?�$��NA��GcZ`#eq5���FK�o�G�
���a���zU����L��Y+_���4�����8�x�������:�'H�o�7^o�3R�W�=_l�j����'��{�R��w��iN�+MT�����A�/�
p��g�#�c�P����_��p�4���Kc\E��c��eW���-�Dg�T������g��'s��f�i�)O�o������E�^/�7=�;+H��+cBGY�P��eM0'��J����~#.�rh��Ez�x|��ff~\Ik�z�L�[��%�f�w����I��zs���k%*�$��=�'�����?uc�V'F�4�Z����WGB��u[]2�����R���<V������`A�n'����m
���D�C��&"p
U�W�����-�I����[�U�y3)�RE�����8�@�!��b#���=�Uk9�t��b������XL%����B���T�_��R����O�7�H���q�L},�e���OaN5T��~��%���Y�bl�=-���q
�a\��`?5��I�10���R�-$h$��jp��VV�C�������p�~<�� �d���'�J�e!67��i�<K�����+���!�c�7G������]��h������6W���$�sNN}��r�&��r�WX�V��H\'I~������'�8f2 �	�����)d��7��F1�&�{����+ �w�q�b��[�j�jL^�T�!�&J
�z/��	�O�������"�w���JV�0�i�|*4[��s���[g���F�E����Y6�L]�%�*S��P�fJ��F�1�i��|�����R���L	4���*�B���@�����]7��u��}0���9���|q�)u��f���_��|������rim�:*)�/[h.`u�|
�^��y���e���9+���a��V8��Ba\�]f������#��z���IA�W��K�T�qA�B��R��HcQ�u�l?��3z��i�V��Z�2Z�m��,�ow���([A�2��wF����M �`�����0�������?��u�p����bzOU���uN�{��8����YLt\y�R��>�8����)�s�s�*���C���=�G�y��6�9�{8���a*.��<���T�A����R5#c��v2�r�`_�?���e
�&���_q��_�	�����WS����V*K�ms�G��s��9���\�r��q�?�K4��#����c+�(���G���
-u3��:N��
�Z����	����������Usj2�(�pZ�d�L���p2)������z�(�����bC�C�"�g3�czM���O\�<"�����O�I�<V�>Q�T�	���E�o2��������C`�o��p�/t��=pG5Mn�/_X�f	��'7�����L�B
9u��l�h������??������R�����W����Z(y�����[z����+@��<������������f��������u��'�T��������+4�l;��n����Z�GjF�.��[{!��s����*1um<�j�0l������F�1�q�1OODx��#����Nq���m���:w/��x3L������j��U
T����Y����u������
+1��a�;E��j��-m�L���e��P��<�r�e,C=!�����A��Vq��|���@s���^������
��i��#�)<�����D�������jT�:C?!�+���f��*W�<����nE4a��bmtd��,WXxNf��f�����i7"��!�
����k���J�_���%a����'���0�N�`E	��zA��9��M��+���+�����$��[0!)�/�P�m�����p���������uq;t *gX��_J���-S|�����U������\>i���Ib��V�0E��|��|�hN`W�����'/N|�DX�x���bvp�u,����n!��������H�[��V����0sQ���k�Qn��1��9�t�,C���+/Q��^�:�g�/V/�4�������w�[�IC
�b2���\b���pG�+c�r;�q�v����dO�k��������2�;��Oa	iA��m�P�A���Rn"���4����D� Oz8D"H48�~�{��+��v����6F8m8G��?v�?���=F��3OL�v��������_9��oG��j��&��$�)��r�i�)�Yl�)7"�FHT�P�pU�)�b���y�5/F���r��w���
Q����a��*�iCmk���E�o���� 9Is���!��sr���8��w��H�k3c���`����q��&�:�c1n���q�^#�Es��h]��w��@0����b�2_�����7EL��x��jA�:��P�+V���#N#��035"�D�������9`��R�&g�.$/mr$����8��L�\��������i�V��|z;E[
(�_F�*�F�����N`&�L�y�06�Pq����=+�����������/��K����Rqn�@�_��P�1<�Z�(K���9w2�������O��u����&�f7������ 
F�m�$S�4�3i�W���i�]2�){?o�����HW!>do�N��z[F��W9�:��!8}���R�&���;�J O3Jx;h��BM��>OXE�������;p��;��ZP��\���C)(,!��_��u��|���r�O�e"%���(���(�)���5Q�����U�p��[[���x.���x��)��V���a����������u���j3�f���;�8'2����G��t*qN�g��V�'�VRZ|�,g�
�Z��+�S����q@�KY����_��|�LZ�����	�����T���J��x)�����&0�9���v����&`6!dft����
���@e�u�uJ��JoJc^	}V�-;���RyW��1�p���;7���p�8c�Q�N�>�+����<7��9)=*:sM�w����iB�������g���9��a��������u-7�w�U0�P��'��$������t(�z��Y��������
���f�1�[����+JN&*Ae���;��$F>%0p������7AO`�w���e�j�;p����D�o��'�8�#�Y��t�����Kb-�%c��V��P)�`Ft
|:�U�����*��:���[9�M�9�a�9P��e��u�r������C]�C�p��)T42���E�������G��qU�8�&�*fq\�ob�
��Z�C��1�x�"�6u;�G>���\��e#dCA+��o�4�U5�;, ����=�iT����s@�)����FI]*�x�Ho,�����NX��V���{���|���Y�j�s�?��I]��#�"�\�|��}T�A�A�y��pA0y�;�Q;���_����R �?Y�x�*�c��C�a%D��Z��A����Z��z���|���B-�w�z�}F/^y�1v8��?Y#N�.v���5� ����1���!n��s.G|/�]�<(��_d(����_�?^0��#���Cx1Z5�^���iA����7�p=����0�-�x�l���+�v��o��y^h�����fyJ+�+m:*%�|��}S�V'+���!�^,rZ�B,W�.��U�.�Zn
K
T�"
T�$���I�(������[����z;1�F��m�J!8��d�������8���,1��)��F�F=KTL��3�H��^=��b���i���J�3���j
��X�`���u��X���
zP��Y9n�P����N�������WC���#��!-]���^.F��kb�%������7k�#�YUG	g�N���q�q�+���m��-���;/����H�y���[Y?��og��.{g������H��)��b���6�s�8Eq�QI���/\�U��������{-�b|%����E�e�&:,]5��j���]�0��3X�s������0�u���U8����c���yj��
��%��v�,u�g�e�U��9H��<a��Jt_��h��*���!�J�����w��xl��bx��7
4@�w�v�=�Q�E�E�xy�p?���(�iv��s�ad�^)��=��0���)��n��pN�Yf��s/�u&(\Ev9��$�L2H-��.�W�������wlW�����+�V�KB0�F>����>9^�>
iw'X�'~�<�r|�^��M�����ZQ[{��g���6�u�Z���m5��uh�lx��k!�n���u����K
�kc������C�O�(��m��+_����&��q3R���p+�����u�_�kr�W1�NzO���3Z.(/���i�-k��Ji_��U\�9�
��k���R��8P���m�
�����	���&a���������R�i�mc?�����|_2��.���$�JyRb�����$Q�jG�"=I�>�t�����W�@��x�����g��PI m�f���#
�"�X��eI�<_�Sz�J���a=�J�yY���zq=g��WJ��'�[��������z���W��r����{X��	Z$cb |Hi��_P;��>Sn�0��u�g�aj�6:x����>�5����#v8��$}�39n�i4��K1��#��~�V�/ ���T�l�4���$�s-T
u���o���M�Wq��o4�N��@���1g��T=P��B*W @��i	����9������Y��9.���]����XP��w�+��	��P+���vr�W��+O�.������V��hu�3|��9���3�G^z5���������l��9�l�.�vc��:��6�JL�|��F�9�U�?N�,/`8l���]�
��#r����Y�����q���Lf�����qU�u���r1�Jm2��*��:�W������3��3��+n�jk>���[�^�����_����
�<�p���5���?�`<1�8J7����u-��9� *�,���������u���!������.���s�,��,>�A�����R�8����w�g����c:;�E7�M�G�G�����[vc�'��^\����15\����q�
}1p��n����y�Z��s<��c�B�8CwL�\s+�pn�W�����/��������;��q�h�~_���C���1c7��	���8�@9s��*N���~�����u%8��=^([����������;�g���p/@���V��~;�'���E���v�K�������\�l�@r�!�=�z���1GbL&Y��J�����g��U������:�"�\#ns�L2|��x���R�NR;q�x%$J��U��m�q���e#��t�6������f�T�Gt0N 7��<��r`\��e�O
�'���
�����9k�0�#,��O~�����Jk9���M,l-�_��Z�E��7'+�SL���>�_*��	p�T���R04���F�;��?��k�
s��D���9e����(�T�vX!5��Y���rz�b�j�5��C�����s1���������*��H��U
^�������j��]*��7%�����X��Kk��D3�2�&��������M�k�C����jt�%UCK�q�����S�9������"o�F�Je=����R��^��r�O�m�yd6"e��qd��Y���j.#bX�"N��z @�j���y�>&��%&W5U~=�
��|��hm���������U��R�)����j5�cw�T"%f�a�Gi_I��+?+5>�\���3(�����.'pIJ�%�c�b*�e��V-r����Qs*+�(���a�)B�d��!<q��S_��D�H�����L��d�P�Z���1�K�+j��#.�V;L��j,L���i+q�9 8�3��Y�+�^v���������j`��m./3�N\�f���*�l\*c����V��0��V
mb<��/��!�]���,���"�������lls)�-��W����7����.���B
�W9Y��R.������R$m/�E�d����qs�����:�[�b~f�?>�J��R��
L������Z�dL���y�����J��5�������B�+7�
���x3T�������j9/��q�X�6n���dQ����s�o�5������^)�?u{�p��#����`�,��_��"5�������S��r������o��[�D}���>��^-�t���p����P���6������~"��H����^)T�B��1��&��W���\��������Q����*��n���xW���vz����_����C�7��������_�������	xvg��`��C}���?��Y��^�#D��3��/����z�kF��6��E�w���k��9h��� ?�oTo���q�[?k�l�����+�g�X��DGk�^s���^*����{�<�7"���Y*9�W
����#~�)a��T}���������"Xr�c|�SO��t�Se�����<U|�U�3�Y=-�>�]�D��SR=u�\����H����F���]/�+�EQqw��R�fr�a[f�:��$>xSS��H:_�r��^��D\.P��)��g|��~9��c���\�
{<��=��Ql.�4F-�n����$�h�����Z#`Hp+���*��;_
��Hn�C���"��*a8��S|~8����(@�S\	�.�{oU&�	AS������,_%�*)#�ve�x�����a�D����`�;�6�J�'�7�7�P���#�n������r��u}����|���>�_���_�8l�.����*��h��|�q�-cm� %���W�c��=����s��W�H-�$�2P�Z��J������� ��K�_��-���A���Y�Rc�/QU^�%C���jb�K�m|�J���i�,I�������1b���
���;�t���xO�`�l�o�#ivJ
��"�1,�t�u{Y���u��
�Q�P��2DH���kI6�g��?�q��!=H�����"Y����[&}
?���+���&��[���cj���F��.`< �+0�RuN������#�Z%h�����/��-���c��M
)��l-ng@�KRP5�Q�{��V���i�fE�����7c�����Yj�`�o�2,�3��f_~E�J�7��n��qX�x���������/�:�/X8vd�e��)4��q�e��R�
&,�c9�R�*U@���� o�H��E4�<8��"M���$"�X`���mD���?�E��/*�,��Fd ""���W��(�z0��BaN�\t�����{����m��
x��:�X��� t_`_�b/�;��;��W��sR�f�^_�p����|F������%���z<�z
|��<��T�����h[[�	�������2�|
c�jP� ���R���5�������	�Lk;^y$Y9%U*g���F�n�I7��6[s������:w��^��l�U���/p�K���]�|�;�t������U-`�����14�����+�M�^S�
V���U|B���+w���\x�c���)��4p�
3����/%[�����IEND�B`�PK_CLObject 2/content.xml�]k�����_a��E�B2��8�L��<6E��mQ���D{��-W�df��KJ"M:��q��	�H�CJ���������V���j��^���1���u^�z���o?����?^���^,�\]u~�R�.��u��������P����Y_�Y[���l���.��7jm���k_�\�v��������;�����<����W��.�����M]-����>������V}���r�U�����m�m.��������u��c)��/u
�]��]S���|�*e��9����]�.;�}�������F5GK�u�G��~X�����Ys�o��������K��U��N�I:��?��y���X.S7�*o���f�����vM5�o.A����^�������S�W=?X=���)^����������M��!���|(v��b���x����[�����OW��u�e��2���IK��Q����0����-��v�����nJm�eS{������z�EJu�]������!v�	��}%?j~�S�1h���f�f�E}��&��k�O=lTS��������|U���q�����RU6^8������U��G�zs�=��������Q��7����mi��~����Efr��d��rqm3����ul+����������?��!���������4?��u���~�(�e��2��__����"6ET��\eU���\i=���3-�Sx�}�t��w�>M��;5����77����E�*�G�abY6��V��]���T������E�`]�Z��9L������tx��������u|OSw�P����dQ��f(2���kQkw�yc[�WW�t���X8�q0[O���Rc���_�����{�V��Y�������q�s����j�~wC�������*[���J���E��[�=MP~���:��
��E��Q��J��EV�����
��p�����j�=�7V*���e��u�ry�
ZD���k.Jiq����S������Q�����Q���*4�����oWe�#O��<�t�mT>H4��K9��Q������ku�����:FG��i��W��Q��a����|G���l�BG����>-�����=���p
=���g?y���e�h�4������]z,-F�=�>��O��?�m�����)���*�*j����i���F�)�W,�b�R�����Z���M�<�.��E�B8��D�X}�"�����K��X����b�M������E�������D�"g*_�ok�����SJ�uU���tt��sY��Ey����'������xt�6]_
�������,�i$A1%8_
��*�G�;���hT|y�����8�������4�mW�y���(��M�X�f�6�+;��f�#b��
-�nU*��}�0G�>������#:�����|��;�<����_�^��:Ws����w7Ax����c*�?���C���k���L�!a�)������u����h��O�f�������}�(���J-�����e�M��.��6	���b���]����&[�6���~��q��`S�]�5*�[Q������5z���BQ4�t�o2��?������W ��\N�#t6U�O?��C(�#ht���FS�ku������J��n�m
8�9�	i,Sq������M�NV���Z',
H���$���1�������6�Vj��k����\e�c���K�6m����Qk��oNai��R�=���nL�z�����'[�������������c�W���dhI�C����?[���������l�b�;�N�\e���	Z�l3�����{>d��j��t���Ny�;��3t��~���c�%����������s;�������x�z��u~�V�����aZ����u^M���4u^M������P���:�OS���:����u�L���4u�L������P���:oOS���:o��N���8��������:?�C���;�R����c��gV�>������dxQ��{-����[t
�g���c;<Q�:�����A��Ve�j���n�n��4DO{b/h�3�+F[�z���|�����;����o���^=�� �����q��v�D}����������������I����'��Ws�������Z\��r���|0��l�^�7'��`~����B��}0��lv����Z|0�o��R��@�Ot���j����`�m}��~���w^8f��'����"(1���8�-�=gW�o=Kb�����B�Lj�W���"NqB��i�2������_�1#r�Txp��Db�0����a�����������0���2�� ���IJ{,v��zpI�����p&��)3��E8�=��������"������O��7�z'��;mxFA	����c��J2c�)#!��1RF�{��1����G��K���� @|(NS.���c�I�p�8@!����Q�e'i��B;��d?�t!L�z�F=S�8@@����K`GJQN	�I0�[�BS��9�E`�R�S�|?u���	*�����6��A��apD��R=1K�f0>�9r�1R&�cA2���������m�1T���G��1.BM�l��k����L�Qo�e >jv��?X�����J[�/�S&�l�A`�� ��=�(	���=�G��~Hwc"bBE�t�`��/P�r����"`|X/D���G��p,u���T8��!!w����s���bLb���fD�,�Y!��=��DL�������VdL�)~�uP��!�%�O2����K?�s�\-�48�p#
f�[���o��"@3�1&�^vg >��c"�`g����v �)��L�g�E������ 0Fe�NS=g��q��q�	{��p�/K,��S9BSo8X�>��P�9[(��o�npjV��~���8�����YA1������4/$��M,�(���s�A���1O���-�����+;BP�H�����t���F������h��/��c'��B������3?�_�'�`Io(>'	���b�8�BR�Hc�Ay�)gI�9����)���:�|�!��	d:�c�%�E��cD��� `|�S"��Kqx�� @EEp��Ap���PS��������G��O�P�:_8���`1��I�H��O��i�}�4��;�v��yjj!���(�OpF�B��ca��"e�����i��[�z+��/���3^S�����������������c�sr>@`6&z,����E���x����1��o-t��j�L��q9�|!H�`'$�	��lm0>&��;n >�7-v���#pz"���Y�O���"`|��`q�� ���8�+;��0=t�@l����)�(H�,�d���a��#`|4	<�"`|��!e��#@|,�"����,��cz����G�F,������`ElB�?:�h.���q��u�LI�s� 0FFe��8@`�R
�C��G��S���$
NW��W�b�q����p�h(���(���A@�"�:����`�%�����N����M�R�:��_8 6�]��,������=�"����
�s��1�2�E���8��=��<J�1R$��'����ap�o��91?G��$��b�H���bP���T���4���������"��^��(2#�E�g0.����d>���Y�E���=��SS�1T�g����PJbd�#�f��\���
}��O$@�)3����7|�A����z�����Z������`��b@�<�#��n�8�,N���b���"�*��JQ�`���N6�{�<2�ds����8$�?k����"-��H����:���{�ip�c��M�E��iA��b��/�ZhW!�Io�o ��E��p�9
���:_`N��",p�:�Q&�9����5i�g�=�8�i��K�����z�[�=���AC��Z���R,�G������AO	�HB����K��d�|�wL������ZwQ^�;����PK�����PK_CLObject 2/styles.xml��K�� ��9�KYc,+��)���LM� $SA�
�#� KA��PYJ����/�/c#w=�F��d�����bP
U_�����[�r�t����X�pe��?%7;'V�L�K�iE�a��
7�2-W���4	��?�Y�<�������=����������C���.����T�h$�1hZj���P?.����`<�~(��k��N'���������*���`���������G-��2��������nT'�7��ez��ru|�E�z�c=,�����C����<}G����\G8{�3*��h��q9v��/�Lk����b�[�v9H�>�.;��mo�����[g��e�������k>�>|^�����p�Vm�T�p������3KW���J��2��S�
n�����k�MTYy�{L���o���j-	.��Y���5	��Z�W�kLa������
�����=N�����L�
����Ct�PK�P���PK_CLObject 2/meta.xml���n�0E��
�v�G���*R7��]d�@����	���(�����sF����p�+���J&��b��*�L����&"��!VE!8�\��Fi65f
���s)!��T�V�T�[j8U
����i:�'�J�����i(@��v��J����{�����t����V8&���.,�h�_��]+)�nA#>KOq��la�/t����w���a0d�m.������6��L��l5"���<F�4��K���Q:=�L��@`o����(dw=�G��nk��S��r�B�E;�!f^V�,`E�����x:��^���~�����~PK�A�5gPK_CLObject 4/content.xml�]Ys�Hr~��`hcv8H�}�jmx��i��>���
� HpA���w���DR[����:���W@eee}yT�}���Y����eQ��]�����Q5.��w���������?]U�I1�/���n������7��w��������_V��X^��Y��lF��"�����[_�}uW��Sy��m���&l��9�E�f7���6������7������Iu�����?�@��E���e1����m�,.�������T�t�����<��[��e�j<�e:[���mgy�+_h�4������������.��G[��t�jF�Y}�m��������+�������3'n����/��B=;����jT���������j#j��[����15�>G�6��&������GY9�h���R��Ch�����n?(b��1��M��x�����/��n�Y�m\���_��M6�j���w�zX���n6��O�0[b#�m3+�/����N��xgSGa���������?l�%v���m��5_�!������z��B��nC��R_����"@Y��v���|Y������������5_l���1U��-�|`�T���n����q�K�O�'&41Z.e��~��0`����W=EA���^G�]S��~�������W��]�uld}w�Wv�4��>��y+�������/��W���<F>
���:�|_o�|T����(�Q=����0��|I��v��F����S*��U'�s�G��bua����)\
�f}������Lp^7E���E���?��j����z8��8�]�)����a���jY4�i4�]�~N]5���g�i��X����R�gM*0N�"���BC.�F���>�b6�o_��+��������Q������z�Q_e�=��VW@�����O72���ZO��\��\�4�M�s�B�!���
e�S�>I��|T����m1���(/K �IV.a�,-������:��~>[4O�'�yv����b��.��Mg��~�n=�������bH���G�P�b	d��/����C*�i1���%�����r �:u*Z�mb�N�������Q|S?�x�Hr�����M���&��qeWw�(Qw�X,�	bW�~��m��r�[O��S�#M���~�h���z'���������Szl����rz�|_����[���3���|Ak�����
��	��g-O&J������\����X
�CiyOn�=kY[?��J�{r��Y�6gL�J�{��Y�N�������k���@��+3~(-�I�����*����B���`�U���F��s��{�+��?m>�2]_u����J�P����`)�h�i�6e�@1�����m^������`���<-���0���nTf��J�7Y��/�P�]��M�(�
����=�P����J�m���~���}������a�wy����m�����q����7�����������a$�Z���M*��D���>��V������F�{b���?��??����Y�z�����/��/��>j-�Z�2���q/���7UFp��YK������V����l��<�������u����~V�������m�P����O��u���3���o�9�[;Q�����\��>+����"����^����V������,[u�n�Sjbe��d+\��Z���
�	
W����rTU5Pl����`�N���(��N�������p3�h�)����>���M��.fY���=�fu9��a���$�8�c9��|��.M�:�����������?������|�J�hV�@8�ou�����WMVl�a���2�������8g��T�M,�z@$��������|����r`^~�yY�NX=���x����v�>����+wQ�fS�\�`{cX:"RO��c��BA�(��i
z@A��� �
�p@ANS��
�p��P��
�x��>P���(H}��>P�������>�EA�+���z��~=��_�� �
�|8�<EA��3�XAYY�V�����B���\��M��K���b�������5C���y6�������K�uCG��c���<�)�U��VY]h���V���C���[��u4����\��
����!�/��mXX�!-�+�P�����W!����������'\
�}#�!
�O����Z�k��� �����<<A�|=�����/�
D?��_���H�����:V~t�%�]���s�a�]���5	GA7��'h����[��n��Ym�5�1e��$�I��`O>86��9�����ft���\����[�3��d�{��G���I�`��
���S^8.����xx	t��:��~��g��L(k �+/BN�n��oa�Bym��
�42M��&��`xF:�a��j4"^��"������s{������7Rj'<0�w/�H���i��SR�#d�+����s��!d3���(.������o�S�Y��3�#0D6Vy�<g��
s4B���Bs�](�Q�9�?%D���nJ	n�5?x��:�%�, ���>���P��8��o0"�n�m�W��bCDY��sN'\� *	���������Q�I�-�dR2YGv�@g��(�Rt��,��|	A$6�!�_C�'�6���2B����J��(H�P���C/�RNj��5&#����];%`�c2@����N(-$������X�����A+G-�k���if���O�!J*�'@�@�)m��-��e��%%�!\��J>�$.#t��K���F1�@��y/�a���0a������;���,F�F�� �Y�|�!��
0D'�����8	Z� ����`qV
���� �|]
��&D�X"�M���"���$��$5+/57a�1'b��dDF*��Mt���QBd���q�W���At��$d�@amR�������fL�N�BY3�[��.�lBB�tf��BmJ�1D�
W�c��R>qK���@��3m���QA�J%X&���K��`�U��1�1���\!d�C�8�����
�1�"�[�;"��!���r�=s:-"�n��A����hb��.!�L:���1r6�&�n��BAl 1S�b��9&!��.�FD�s#��*�K��D9a�MY�6��\�s
���������@��������I ��\A��y�:pM#�[��8Ni�to9��5
d!\#4�BX�Bs������!t���p��A�y���_;���>l�b �����S9H�!�6� �}%`�+�?<����b/AW2��|�*�3xKC�E+,9�������#&��J��,)F�4�
���6.-�"�L�,�0�q�]��t�4sXG��pt�+A�������Gq�J��g��Z�E`�pc�+)�%5\��D!�)�UZ;���]!
G�d��G]t�����>�]F����P\+
�Y���!�5o��i����:�a���2V+�&q2���D�����0��0DX9P�����c��A�������,�� ����V����������8+����qt�@d:`@9����X�!��G	�i���J
��9�P����j
a( �� ��=���6*��7�	w �B��$���,bq���po��� ��
D��	�XRNF�hkB�XW$G�r>2���	O!j�C�FAZ����3�p��N3e��At����e�a�#��
�^T��6��N�P�a�Y^G��
��C��n��P������7a�F��RN�t>B�����`����$��e�b�l9x�]��(/G�3���	��ef�d���'�!%��*.�Q	%�a|��qN���:�$VP�xs�{�����A�4(Ky����SaY�!��<,yix�m�_��@����%����n �P*�^h��Wb�0i��`>H
NBYAp^�\��	DXAP���J��MH���B\�%\�"c����4��!�����%�t���0DW�v��!,Lb���5'�	�	y��1Dh0�����*}{)B�J��|""�Cr�K�"��C~��'���_iF��!.mP�p^��9|Q�k�B��[�)B���\�P7R�Wm`�����D�Yp���#t�uJ�p���,P�P�����:�sTC�Y�����c�W�`�lD �s���\��&0�u,d��3#���}�^��O8Ata"p�6��s�3c�n1���:|��t��0�A8�e ��(9*� �t��/yr��W��N�P�������X�����2w�d�������V��!IU�T���%�k��Za��"�4���!)h� �0\��B�Q���g����1D������iaCt��<����,��t>R����U��s��!;��#BZZ��7^j��:�a��<s6���C����p,X��U"�3��ch�,��!��$��@��d8g�b�n�A����
o�'����+� �����������0\������;\W��Y>o��j�����PK������PK_CLObject 4/styles.xml��K�� ��9�KYc,+��)���LM� $SA�
�#� KA��PYJ����/�/c#w=�F��d�����bP
U_�����[�r�t����X�pe��?%7;'V�L�K�iE�a��
7�2-W���4	��?�Y�<�������=����������C���.����T�h$�1hZj���P?.����`<�~(��k��N'���������*���`���������G-��2��������nT'�7��ez��ru|�E�z�c=,�����C����<}G����\G8{�3*��h��q9v��/�Lk����b�[�v9H�>�.;��mo�����[g��e�������k>�>|^�����p�Vm�T�p������3KW���J��2��S�
n�����k�MTYy�{L���o���j-	.��Y���5	��Z�W�kLa������
�����=N�����L�
����Ct�PK�P���PK_CLObject 4/meta.xml���n�0E��
�v�G���*R7��]d�@����	���(�����sF����p�+���J&��b��*�L����&"��!VE!8�\��Fi65f
���s)!��T�V�T�[j8U
����i:�'�J�����i(@��v��J����{�����t����V8&���.,�h�_��]+)�nA#>KOq��la�/t����w���a0d�m.������6��L��l5"���<F�4��K���Q:=�L��@`o����(dw=�G��nk��S��r�B�E;�!f^V�,`E�����x:��^���~�����~PK�A�5gPK_CLConfigurations2/statusbar/PK_CLConfigurations2/images/Bitmaps/PK_CLConfigurations2/popupmenu/PK_CLConfigurations2/progressbar/PK_CLConfigurations2/toolbar/PK_CLConfigurations2/accelerator/PK_CLConfigurations2/floater/PK_CLConfigurations2/menubar/PK_CLConfigurations2/toolpanel/PK_CLmanifest.rdf���n�0��<�e��@/r(��j��5�X/������VQ�������F3�����a�����T4c)%�Hh��+:�.���:���+��j���*�wn*9_��-7l���(x��<O�"��8qH���	�Bi��|9��	fWQt���y� =��:���
a�R��� ��@�	L��t��NK�3��Q9�����`����<`�+�������^����\��|�hz�czu����#�`�2�O��;y���.�����vDl@��g�����UG�PK��h��PK_CLObject 1/content.xml�]ks�8��>�B�����-Rx�=��:�Ggk2�{��+MA2�)RC����~� h�Y������J�C���s����������d��M����b!��Y�������.���U�^���\5��V�}T4u��^�����^}uq���M���e�oew���N���K�����H�?VG�n�w���?�f�6�7�9��4��^����7��JT��us��]���v��������uq��������>��q�n�8����:\��vwmeZ�����&��8�K�v+��X�t[���n{#��������v�6G��O�i���=�o��ax�������6�ogb"��E����>��v{,�nHU���h7mk���iFS�
v�s	Bli?{��6�o�^�^��`�"��Q�f�O4�/U�H~��t��Z�n�������j������_�[����_n�u����2����������Ga��'L-2�v�o��������v���T�C�j���}*���|x�?dK�(b��hi�Y�K7�6#�� O)���������j���;���R^��.�'�}�jNx�0syO�y)+�/F��>�i�m���&����;����q��C�Y��O�����h��7�������Q����+
�������Q��,"����+����o������WC�F�������u�������by}����#���J�6��]�R���d��-�s��}���m�v�L��;9o�5�ss�[�,��mY=jHw���w�J��
�l�Rv=,����w����-��p���3�|2;��G��+{����s��7C%��������^�]���Q�Q��]��!��~4�����y=wQ���|.?�k��x�y������y^��z����P���(��F�������z]V�k;cS����t��'A��MN����n%��r��uT��R9d�W�r�@O�.YW}�oe�Gr���+���&��6m���m]E���kc�:��t��hJ���K��X�����Q���*t�j6��o�e1���z�*����
��RN-ndt��}�mf��Ge^�Q�[��h]�]?y�^E�Z���-&r�e����;����f���a��
��{��f/����gNR�O<j!��T_Q�x�����+S�%��=��N���$(�gJ��Z�%��yfa����l��J��u�w,2��C�<����E����J����w,2�L?���]��_�\k�cM|3�c����\�����f���b�E���s���[����f�8~06]_��g�4V��+}0GPL	.�V�[��KTI��A����m+��.��}�wZ�R��-�*��A����u�?:�V�3�/{��bU=����
%��Jd���g�]x�$�]�y�[D��X.�y'�����5��W�����#t���M`@3����f|��>��C6��m���OL��2e��������e��	Z��������?�|f����U���W���"�iz��'�O|�q�m,Mwn����'*�r�OLw3{aW5}��2��PM:��_��Em^����V�����\���Y� ��X ��\�]�@�b��k<v~�Tj2ht�wv��3Z��J��������0p'(�g�n9��4�e�4�J�y�2��(aV`���E�6�D�3�r���7��r���s�Fc����}���4`m�����V�
���v�+�J����6M�3���'b�O�|<���~������i���&b�����6��I�l�f��1�{�����]�y^���Z��������_~��0y�g��s���]S�����*�+��'���q������<��������:?�C����W��i���W��9�!_���yu�����yu��C����W��i���W��9�a_���yu�����yu��C��+��e^�_NS��yu~9�:�W���`u{�:�)|_X�����k����u�j������q	�J�~4����jT��7��V���W�����m���,���w�^��c�RFObY������m�'2�U�wK��m�M��4�+�����9���n��������H�\_���Jv��Iu��r��j��B�uU�
9������j��`���
���4B��>X�@����m�,>X��[|����o`�������>]������I��f����13�>1������*�(>A���5/���'�RoS�!�Li7W��/�fI��AN��n���Bb�1I��2�����$%i�93 ���7�E/cQ�2��2o��&#��D�#F#�L������\`���B������`�o 1��:e�=�H>}�}�i����9�JJ�4a{�:�/!H�l�3�o�s�f(>A�E�b����N#`���� x�b���D�"`|���H��A>���M��i��� �{	u@��8!����12��$d�#N%!���T�I2��Bp���l�o4�GT�s�1����r�t��la0N�e����0�\�l�b��P���7��_�:,r����E��x�N��G�Pk0��"`��x���i�l���*��!�&a��#�3�x��s��)���G�1b�pN�D+��c�X��P#`|��|�� ��}�BgK�
6;�,M��k(�$��.���)_P��E���L�@K
�yG	Cg0�,�4��X%�1��S8�&=E#g�^	��Jc�p�g����(�^G�1i�W7B@�<F����q��l�����B����Z��� p1L���!������z�Eg#��Z�Ol�tr�a0�4�>���IS��86�B2T��������F��!4<0�����ZM�4��?��'0&$�3��7}���o�����A`2U�����K��g�A��X,8M�
}��I����@gKyE	;����`@��X�q��O049�1��T��^vc�(
5���$S5��`�e!���Y�	��,��/�+"�����-�/����~m��������c����]���C��'26��F���v���1�N����R�������.	��4��G��q���)g�q����4�$d���,I�DU��H���r�/��~]7 `������ �KA��K�4�y@��p�e�������ok8���`k��v�3�I �A���
O�V���qUO��� �K�10n��R��oh
b���C����,�_�2����{w����-��A��C��O��qN>��&�Y��C��k06=�fX�O�]�J�E`�����+�@�!�����^��C���R���wvr����\�E~E7`VM�8���bK��U�>�E��C��E�d&h�F�E���"��u�@,��	��
�o�o-�8M��,���#��� !�A��(V�THh!0F�������a�&>�Qe����C�J�,FY��o��D7*|��A�K�F��`"N3�o)9�����A@�<�Y"�������BF��JS�I�������j6�����J8j)�3:,�1U� ��|)���Z��PB��Y��A�S|�@�Q�qxl0>������E/����E��h�@�1&����da�,r�@��	�[�$�����	���T���o3;�����7�C	1R�t���t@�4���3B�Q����bD*djQ��41���!�K�Y�1P���9 �C8L@�GT�	�����$����%uA1
������`_d��|T�#���cT��BF�/%�h��q��2���!P|<I�/����s���o0� i������A�4��$(
{�E`�����o8:����t!t�~G��{�/s�|����}Z5��V�}T4u����PK��en��PK_CLObject 1/styles.xml��K�� ��9�KYc,+��)���LM� $SA�
�#� KA��PYJ����/�/c#w=�F��d�����bP
U_�����[�r�t����X�pe��?%7;'V�L�K�iE�a��
7�2-W���4	��?�Y�<�������=����������C���.����T�h$�1hZj���P?.����`<�~(��k��N'���������*���`���������G-��2��������nT'�7��ez��ru|�E�z�c=,�����C����<}G����\G8{�3*��h��q9v��/�Lk����b�[�v9H�>�.;��mo�����[g��e�������k>�>|^�����p�Vm�T�p������3KW���J��2��S�
n�����k�MTYy�{L���o���j-	.��Y���5	��Z�W�kLa������
�����=N�����L�
����Ct�PK�P���PK_CLObject 1/meta.xml���n�0E��
�v�G���*R7��]d�@����	���(�����sF����p�+���J&��b��*�L����&"��!VE!8�\��Fi65f
���s)!��T�V�T�[j8U
����i:�'�J�����i(@��v��J����{�����t����V8&���.,�h�_��]+)�nA#>KOq��la�/t����w���a0d�m.������6��L��l5"���<F�4��K���Q:=�L��@`o����(dw=�G��nk��S��r�B�E;�!f^V�,`E�����x:��^���~�����~PK�A�5gPK_CLObject 3/content.xml�]Ys�H�~�_��Do�������������t���B$Ha$8 t���,��*�$D�NS����l�+�������@�����������o/��]�������������]���_�T�Y1�/���v�/���Z6���^�/;���m����u��\f�|}�L.�U���u��l�������������M��{sh�������m�=���comA���������pV����))�b������Y]������{9����{��-�x�k������t2��<t��o�.�&;V��6iy�����U�5�����mw����d����6��+��O����.�������g����d����B[��I]��f�:���������A[qcj�}�Z��6���&����������4^-�)
��1��w�Lw��>p�w���zz�����_'7�"{j\<�xX,�M�|�L&��H���WU��3;>`�l��l7��<���6������ �����
����(������������mG��nmv=��<��z��B��v	C���Q_����"@Y��v���|Y���M�����y���x����T�p��7�V���8;����\����'&ab�^�f�5���q��!9B����qq�e�mSAl+&�6b���t�~����.�Y�^��]$��O�b��<�����h�������x�3w���O������8?��4�����l�CO�P�1���	�����~���~�}Je�z�	����~��0�E�.���2���
�}��M���I�Qu�;<`Y-�VwQ}�����Oqg]v�?\U��iM��o��s��ig�-��S� M����U`��"���AC.W�N���!D�ly���6�F-_��y����O��/��f�����6W@��F��k�\t�gEYn��.���&�9Z��O�{�'���)T���b9)o�����N��p��%�YV�a�=�A�P��M�g�0_�����<����l�mS������0{n;�������bK$������i��`�8,����C*�y�fQL��y�J9�:�t*��ma�N>���������~��9q�����^7��C�4���]���D��C��&��z�a��6m_8�m���)����Qg?t��=�����_6f�bZ�;��v��7w��������|��v& rz�O����j��O��������<�)��J�j������������5kY[?��J�j���e�3&����k����l6�������hYr4�������XM����~�����~�������h���K���7�u5}�}he�z�_��������3�FR�����M�1`����j��yyS������s��
j/�|ok�I���\^g��z�a	v+JS4A��+X�)��B9>�{DX*o�������f���������n��A�����|�T�e5������7��G"l�Y�^�"�H$>��I>����~���v�@,�@����g���e������_�
�����9��/���������r:�?D��u��\<	�����#��nk@����U��v���cR��:`UV�0��loCHD��}X�P�B��N�<���f �^�K��v������<�}Rv+R'��8����:����n�05&�I�����s7�:5s7�&4������IU�*��f>v��D@[���>�����N�
w�����E������;���b�������c6����bJ��!"����q�'Y��z���yU�`t������3��xg�A��?������q��������p����'/�iP�6Qa1����.�{��������hb��OD 	�l������������z��OO��zO��#y�A;��Cm=wU�f��������:"RO��c��BA�z��4��Q���(H|����(��i
z����gQ��
}�Q�����GA�� �
������)�c��>�EA�+�K��~9MA��(���(�|��>�(��i
��G3�t���~��'8+�j�o��'��7p����?7�������
�#c���&��y
���r���b��ew�����;M�i8|RVG
�}�����O��t��es_<���+�CW�07|J�b9����[��D��|=��i��\������>��x��o$5�s�	?C`�%��V��	�?C,(�����	2?���e>]��d�� ���Lv�N����g�����Km �����c��>u@n����#�;��������������u��g��h4	rR��-���F�z��6V{��z��I������3�ra��J)�t<�:)!���ax���bB[-��:)w��������\;o���!�C�I���l���-�\k�$N"���I9������g�q#a��E����Rdo�xz��vi/�����u��7F(�G���@4�r����C'N E����1��R�;D7�+%�P��� �NVk���JI�U#d�-��0�W[!��$P\j<L(!��J@��.����a���ki�3"����R�����+ �.��)���9G1B��f�A�v�k��G�X�u���Ry�CT8e<�L:���))����	�!����-D4]����P�J�3�]A�YIZ(����p:IK1D'�cZJ��/(�����0��vRY�JAt���?��)!d��f�Z�xt^�N+���`j�t�`9�#���[��I0@ET"$�y��p�!2C�\w�:(K�%"�����!�X�pVB�0��P	���"�I�b>�]���H�I���!�Y)�B�-DY�.+ye��/I8@]��8��n�&���$��D������Ct�����:���!t������/��a�n��Y(���=��

��P�b�
G	t�`�&�+r(G!���OV�0D6P
()��"i	D����g��Hc1M��\Xf�t���X�?����<YH��o��*%�{Y	D&�5������?�^(��������m�d!^Z�{�B���LBq���}"���g�;���0�%��B�p���Tjl�	D'����=�dkCt!	�8�J2+�IB��t ��)(�:[@��!U5a'O{f5�b�UD'����Y��MJ�V�������$&!�n��kf�3P�2�����P���4��~#��0���")b��d4@�$�>��&������at�\Bm%�������������;�����������(�����!��e{�x�7F�H2/���VK	D�r�,� `��&��!��
��^z�
�iC��[�Q��2G�`�4�mo�6R&���!t�������#�p����^%K��������+��@��	�r�7��H�"At��X<\$��:_8�	#%A�Z���O�%�-f*�+d��>�3D��f�
c��FO��b��nw�t@F���1DW�y�X������-�j�a����H'�"[�6�"
��k�������<R@�P8��%�!F�2��@�Y�	W�:WK�a���eS�
�8k'�@����O���]%�K���]8��A�	�[D���!�P�,�;�������@d�������I��T��@��)@�7Lx�9���u(H�,��^�G�c�P�3^��>}WAt�LK�d��K6Ub�r�@p�tH�*]7xB�l�y��6D��<j�/�1��`��R��d�l�c��"+��A��^%�:���CY, �C���f������@!^o��vD����y;�
7>1�I���Z2HP�D!�)�9d ����t���FB�(A�
��	�y:BM!�=5�^���>��B�L�P!+�l���)Za�����%�A�6�fL�������ua+���!:	\8�����'������t����]�c��?������5�@�9�a��$b�L��f<,r0z|<Atka+������w�e�m�{�t�z;��f�+&�����c��[D;��l�os&���A�N��&��A3cQdN :	BY���3�o�"�. ������D���x(�0�^�N ��%���1�B`���a�N�A��q.<Ov�0DfRH��`�"�����|MwG0���16��7K#��.���!4���V�P�/%$�|�C���%h������)BW���3�B(�Yr�AT���F`�X��������I����� �la@Dg�Y��D�>���1���!*	,PQ���3��k+"�@%����?|
C������%QR* �L���x�}�:%��$��EY�������"�@{^����w�|A!���l�_��!�@�
���B#B�r3��?�L7�Yf�:����@6z������4��t���Tg��
�,�#�j��z��b�#}|��o�|w���31r�-"�	qf�����p��n�?�`gN��[	DG��[iF��O�y���s�Fl0��`r����P��G��l��1�p��2.����J%P�w�	��2������_������ �����c��
�����v�/���Z6���?PK�a�'@�PK_CLObject 3/styles.xml��K�� ��9�KYc,+��)���LM� $SA�
�#� KA��PYJ����/�/c#w=�F��d�����bP
U_�����[�r�t����X�pe��?%7;'V�L�K�iE�a��
7�2-W���4	��?�Y�<�������=����������C���.����T�h$�1hZj���P?.����`<�~(��k��N'���������*���`���������G-��2��������nT'�7��ez��ru|�E�z�c=,�����C����<}G����\G8{�3*��h��q9v��/�Lk����b�[�v9H�>�.;��mo�����[g��e�������k>�>|^�����p�Vm�T�p������3KW���J��2��S�
n�����k�MTYy�{L���o���j-	.��Y���5	��Z�W�kLa������
�����=N�����L�
����Ct�PK�P���PK_CLObject 3/meta.xml���n�0E��
�v�G���*R7��]d�@����	���(�����sF����p�+���J&��b��*�L����&"��!VE!8�\��Fi65f
���s)!��T�V�T�[j8U
����i:�'�J�����i(@��v��J����{�����t����V8&���.,�h�_��]+)�nA#>KOq��la�/t����w���a0d�m.������6��L��l5"���<F�4��K���Q:=�L��@`o����(dw=�G��nk��S��r�B�E;�!f^V�,`E�����x:��^���~�����~PK�A�5gPK_CLmeta.xml��Ks�0�����-��[d�U:�L���<B\\�X������8/��~W��������^���%�Ahi�%��{�3�X})L�*	�1r<�����\��Z*��kn����n%7'�[���b�*�N��%�m��c<MS0�����y����6�����[�Fb�`v0
(��9�gC��m$c��h����#$���F����
�����
�U��y��o�P�mw�Q���*Fh���pG���s��,�
�a�e�/�����\�����~�~�}��';*F?�}���u��zVu���8��M����x��d�>��`����He�%���nC�6
E����$d4f�%����~}z�uVIo���;���-Q�VQB�m���\tS�Q�h\������^�PK�mi��&PK_CL
styles.xml�Zmo���~�����d�r��%�v]���v����(���(P������e�Gq�d�S4�������H���]B�-�9a��=�y�����$���_?�u.���.Y��B	N���{�s��JO^�OW�$_�(��J+���,Z��+��Q��.W��j������X�n������!G���%8�/����w9u"�,�� --�(I�\�!����v��n1c<v����U���A��
N*\L��,w���k�	h�~[W)-�[�'S��x5�8�+�r����F|m�����h6�O�3n��"�*���6Ab3���L��>���O��%�
�N��fjt}=c�RU.�����=����5�n��D`^�����b�%}�n���[������O]�3�E�H4��;~�����T���0���:�����{��e��/]����s���*��}��quD�HC�v�|�aN��j��!�1� �<Cj��`j��2�WcN�;$� c������y�}�����s�<U�n���S�^��3bpjF(�N���/u���-}-����(��x�J!H�,hB����
�X�]�m�!Z���`5$O�#y�@dDP^����jo���o��Z5���s������m����-JQk��j�E�O��0�i'Y�o��8.(��z/�j�CqY���X��l���ReUR�Sjx�8�9�6Ny�� �+�)@��9!�Je��8���D�L�eJ�������4.P�8U��A�_?�mTm��CYa��scfJ�f��MW��(�\�6�-����Fy���)�P���rFy���.�}��P������):�-Y��RZ����(��;��L�d)s�u�$�����������[�&���;%^d8�B�<C2XH���"�m��0+�@**�V�D�Y�OR��r��S�I ��l1�1w��|��,IC,�uy���H=��Q�h�+�M\�{��Y5�E��K�\��K^`��G�4�@p��t�>T{��O e�KONL3�����SE�V~z
V���������B������wF�
R#}uq����*���F%�u!���AE�Q�Lf�
�h}������0=z�u��\��c�:���>����{��Z��#���S���a���H>������Wo�f<y]%�><�i��,zL?�I������x=�-����������m�(�wk~�����m�_<��r���q����?���A�'�;,��	|�l�T��/W�X�E����������{/����:��\r������jNJe<�����9d��3JB���'������q�wD'�eL�_��a�J
��E��:�'��I Q��
���]�uH��
�)q�ygg=���qt��}nR���B�r������=J$		��#������-�W!�oe���3��A�9����<���5��X�2����iw5��n�$��X(�x�Xxlz�i��K�k��@�#���m1J���i�g�!��-Sv|���?^3�b�o�B[
j5q_������~X���Z��/���;�V���1����B>�<�
�Z��D�:�ztueG���8�H>�Mlb��?����O���w[�d�K�T<A���0;���X!������|&N�#n��l0
�������W�@��rS�(>����� ��Lx�A����[&�|�>��Y��>�J]^@M�����/L���o�^���?;Y��i������h��tn��������!HLu�c�? ���|=��`�*'�W"�VJIc�/�y�S����K������o0��������,G�	-�K/6O�N���T��"m)/���}�zn���uT0�����vx|����W�F��;���/�/^�B�%[�������������1�2��E�aJ~o����mAr��������;��^{���y^����������%���������gg���w�8[�-V�_et_6�{��4s��K��rY_����n�p�����PKE�~���,PK_CLsettings.xml�[[s�<}�~��oRl���I��%m.���M����G�1��W��&���;���B��������e.>.\Y@�%���NU*�x�Gdz������c��:� 6|�E$��C!d^��	ol�/�����
�5h�nX�y������#2�TfB��j5��w��;��UM����u���d������~n�R��P2`���XMU����Je�������.��7/�6'H� �Me{9q�R�&��QS�{9�F�����Q�B���P��E�g�W_��(y�|1;}�������Mg]��5�h�O� ��%��m���]Z���b�c<�����&LR@i&��^�i���dD~���!��k��v�8e������&/�sD�S��(C��
��~�g�����	�����.@y.����ox-��d��Z6���9'����Q���o�����4���4�$J��N@m��}�����5`
���K�zF����=����K)��(M�"�qqO�\�;YUL0���x�4[�y��-Lijp^�A���jP�A��+���Z%�-���
�Go�JY(e���k���R^-�����dA{_�B)�,d�����R�����.���D���39ys����,��I{�QlJV�`ub�� �L�2��3dt�?�	%��T]��OP�S��i���Z��V;�x�����>���( &����cd8�P�|S���FW�K1�}������}YD����9�C�����7��+>$ ��	�������X�isZ_�rI��F�}�t�x��F�a��h�x��9�v>+u6����JJ8�=�����v������8��������M�yHY��p]5�pr��������/J
g��j�)�M��)�Y��oI�%+26�3u��x���Q��LV�0������2bp� "�����u�.���nNU��_X���_t���Rs�Ecq�t��?X@{���ic��({��
_��5d��K�S�$�!�����E�T��o�'�9q��B��?��+��5"A�{Q1J���$e��`���Z��R����U���+0�����C������H��n
��w��!~����:#�9w�
c���u����l������<\�f��������u�8�{�������wU0����Zx�\=���n^c�I]�m�~�����i�%��M;��?�������d|�&XW�������3�u�;=g�<8�cm�?����c�q�����"�G�c��^����c�qv7?_�������oC��V�V�9�y�����[-��wl�uc���5�;��c�a���c��Us���C�q�>�gv[n"�'���A� O��������?�����{��7PK
��r�2PK_CLMETA-INF/manifest.xml�V�j�0��+���R�PL�
���~�"�mke�UH��vh��������� �X�M��w�b���"@eK�u����[-g#QW�(?
�����`���J�]����I��,���������<�0g�Yt��t�p�?\�+��q'�)��rY6Pj������k��4����(�_����A�� &�HY7�lP��	:
y��
)����?��s�E�\(�4��z��`Ob�~������p��@5��h�k��,�)YPS����n��������D8�c��\]#L#?����� �^mk:uI��%AS���S��6%
lJ������J�������Sw������[~PK����Y-
PK_CLcontent.xml��[sG���>�B���78�~�df�M���CUY[WM���A$$q�$8 ���_?�;���PZPZ���n3U��p�����������o�����������up���n���}����������r�����_�p��w�_�|������7���^����������>|���_�{�������yw����7�/��}����o>���~���������}�?�����������|����o����������7/v^�����[�������w����}}��g��/o^���?~�����o^���������}�"�1^l_���_~���{�Q�^��ys�~��������}���-������;��\�_�]�����0���.1�������?�����p�_�p}{��?U%��UI�>�����?|�}���_������7�����k�?�T/�^��������ooo?���
��}{����b��g�����x�����3��/�/����t�o���h�/&qu���������
����O��W_����?�������������_�~���������j�/����������O�;����?������r���z����zu�o'�����_�������'}�/�0^l����/~C�/��#9��o��������n?�{�w����������K�o�o��'?�s�����)c�g?�'���7�����t����^��0e�����������q��/��[������?�g��>��Sm�o������6�� ����B��O��`�>����ws�p������W7/�|���>���_��^���_���9`l����~7?i�#>�������_�o��o?��?�����'?z�W����bv~|���O����_����w�7�^��[��7������o�3yK�p��yO�t�����������]?�����g���������|��������/_����?���������<�;~�%/������s�}��j�9���������m��������9sx��������������wsw����W��~������_}{3?���_}�D�|�j��!4W�����������������{o��zoe�e���[���[�������{����x�o�w{o����~����o|o�w�,t�������Z������}L������m`�����/
Zw�?����W>W����?�����9S��ue~�
�psu������7W������}�_�~���o���w������c�����7�?��>��� �����\�U������|��������Ozswu�����=�����������}%��3��r�_��f.7�P����~wu���m��k
���u�^��~~5|���w��o���+{�~zG�*�\��y�N��i����_|�%km�����[����_?�������������+���Vz��Cd����|{�?������?��Zo���:��?��w��������J������������~�_����n��������	��v���W�|i*������g�������-	��[��?�j��}w���}i�xWo�
�Z_��j�Z�v]�W�K�X
W��~����sq���_� >�r���7���������G��?���/�W���z�G�5�x�k��X���
�u�x]�������Xs���c��k�wA�5���k����cMQH����7��Q�X��Z���m��,�}��km��z���\�^�6�p��Xs�3�V��K�4���C]�\�����g������_~������]��a�����9����w�����+�����������v����~���w���m�1?���~���Qo_�z���i����qu�����{I��?�����9�������1�������O�����Y{���g����_�_+_����_�V��~^�W~�������w}||�\}��_y��	��g~�����7����������~�a^��Y���~o���/��lUC��~|������W����_��+�~���?���[?�����'�%w
N��]i����w�D��_�?3?S���0����9�����G��������O��u��g�{��O�,�������I����������_�?h}���^^�����^���?�/��>����w��w�������������58����/�
�j�����]�_���x��������W��B����~z��n���<v��Oz|Y-}��5��I�K���&�:�����ITB�h�M"ua
��-�I�j�%Z�I�N����t���aM!u
aS�_���C3�Vj�gD6��I�5�/��o���������:�:����C���=���$R'��~�x����f6��I���@~��i�H�xv�������.���3���,����U������s����v>�Vd�S��6��R�5NN.��-�v�R'5J������;j��$�n�����5��)�����8p*����:��1��YB��jlcM!u
QC���4�j��� ��%��Y,�I�.���).p �R���[������$�_x�{��*�2g�����/�������"�Z��b�M"uQc��E���m�I�N"j��F��:v�$R'5L^�^���l���'O/�����l���(�i���h�M"u�C�5�I��~����u6�*9��Z��XSH�B�:G�g��M��5��)��9�����e	���w%��eZ�N�^V;�E+����\Q�=�dM!u
Q���Eo�XXSH�B�(yi�;��5��)D
����3>�M�R�5F�z��d�5��)D�W����$R�,�V&7WS���u�M"uqk���BWXSH�B����y_*6';`�H�D����"Vt0��$�_x���9Sp��9_VK�E;r+��0�*X�%�I�N"ne��\ZE���$R'�2yz�3��)�N!n]����������J��K�.'t��6���m��rw)���aM!u
q�s9��uC��B�"�%��Z�����:��E�kl���X�)�N!r�s�9b�������c���J�b	Tmg/��������xp�/aM!u
�+���}JkcM!u
�+�k�QW�5��)D�L�}\���&��		�2��{���$R'�2��2ZV*�I�N"nmrs1���l���[�\]M9�{�
l���[2�9#{�'�$R'wiX��+����eI����$�������^|Y-}���M^Kk��tgM!u
qk����6����D�$b�&��u
���i�oDa���%��w�5��)D
��K��{&k
�S�)O-�G��]�	�N j��\K	��BXSH�B��~\��A6��B��>��rl�8����:��w�]N�boA��Rh�1�Ep����zG',{Y�|�H���9l�-�)�N!r���H`U��&����!����`�����:��rq��f��D�$��������B�6��I���"����lv�R�7H��e�����&�:��Qrq-���6�$R'7L..?����&�:��Iuw>��E|Y�/<�=	��m.�s��;��j��hGv���D�Y��F
[���EZQ1x���F
5�ny�����-��4R�w����X���F
5�n{��"�T��Q�M#�q7��.�T��h�M#�q��Hk�/*�i�P#�s�����<����B������>�#�I�P"n�9G�^;�m�ei���w+��dvaD�`�����/%z��s�]������5�JD�����a�5�*D���>�'�k)��0��e�%��D
%���~��*��n�J����w}"pGM!�
QC�58u|6�X�H�D�HyO=�DX�H�D�Hy�P!UlB&�I�P"rZ����c�CaM����"|��RjV���4R��(:��Z�5�`�H�F����J��h�M#�q������G��I�P"nItpu��Dl)��]=ZD�%�4R��$:�4J�6�j�-�n��V8
l)��[=;�=<7�`�H�F�������k��f����a��{�;!l)���aw�K�`,�i�P#n�]\�#�c����B��vu�����i�P#n�=;�����&�B��vw�G|f����B����_��il)���a�����&�i�P#n�=;���1mgM"�������z�&��K	��j������A��E��D
%�&�qN�����&�B���ut1%�u���D
%�����4�}`�5�JD��g�}�{���D
%�f�s��<�m�I�P"jr��(t�aM"�Qs�9D�>"�I�P"jj���^� �I�P"�	js�\;:�m�it�.x�f������pCM!�
Q��D�'�QSH�B��:�1*X'+�I�P"j^=�(��oagM"�Q���Z��	k)���W���WlR&�I�P"j^�z_��QX�H�D��z�.=�1��&�B��y��]b���h�&�B��y�Z���k�.W��a^]\��b3aM"��k?bE#��5�JD��g��x���&�B�����]B�N�$R(5�^�K�Xg(�I�P"jf�z����5�JD��g�"�8��)�P!jb��-��P�~H�D��z[o�{]	k)���Xo��������v�����o���]A���{��i�P#jf�����wa�4R���:��x��M#�Qs����������B���u
nxn�x���B���uj.��&{���B�����
87�4R�5�N����-��4R�5�N�u�n�v���B��)�Z~�<@�6�N�$x�S�����sv�UpX;`�H�F�{�<�����F
5�������:�6�j����������i�P#��!�����v���B��9��`B�b:`�H�F�{��J��Fl)���wHv����k)���bwWF�������B��)vw�����&����z��T��2Sl���a���&�B���w1ao`#M �Q���E�
[$
k)���]o}KF���5�JDM��95,��$R(5�^�K��$R(5��b������&�B�����,��Zk)���Y/1*x�LX�H�D��z�t����5�Nf}X;�'jGj^��
��OX�H�D��z��J�����M#�QS�]h,�=`�H�F��:6�s�����M#�Q���\��a��6�jD��cv)�
j�F
5���k��G��6�jD��c���(�{8`�H�F�;VWr�X�x���B����7�V����D:y)������;?xD��F
5b����v���B��9vu�7t�&�i�P#��!���+�#����B��9vu�e�f��M#�qs��r���Y�H�D�{��9{���B��;`{7�w�=`�H�F�;���a��M#��S��z����l"�����a��\	��5�JD���s���g��D
%�&���<��B�5�JD���k�$�caM"�Q���ZAg���D
%�f�s�3<x|��&�B���us�������D
%�&��l�	k)���[�W���QSH�B��z�sJ�e;{���}|�E��>����������o�}���ys}�j���"S���<:�0�����������ZN����5������V���6��9���cjQx@��C���BO-Rk`-����6���(�9<�j���!mq���,9�[T	lis���G��c���!mq+��+��w
lis�]������h�f����;�w��������2h�1nGPK������w����<�%'�kN�1�;ki3����+s><��f�6��1��W��#�5���
�W���y�b� mQ#������	ki3�����>��h���� j|<�H,��f9<^��nH/�9�-����(.�nyp���6���`v�g)�8��rh�1n@p{��J��|Q
}�H
��kA���5B�]K������!mQC�5��%����!mQc��E�����
6��9D
��z(Lca� mQ��iE�5a��C�"G��o��a&�Y�nyM}����"�,��f���%�3�		ki3�n��I�e��e���c���:�]�b�&a/�����!�����-�w����5@^�J���5��D�����Lba� mQ��mf�O)��� jx��6�[PX3H�A��8�����5��-��5����������9���`��C������{n,x���6��S��F�,����_x���l�T+8q���,��[�������B`sH�C���J�c�9��!n
��Zb�x?�`sH�C�*��E(�	lis�]�<'��_���"u[f��g����5������1�#	ki3�\��j�36��f�����'��� r�sNx���^�A��q#�\�\rw"����,�\�\FK��MX3H�A�:�9�Kki3�\��v8F���5����C.^to�9�m2��D�n�����C��V"WWjBwC����yjb+�6��9��D�����J����dj�x8��C��.
���6����rh�1nDpWn���*x���/������������Ylis�[�\]���A����6����s&��G"v�R7�0���r����5��D�����l�&��� j���*+
�-���� j��\�,���fwO�������A��>��r
���A����w%�%;zQ��/<�
�L���
�b����,���~�Iz��A�"��g���d�(���q�nD_����C�����������7:.�F�@p���6���qu�����C�������:�6��9��#�:�2va� mq��p>�u��M�����7�v���_x���5[q-������g�����P#���YsH_3r7����X��7�,�gw;��R�����"}q7��.�4@�6��Y���"���1��E�,boj�:�P��E�,�nk���JCXsH�C�G��K�xp{��"}q�W%j�}�,�g7��.��sD�(���;�\����r+�E55|%����c��j��n_;k�s�.{����J\XsH�C�h��^����5��9D
���c�8a�!}Qc�����k�s�*os�vLXsH�C�PyyQ�{���C��F�����}�5��9D
�������~H�C��z�]��ZX��d10X��j�F�h���f�>���������x��"}q��������Y��"n!tp�g����E�,�BWjCOf�,�g�zv/�u�
l���[
\���m�Y��"n)��F�El���[
=�]q��el���]g=;�\���G'+��Z���^WRLX�x�f�>���uq9��,�Y��"nz]]���A`�H�E����<���6��Y���#����h��"}q���jhb$�Y��"nz����5���"}q�������W@`�H�E��zv/�V�l����^��
�������+	�Q�j��L��k%�Gwo�9��!jv]���w��g5��._��PXsH�C��:�X"X"�9��!jf���-�5��9DM�W����*a�!}Q�����i���A��f��g	���C��&�����s8�5��9�>mP�s�as�/��`��S��F�	k�s��R7�\la����C�������v�5��9D���%a����A�����g)`<$�9��!jJ������ �9��!jJ=�;�-���5��}K-�Qo�9��!jN�����|a�!}�s����
��k�|�|�������+v�5��9D��}������C�������#����C�����_��sg�!}Q��5>e������>��I��"&p�Fa�!}Q���oXH%�9��!jR]�3c�6���C��&�k|�w��g9������,:�����O�%u���BK	��6��YDM�Sw5��]�6��YD��g��=������>��Yuj���1���"}Q����T�V�Y��"j^=':!�
��6�,�g5���K��H`�H�E��zu/����l����Z�UWO��Bl���]a�Oy`�����S
�����B�f���� l����]�T=;
l����]������gl����^O1z=;`�H�E����ZXl}�f�>���u�O�7�,�gwg�R�\�l����^�:�G?�,�g7��b���
��C�bg����:�N�<:���)�Ou�*3��3�v�5��9DM�������C������:0��5��9DM��v�V	k�s��YO/������A����~;��Qo�9��!jZ�F�R`�k�s��U�+-|F=YsH�C��z�O>�-���9��z������E�B>��5#5�����\��Y��"jR���6�"��"}Q��]�!c+�6��YDM�� �C�=`�H�E��:�9�����5��������
6��YD���:��&,�8`�H�E��zN�s.���Y��"jn=���GpW�6��YDN��d���6�yt�J���'����uv=����6��Y����k)7�=l����]��N����6��Y�������Ul����]�K/���C��f��si��+��E�,bg�=F���E�,�f����*�B�,�g7���K�h���f�>�����`Z�`i�����{����g�]7�z��2QXsH�C����Z{�bOa�!}Qs�����@���5�����zG� }Q�9:������5�^]KI��LXsH�C��z��x�CXsH�C��z�-�DtU����>��Y�����u���C�"'���V�-�,-Z����a�q�������]��}����Ww7�o��o^m��YD��i�����/�����x���#����{���2x���C��@Gz-��u��!mq���z���~���6����S�X�$�9��!n���Z|��\�`sH�C�m;����~��!mq�������	�C�b�=O1FO�:`�H[���\5`3a/������!Au,�::��{Q�|�����|TKX3H�A� 9����Y;j�h��"�Ue�ki3�!�ne�G������j|�\�
�E��f5<^���1lc� mQ��mf/��������!���_�hm�����8�{�#�^=�v��f��.���<��/���������������_TC�E3R�������ki3�[��/!�
lis���e�P�p���6�������az���6����Z�o��6���5D�Z#c��6��9D��Z�Ttm/�Y�ny��?!�7D�5����it1���a� mq��.�� �E����"���}�ec/�����1rv	=!{G�m�P#�%Ew���f5@�����f5>^3�����b� mQ���r���w��f9:^AL�����C��C����� ����
9�^[���6��9��]H�C�C��N�f�2z���_�C��q�;c���8X�.�E5�Y4#�9�Z��9��!n��ZB�`�����6��u�s������6��u�S�5��Z�9��!v��j���
6��Ml�qr_�����5����W���E�5����d��V�����A�"�8�8*z[}c� mQ��e�m8���_x��J�\RB�����f>�F$W"�1
ZG��f�6�����T�q��5��D�Dn}b�f�6{�U��D�tKXsH�D�[�\�<����!mq���������lis�[������
lis�[�\]k-���C��V�T����
6��9�]���[���(���&w��\h	��,����,�[�<G��">�,�������Bw�����y�O�p�"�Y�n@a���������A��F����>N#��� j��\M� ��f5FN.G�A�w��fw?7R��ki3������	��f�6��w�]����(���w��r����f>�F�����?�C���A�"������:da�!m5:N��8�	lis�7FK��[`sH�C����1�w����7<�.�n�{���6���qu�!�9��!n�\g�2�
2���7B��0�!lis��Ok,����/�������]���F$?��j��hFv�\\�r6�,����M-������9��!����\;|J��E�,�nk��#{|DT`�H�E��-����[l�����Er-�1��5��9�>����9l�����sr��5	l���[�8��=�J<`�H�E��sR)���EY���7(��dv~x��a�/���+	^���w���+}$p����>����w=�����5��9D���1�M���5X��@j��]XsH�C�Xyz�G�Z�9��!j��][��m�9��!j������PXsH�C�Hy�-e���k�s�(��%��-
�5��9D���,��Gk�jF���SU�R����2���Y��"n!�#��l���[\�f���"}q�g��Z�6��Y�-������"V��"}qK��=����"}qK����w��P`�H�E�R�����h��"}qK�g�Z�E�E�,b�Y��{4��X����	�C	�1���4����C��&����=x6��Y�M��~��	l����\g�JJ`r-�Y��"nr�-���l����\��%����,�g7��.�����E�,�&����#�A���"}q���*�Q����>���uu�V�����E'?�����iv.)�����C������=��5��9DM����g,(���5��^T�dpa�!}Q����c���C�������2�-���5�^}K�Z�9��!jV����SXsH�C��z������5��9�>���l�b����4`%�3L����F�-k�s��T�{�`�����>��IuvmN��~HXsH�C��:������� jN={���4���5�.����nHXsH�C��zO#�'#
k�s��S���tt:����>��9��[��XW(�9��!rN����b��f���t�(�����<�����>��9u|>HXsH�C��zzQc��Ba�!}Qs�����D��C��&��oA�9���9�n��%T��C��&�[��~l�9��!jR=�(��k��5��9DM��<9��:����>��I���
�5�N5"���SmIF����\X�x�f�>��I�#���Y��"jV�������Y��"jZ��t��gS�Y��"j^���w<���"}Q�������p�f�>���uJ��A�6��YDM�g�nX����>��u���
��?`�H�E��z-��<�Y��T3��<������1���7��n$�f��E�,�f�����s�,�g7��������f�>���uw1%�0���"}q3��|�H`�H�E�A�k��A`�H�E�=A�����|�Y��"nr�V�x���E�,b'�k�U�Vi6�N5$���I���3�k�r�
��5��9D���K�TLca�!}Q���E�p?����>���������D� }Q3��E���5��D����<�\XsH�C��z������C��f�~+U����5��9DM���`]����>��9�����zk����f�O����:&W�J�5��D�������
l����RG�B�`5��E�,����8�<x���E�,�f��{����;�,�g5��S�G��l����X��z��l����Y�A��2�����"}QS���r�f�>�����R*
��<:u%�5�����������6��Y�M����j�}��f�>���uu������,�g7��.��"{�f�>���uq}��h�E�,�����Z<�m�Y��"nz=�Z�#��,�g7�.n���y��f�>���uu5$�E�E�,b��s�\Z3+�yt�>x������89�YsH�C�����c������>���uu��;�k�s��[7������>���uu�Gl:��f�>�����Yz�X� �9��!j^��p�2Ya�!}Q�����uhc�!}Q��5K��X�XsH�C��z�(�	{���<�2�/����������o>�}�����������-�;�$9zkE����v>�V�AO+F�����B�b���G���R���yZ�[��6��)��}n����_6��)�-|�����R���y�M��s��B�bo����\h���2�����������B�b;��z�x2�`�HY���\�6����_x�{T��k!�[@{I�|m�����	�mv��Q�5:N�����_XH�@��xv*q$�Z�	�L jl<{�>*���R&54��J���r��@��F��W��6�R&50^��V�!lcM e���}`����5��E1����T��.�R����p��uB|I
�/<�=n?5���'|����,Z��$��%�l
)S���%�;W�)�L!jt�� �w�({�M!e
Q�����V�r�6��)D��W��[�z�6��)D
��)��=�)�L!r��u-����M"m+kn�q�sxK�7�R&�����
���&�2������'�aa/I�����AUlN>�@���^R�ER��u��wt��XH�@��x�<�AXH�@��xJ"x���&�2�����U"x���&�2������e|4YH�@��x����5��-��5��������R���8:_jo�l
)S�{�uv,��
L`SH�B����Xrk��_�B��q��;[�.���	�_R;�E+rk���?�e�)�L!n�������9��B���7z���B����uc3�O>l
)S�]s<'8q��V�I�mN���K���Vk)��w��>�O�	k)�\s\|�`��&�2����.�N7��Q�����?4���$���c�{ ���2&�����g����xc�G�k)�\s\s�8�XH�@���RGE���XH�@���ZDgAk
)��pk���#Tp��M!e
qk�������R������������2��5�slj�BY`SH�B���iE��C�l
)S���.���*0�/I�������]�5��\
�]�_R;�E+rk��5����)�L!n���"��y6��)��9n.�nx�&����"W����aM eQ#��j�HXH�@�9���G��XH�@��xJ1"xV��&�2��{��a	|�sGMe�p��q����k)�{�~v*5��d/I��������d�Vx{I�Kj��hCjd<?�
�g���2}�q��|$�^TXSHY'�=/:�28�=`SH�B���8j�>�M!e
q��B([��)�L!nd\\M!�
m�)�L!nh<;��
l
)S��sI��l
)S�W�bO|8`SH�B�\z.�J�XOx������c�����b��u_R;�E+�#��b�h�,�I������Q�c�6�$R'w���Z|�A`�H�D��+��]K��$R'w���B���6��I���b�P�FpN$�I�N"�����9��D�$�>��=����A6��I��t�^�n�}�&�:��Y��"�n-(�%I���w&�qdr�|����������Jv���k)�;���)�N!j��]��a
	k
�S�){�<������:�����Y�B
aM!u
Q����4�,PXSH�B�0y�,��
m�)�N!j�<{��6�
k
�S�$��%����5��)D������.�)�N!rB���>$!�It��,�}��tp>�Vgl���[�\L%�W@`�H�D������
<�H`�H�D����J
���$R'��9��G��Dl���[�<�91U�v^`�H�D���9Bu`�6�$R'��yzs�%Z�I�N"n�sX+G�V`�H�D��������;l�*N���cf]\O1���l����Y7�����D�$�f���8:�
l����Yw}Bw��$R'7�����2����&�:���uvm�J$�I�N"nf=���5|b�`�H�D��zu.<���M"uq3�5���U��)�N��)Wx8�`��T�v��0���F,�i;k
�S��WG�j���LXSH�B��zj�r������:��Y���%�
DXSH�B��:���@{��5��)D��g�RB�f���B����kp
��
d
�f����5��)DM��5������:��'���;X�!�It*�#�g�O�w#�R�5�..V>�!�)�N!j>]\���5��)D����[(c����:���tv#�O���	�N j:�]�e`oAXSH�B�t�8c��MaM!u
Q����Tl:��&�:���tq���u���B�"g�k�����5�N�"X~�T�2����$/�7�R�5��=K�H��&�:������`�1aM!u
Q������UXSH�B�d����aM!u
Q��98UxM�PH�@�dzj����mj�P!j2=����5��)D����-l>/�)�N!r6���>Q/�It��sr�j�1�����vDl����N��rL�l����PO/|��&�l����Q�u���Vf��B��f��ki�]�&�:��)��)�#8#�$R'5�^3�P��6��ID���,'6�dl����V��%��g�D�$"��k���t^�/�4:�����Ou�5�������p�&�:���uu9t?s�M"uq��BHL�6��I�M���e�����B��&��k)�����&�:��{~D�j�����D�$�&�����L`�H�D��z�rZ�{8`�H�D��z��x���D�$b'����;<��`��D;b����E��=3�����������:��y�w)��U��B����S�Zf����:��Y�����;�5��)D��W��
:�XSH�B��z�o���v�R'5��Vd_������:����X:�	k
�S��Po=K�FRaM!u
�����4l0�QS�D���a|�6�f�1�z���&�:���tL�oI���l����OG�|F�l����P��������B��&��k�����D�$�f�1��J���D�$���k��Z�R�6��IDM���R���L`�H�D��z�P	\�m�	�N rR=�'_X{����	�n�(0�����6�:�6��I�M��K�v�R�7��.�V��I�N"nV]\�c`��D�$������<(��&�:��iuu��^�M"uq��9��\���)�N!nV]\����^6��I����\�{t}/�I�N"v^=\���>`����#���3��������k
�S��VW7z��R�5�^�w����5��)D��g��=X�&�)�N!jR�z���M�R�5�^{���u���B����S��"	k
�S��R��e�G	k
�S��QO-R/����:��	�c4�f��g&���n����]���w�~{sw�������>\�������y��zg�!��
�/�Q�|Q
}��-y�������C���<w��B��5���-x�V���lis�[��z�P����!mq���i���lis�[��]l������ n����7�h�6��9�=���\J�f�lis�]��]���L`�H[��
\�-lJ-�E���7#��%Ws�������f>�Fd������%&��� j��\	�c�a� mQC��v0H��_X3H�A�y�L	�#\X3H�A�9��k�� a� mQ����O�'j�h����g�w����98N.���1lc�!m���Gq���}�������%��D��/������������CH�z�/�����������6��9D��W������lis� o]K�n?`sH�C�9TW|w"8`sH�C�y_�w����5H^S�����C�"��S���Z�6��-��U�����;ki3�[��|	��5����7�5c{Q�/<���c���w�����,�\��sw���f5D^����}���A��F��_I#�OBl��� j��]J�c�~a� mQ��m��� ��� rx��@O���� �V"7�7<`sH�C�J��E�X`sH�C����k	���lis�;�Z�0����_x����l��3>�,���,��[��>��"����9��I����6�����k�����A���!�u��B6��9��C^}K���&l���2���bl	SHX3H�A���\���m��� rrj���=ki3�\�\z�
�X3H�A�������e���c�� �!�?���B/����	�U��40���f�
9���*��5��D�B.#���ki3�^��sCa�!m�nru�WP�6��9��B�s��������wCo?��������!mq���+5�{�lis�[R]�jY`sH�C�Eas�V���(���6w��\�����|Q
}���B���n!y���6��u�k��C�C�b�!�QJ_>-�,R7�0���J�`��f�6��arr-&��,a� mQ���r��AG��A�������#��5�����g�+6hc� mq�Y#��ba� mq����xG]��2h�1nBp��.G�l����,�����K�
5��C��W��<��^�9��������g+�C��F����%���A��F��5�
�6��9�
��+sp���lis�w�B��9`sH�C����0�m�9��!n�<Z1����5���M�������(���6w�����������g��� y��<`��`�H_Cr7�����M[�5��9���"������,�g�p���|�\`�H�E��-�>���l�����Er�G��>��"}q7����0����f�>���:��%p�6��Y��z������6��Y��<��s��E|Q�/<�-
v*�]�<'��/���+���eW2Xf��f�>����w�t��BXsH�C�h��6:�q����>�����["6�m����j�<���k�s�(O/b��C�5��9D���!����5��9D
�������5J^s�� �9��!rJ�z�ta���e�`�s����yQ����E�,�A�z����C���@�J�`	��f�>��%����#l��E�,��@�1*���6�,�g�����
6��Y�-���K
3���"}qK�����>�!�Y��"n	�\vU���E�,b�W��Gl�|(|�9f��	����6��Y����k~�G`�H�E�����F��,�g7������El����^�C�`_$�Y��"nz�\�=�]`�H�E��zv/<uNXsH�C��zN�#�B�,�g7���K	��E�,bg����x?V`��d}X�������5��D���#4Lba�!}QS��R�{��C��f�����c��5��9DM�W���'�5��9D��g�����5��9DM�����;�k�s��V�����P�>H�?��z�o|G
�XsH�C�3�\�h9��f���F���g�Qw7R���5�..���UXsH�C��:��������>��)uv-Upe/�9��!jJ���Q��l���>��)uq��j����>��)uq��)����>��)����
�
k�s��T��V/`�����>��I�Zm���T��E���H���I�\m��	k�s��T�j.���l���>��Iuq)u��CXsH�C��z�Q������>��Iu�=a�����>��I��[��a�!}Q������u���C��&�s|*�`@XsH�C��zxxN�XsH�C��z����l�f��fwl~�-���~�G����fl����U��R��l����V��J�`Lt�f�>��y��^�o��&�Y��"jb=�:s�������"}Q3���[���,�g5��b���[l����[o�T[<`�H�E��zv/������,�g9��L�1�	l�jHlT	Ou3��iN�xv��E�,b����[W�Y��"nz�]�dw��g��:����}��,�g7����:�}��f�>���uw9�{:k�s��[wKh`n-�Y��"nn='����Y��"nn=���=<+�`�H�E��zu0	�t�<:��X�+����3sk�rl{��C������T�MXsH�C��zz:������>�����[2�L����>������4la!�9��!jb��q��PXsH�C��z�["�����>��y���|N�XsH�C��zz�������>��Y��Z�g��5�N�|X3�'jFjR�������E�,�f���RC2�,�g5������C�6��YD��� �C���5��9D��ct%�Z�Y��"jb=':)�
�g�E�,�f�1�����5��9D���d9�%|�f�>���un��u���C�"���{)u��/�yt�J�y�E���:��G��El����[�X#�6��Y�����%�#��f�>���uq�vtD�,�g7��.�+|�f�>���uuy����6��Y�M�� ��-�,�g7��b��^��"}q���j�azl����^�S-��Z`��d�
X]����z��Q
��C��f����A��5��9DM��+e��]	k�s��[���Wp�8a�!}QS��B��
�5��9D��W��<Z�9��!jb=�85�o��� jZ]���c2a�!}Q����B����9��s�6���D����?v��}|�������7���puw���������E������/�����%�}Nd#������2���������g�M!e
q����1��`SH�B���i��hu����2���"FW�8��B���<��M-���6��)�-x�nD��}6��)���#����"�)�L!v���b@K�6���{�L���;��{I�/<�]�bi�b���v����<Z�'�k�?aM eQ���J���5��	D��W�����&�2�����U��k)��^e=)��@�5��	D
�W��;>��	�L jd��a�s��5��	D�g��m�)�,����(.��1��R�����>�~������c�s��S��������,Z�o�~���6��)D
�W��+����B��F���^K�{�
6��)D
����+����2�������0�e��M!e
Q�m�����R�9B^s��<<�m�I�meM�9=����@���2:_��zaaM eqSM�[/X($�%	���w ����K�r{I�|mH
��=Wl�-�	�L jt�z������@��������XXH�@��x
K�C��!L�@��x�����5��	D����1��^�)�l)��:�.t�6��)��:n��@�6��)���:�(e`��6��)����c�`�������c�y���f���zIm|-��8������Kl
)S�[q<���0�,�R���8��[�&Ll
)S�[q<���
<�`SH�B������`���D������"����L��a�����5��	D�7N���O
k)�\�\F{ aM e�K�K�1��^�@��q�������[.	{I�|mH�7���{�	k)�\o�Sh�DecM e�����p����@����T�����B�&"�z��|�l
)S�[o\]	)�l
)S�[o\]���U`�B���W7��`�����2�����2XH(�)�L!�r���
��������c�}�����dx������g�������.��]��B�����%E��X`SH�B�����������&����"����mgM eQ#��r�`-��&�2�����g�hTXH�@��8����5}�����g�)	|nOXH�@�gv\
a`�xaM eq���Q	<3M�Kh�1�;p'�.���J�Kj��hCjd<?�a���X�	�L r`����'�)�������<�K��B���uNa;x���M!e
q#���ku���2�����XjB��B������#v�R�7:�cS����l
)S��EV7��R&7�^K,��Oa/I�������]��z�{g/����
�����g�RK`�H];���,>:`�H�D�m+��>��<�M"uq7��.�Q���6��I���"������D�$�n^��h=�U`�H�D��+f��+X_x�&�:���3�iN��0�$R'��qv.%>�'Z�I�N"n�9;��9���$���c��`�������%��/���	�O��RceWji�V�;k
�S�*{����B��B��F�K�d)�'{��OX7(�)�N!j��:�n�"�)�N!j�<{��:aM!u
Q������� �)�N!j���������:��!��"g�-aM!u
������|#aM�S��`��sL��1ep�n�M"uq����ule�&�:��E���P���6��I�-z��Q�Y��D�$�=WZ�`���&�:��E��_��l�M"uq���K#d�
l���[�\�Z��M"uq���UR��$R'��z��[)p_������t�(�9f���8��$R'7�������"�I�N"nf�\������&�:�����\J�`�(�I�N"nf]\	��s�
6��I���g��Z"�I�N"nf=\��k�M"uq3��j*��D�$�f������$R';���e���^`����D�j�����k-$�k
�S��XG�\��k
�S��WG�B��R�5������
k
�S��U��e�N�[�R�5����sP��S��
�����:��)��Y
���	�N jB���
>�!�)�N!�yg�k
�hcM�S1?�?�tz�6
x�CXSH�B�t��8�Y����B������<:f����:���tv-��-
�5��)DM�W��>�(�)�N!j:�z�^������:�����YjX8%�)�N!j:�M�� �)�N!j>='��*|aM!u
���mx�p?�X��D+���>����|���[��!aM!u
��i����5��)D���=g�k
�S��OO-Z�R�5�^�S�����B����K�
�_&�)�N!j>����86QH�@�tzM��&��&�
���[���� �)�N!r:��o>�M�$:��������=uo��B�=�5��)DM��X��7�!�M"uQ�������?`�H�D��zP�b3�5��	D��g�2zh�Vg�D�$�&�i�q�f��M"uQ3����/�6��ID��Su��J$�I�N"jR=G�*�'��D�$"g���^3����F'�<X��N7��������I�N"n^�]h,�>`�H�D����\*:�	l������z�0�U l����Yw�F+`�(�I�N"�����:����&�:������x�q�&�:��;�iNXg(�)�N!nb���6�M�$R';�.���������v�z��TG�2k�Ro���	�N jZ�]���R�5��Z���)����:��I��"V�a;aM!u
Qs��Ew��R�5�^Z��{aM!u
Q3��E.x/4YSH�B��z��<`*d���OoCS�&c��B�"��k��+,�bM������Z��M��7����I�N"j>=�h=���M"uQ�]�c`+�6��ID���P�6��IDM�cr%����l����S��b���Al����T��r`���D�$�f�s��{��D�D�$����:�sc�M"u��5[�)b*�it�Bb���l���5bg��d0)�$R';�����|�M"uq3����Y`�H�D��zu.�7x���&�:���uw��
��6��I����9�{�I�N"nf]]�m`C��D�$�f�s��s'��D�$bg�9��6
l����Y�5��E;`����H��3���+!glR$�)�N!jb]]-#a
	k
�S��WO-Fw=�R�5����V�L*aM!u
Q���Z�`)����:��I��bNo�tAXSH�B��z�oz(�tz���:��)���f�T<aM!u
Q3�5En�����B�"'�kxj�> ���D3�a�q�������]��}����Ww7�o��o^m��YD���#Z;/�%��y�"��9�^;�S�)�L!n��w��*$�)�L!n���"7�,cgM eq��W��������2����������	�L n��_�mt���M!e
q����q���2��%�����s}�R�������_�)�,���	n��1���$����U��FN��Ja/����
��qru�����&�2���;��c�'�
k)��U�v!�	�L jl����	k)��y���R&54^+���9�bM eQ#�51���6�R&90�Zxx�PHY����\,<��M!e
q;���J�{8�KRh�1�9p���R,��'|I�|�H
�Cp>���M!e
Qc�5��:�I����2���qh�&����B��F��c�
����M!e
Q��iE�b���M!e
Q����Js5
��l
)S� �����#�I�me��9n#5�+�R&����Z#6��R&7�t��
��;{I�/<��b��:�Ml�%��Y�!5<�.�
>�+�	�L r�q��Wl�$�	�L jp�z��T!�	�L jl��k��@��@�������AtGMe���9,�����������8�#�����&�2������=l��B���t��J�,��R���9�^�2B�/I��������+W|Hp��_R;�E+r+���0a�`SH�B����B�`�w���2�������j��5��	��7������~���2�����gA�?`�H��� 7�{X7$�	�L ��a�4'����5��	D�7�����k)�\�k���R&�����y������c�y W��F~�^R+�E���{�h����@�"W����k�&k)�\m�(���k)�^o����N�&j)��p���+=���M!e
q���iM�B6��)������<7O>`SH�B�z�������T`SH�B����r	�FKl
)S���nv+Vh�/I�������]�UWc�G�
��v>�V��W�cK`�����2���s�������2����kI�����D�Ff�\\	,��R&5B^�Gg�.��&�2����"���a��@������X�RaM eq��q�m���L��:�����_XH�@����y�6���_x���)���6��a/����
�����w��aM e���5{
��k
)��aq*����O`SH�B��8�=x8��B�����Z�[�l
)S�g7J-�Bl
)S�|��L`SH�B��xNoR��\h���2����xWR�vK�B��&��c����$����w�V������_R;�E+��������l�kG�������?`�H�D��+�[O����l���{T�����q�M"uq7�H����g6��I���"�F���
6��I���b�P#Ul�z�&�:����U�"�B�$R'��1��k�K�$R'7��#T�	�Xo�%I���w&�qdr)�&�_RK�=��9�����N~w�R�5T�����%�)�N!j��]<BXSH�B�@�����BaM!u
Q��585X��5��)D
�g�RR�,�R�5J�=K��Bk
�S�$��M��tzcM!u
Qc�������TXSH�B��z�-|h]X��T�/X���i�J��"�D�$��=b����D�$��=�*$�X�$R'��yv.�E����&�:��e����z6��ID>���Z3<�m�I�N"n�sp~�^�M"u��wuc$p+�6��I�-{.�T��u�M"u�k�W�P�6�N��e��1��.����Z`�H�D��:�X����D�$�f�����E��&�:�����\b���3�M"uq3���/hR$�I�N"nf]�\�
�iE�M"uq3���t���6��I����m���l�M"uq3�:;���b�M"u�3�9F��Y�����	^�g�Y'�����5��)DM��K�����5��)D�������k
�S��VGWR���R�5��=K������B��&���r��&�:��)���x.=QH�@��z�Wx[�)�N!j>=G���	m�)�N!�ygs���!aM��>�T�;�l��M�+6�R�5�.��v���B��f����2�
k
�S��Mg�K�f�R�5�^=��!aM!u
Q���������	�N j6=�������5��)DM�g��X�*�)�N!j:={��<v�5��)DN�W���M�$:�$��3L���~��zaM!u
��i_s�.����:�����x�����:��������B�5��)DM��#�����B����S�V:�-�R�5�..�P�b��5��)D��W����5��)D��������DM u����EO��k�hEp'���p��N��Zm|Q`�H�D��=�������D�$���1V���?`�H�D��:�9�	��l�������\����D�$�����(���
6��I���c�F���6��I���czQ�W��D�$���)��s�D>`�H�D��>�l���O�l�hG����:���Y��j��$R'5�N��4�I�N"jf�:�3(��&�:���ur��
N�6��I������;��I�N"jf���>����&�:���u�.�����&�:�����������$R'7�N.�n{�&�:����4���:u����v��|��T���w���-��5��)DM���R�O�
k
�S��WO-�����B�����gA�R�5�^=K@/��R�5��'�H{aM!u
Qs��Ek�tLXSH�B��zjQs����B��f�k���],�5��)DN�mB�(�1b������Wj;�6��I������~�W`�M"uQ3��]I=a"�I�N"jJ=G�V�I�N"jN=;�6B�{�
6��I��$8b�'�l����Hp�
p[�6��IDM��p1��r
l����W���@Wgl����X��e�P�> l���s���Y�uC��Q`�H�D����r���&�:��{WZ�p8`�H�D�����Z7@�$R'w���E��6��I�����x���D�$�f�����G��$R'w���F����I�N"nf]]
	]�l����wuv���U�F��!�w��af�\j�^XSH�B�����
x�����:��yuu���U��B����s�>�#v�R'5��CSK�5��)D������G�5��)DM��5��\�5��)D����
j�BM uQ��54��;k
�S��N7�C2a�V����]���w�~{sw�������>\�������y��yg����TN��I�j��hDjx������l�2��?�#�m��� jt<����al�2��3G��c��� jt�u+a�{�l��� jr��6�z�f�� ]q7��[���t>�=���A��8���8����A�bo��&7��6�R�Q�@�s��b;zA��/<���_��9{�Vl�^P#�G2C�<'��a;��?���F��	�^}G�]�P��9"��������jT<���5t�C
����'�
k��������?��?�������Z��k���.����p�fa� ]��u��xP��A��v�����-���_x���^*�T�|�_P3�E#rk����,0:`3H�A���)Em���l�2�[[�\l����� ]qk�������l�2�[[<���� �� ]qk���*��A�A�b���M(�8�����%5�8�����n��e�n���6�����t9���H��g�1n<���C�<E�j��hBjh<?����k����g��N�������WpLa�]�P���J�`y����.�a��SJ�X(����rT�F�?!��f��E7(N.$�n���?���VWbG����e�x9����
6�t�����p��d���c�l`W���:�	_P3�E#r+��g��$��� n���V��X��� n�qp�e�2K`3H�A�
��*�P��f�.����|�]l��n*K�.���YO�� ]qws5��
�����rmq�<�HX�G�?����������.�e����jo���������5����m�5�Y4!��8��I���?��!�g��.���e������&����zeq��n\��A�� ��x�Z�����e����6�5����A���W�Kq8`3H�A���6��nk+��� n�Gs����ew!��6�����g�1n7p�j����������,�[Y<?��u|��`3H�A����6���dw�� ]�+��idx�����������1a�]�Pc��z*���5t�C
���z,3����52Nn����;j��������5x�Z������9�K���
��?�����w�f�_{A��/<����z~�X�'�5�Y4!5(�N��U����.�1�:F�
���	PC�T�����\�� ]qc����LW`3H�A��8������f�.��Q��"�
N�6�t�����J�G��A����[�\�l�2�g7FM�ZL`3H�A�<zu+��m����������"<���/������������V&kikD�������f�6��Sd���V�C��nM��g����6��9���bv-
>:Q`sH�C��)�km�K�6��9���"�F��dlis���������9����6��5�s��3zB����6������'�l+�/�������� �������/�����D��dW����f5J��U��a� mQ������k�+7����D���	����r�%���p�������@uImw�=l�3��7P�H�U��������y�(�K���o��D���P)X�4�F�6�Dm�>��
V��Z#HA�&�a\	�,v�A���>�c�Aki#H�@3S�p$=�F�6�D�����!��8Z?���aT�:h� m	��}`I�}�Zc����"<U~��'�����bcHC�	�L���y
KlicH6�����^&1���6�d����c,�1��!�g&�
,v����6�d�=���7pC��Mp!N�`��C��Mp�X����)6��1$��<����d��!mIgO{�>�G���(:�����Nu"<:M�1��!�R�3�M�1��!Y�:RI���\bcHC��8r�O���� Y�:W����C��.�Q���]bcHC�>uZrLx�!6��1$�Sg
���9������O�(���bcHC�>u�1�c6�F�����@�:P�����5��$�R{�-{�	G��� Q��S���;�F�6�D�>�$flY8�F�6�DjO�}P=������T"�Q?�F�6�D��>+����Z#HA������G	:h� m���=����tj� mI�]���<4���g���@G�Q�aM�Z#HA��t"������5��$�H'r}��t�A�u�#���bSki#H�����[N��� QW��+��3:
��� QW:;�a��5��$�J��&a���������')���Z#HA���Sq9a��Cg���'^�@O:Q����Qj�h�G��������5��$�H�u�Z#HA��t"����5��$�Hs�����6~D�����`7��5��$�Gs��4:�F�6�D���.hHO��� QG:Qt��q�Aki#H��#K��M�1��N��x�bb�u;|_aE���C�u�9{�
,�1��!Q_:0��6.�1��!Qg�-�U����F��3��P<�&����6�D��1�dfy,�1��!Qz-��D�%6��1$�PZ�l����6�D=�1�d��C�v���R�h����v#x��S]X �S7�^�O�1��!Y�:��q��l��!m����RN��������O)�V�xh��!m�:�����Ski#H�����F� 6��1$�SG*19��������O������:���6�d�{8
1�.�C����#����)6�~���X�Ou)��O��K�`�Z#HA�.��]��0�F�6�D=�����F��C=����Ski#H��v�v��A<�F�6�D��1���M�Ski#H��TT�&��5��$�M*��cP�A�u�3���S���+��(��apj���ZzX'�'�DQO�j���4�Z#HA���g�b��C�u����h��%6��1$�K��%�CCki#H���Kt�[}��!m�:�}d���K�%6��1$�M� 9����KlicH��Ar(	��������?�G)E�H��A�v���R9�'8��(:�-�����QW��SlicH��N��d���%6��1$�R,�� 5~��#�PGj�U��)6��1$�Q���u�C������C@KlicH��N���.�1��!Q�z`�}��������G])y0	xj� m	{�#�I-���E�}�����,>Q�����!�Qki#H��.}�U=f.L��� Q�Pp��xj� m�:��F�),�Z#HA�9���]���%6��1$�OgJ���5��$�Ngj%`-8J�m��:�=�i�c���A���GhSXf��!m	;��r��F��nd����N������w�����?~u�o��_�����_������o���y���_���{������_�7z���������h���������������������)���_����_���_���O���-R.���\���xO?�;���s�����_�����������������}��_�Oo~~�����������_���/����|��G������?~�a���?]~��.?�O�x���{y�a//?��'����^]~���{�������������^�a__~�������}���}s�a�\~�7���'����}{�a�^~��>|��9�����������x����o������w���c4������~��a��������z�������|��c��������7�����Oo��p�����?�������~������q�c(?����CC���D�����-�OQ�cT��������������^~�y/?����x��O<��'����{�������^�y�?����x���x���x���x���x�7�x�7�x�7�x�7�x���x���x���x���@�]�vx�?�v�������w?~�������wi��?����?"��^�`<�;�g���<o���-��������_��?�������#?�o��v?�����K����������R�n��w����]�������[��y�����i��^�F�������w�R�}/�_w�'���5�hy������������C>s�C:�;�o�K��,�%�}ecV������
�7���>���C|����?�o`hb���r�\@�z�x~??�U��]�����7�z�T�@9���z}��	}�p�G��T65.�R����b65����������;���7O��R"x�.}����������|�y�W������*�f)+W�����n�/X.�A|[&�#�������
�1�70�x����x����}sJ���<�v��}����wP�v��@�=�N9����-z�%�k�q���-�}a.X���[���C{�wW����!�u�^k��o<��'��F]|���G�*�y�9��X�qj�����Cd�yr.f4��GL����`C}��e.
�{X������5��{8U���[������5k���9l`�=)[b����.���f�7��E�j��\w�����H)p�ko�I�'������3x�dho���G�n���)�[o��/���]�`�������;���X��ovz���Z�H4g����C|���?��j>�o��V3��7�7v�����gt�Rn����\E8��o��`:�A|�����`2Z���l��;S9����s�E����p�[���Z��Q]{�O:�/�Q�3�<�O�)�������+�
����3$7bXp.��g�%�8�A�}���H-Z�#d�R<�d���TQ3�%5��C��H��������K�]h�\W����H��.N����#}��[�GF�%d�z8�o<l�G�\P��L�����*�1h����~#tn�^	7���#ktx
�����e�:tm�9���-t�l�^`���P����]C������H$�����2t���]����.e���\8*e��Wn�&p������G����������2�|�B���R����W������v����`�l�*��	��*j2��<��yLM.�+�i[C�p��P���)7F3��s�O��1%t'W�����7n�G
3��s���o��y���p.��t��h�F��'�!�)�����G�m�Ss����Q���D�4����:?�?�Gt����}�Cs�������+���s���w���������s��a�'=���)�Z�2GnLe�������y������l{{9G,���|-0�C��D���@K�����xy,�3���=E���!}.C5�<�P���`�U��)���������}j�	>~���D��m�t�#���w`���
��&���s�Vv]{�3���{��s�NE�5���u����v�j/��Ds�F{T��^��E(��x�1���[!�1�+��7/��ZE�����%�R�-���%������>��6�}��c���>��=�4cuH}E���SO{_��������>�1��p����S�=@:��>L���c��M7w�B�V��f�A|c?��k�����>���l?*k�����E�7���T' +�V�}�..��pj�\JC��z�����"U��W�\���h��=��x�����B�������U��?K0���"��������8n���(?w�����8x�S��|�`������D_��|���P�B���x�C�n%��C�w�K{�
j�J�cM�����#�)=;F�Nw�s����;�5@��(���C|�5`�<�{����xO�G9h:���V���T�������g�2Z���@��{C}c����kh����-�#���`��!~.&7X�kkY���/;�K�����O.��CO&��t��7��1�Z���>�G5p@�t������]�3����G��Yl��X0������x�N[B70f�������l�F%������NeG7��L%e�0I��1 mj]m�Qp����ZW���y��@�ZW}F{���+�;�����s����Z�}�wh^��Wz W',��o�o��o}���7���������������z����??�����(����7�w��~���������vz��������'��o�o��m�EEc����j���W���=�?�����5E������9{�#������_n�+?=�������7���_~���F���w����?��~�u??������7}�M���J+�W������?��\�W������Ey\u�9������s�/�\�����h<��\pid���pg�{-�����o|k5��=�������F5�����b�x���r���E�����
l|l)WW|��R:�Yl<%�G��}|�s�������|�R8�������`�s��'{���;�u!U����j��Qg
��H/���Qg�\r�k�T��G��.s���%�\Z�/�>�o|���p��
lZ��"����c}*h�H__��Rk,�pM5_���l��]"�o�����k��w�i+{MW4���n�8>�
��k�?����;[����_O��;�1�i=���u��J�_Mw�
���Q��B���T������U������h��34�8��r����$w	N__�M�R�)�b�G���]��+�|+}-YK�|M�&��K��y|�k��[�1P.}E�a"�=v�e���o#�3�[_�m�`k��yY��=j{��sA:�Nz�GK����0.	��Q�]b��W4>�%��)���,8�%
�XDW4�s�s@�9��a=�W���4��c?f�B�5$�8m��*�]d__��>�������Ke�/�y���
lF�k-�R��n��&P����0�jlq�>lj����U�`E�=��|����)�:n�w%\���R��Kh����?Nd=.��jHLd��i|�+��wn[��.����`����i����t���k����]�)_�_{��a�����'��/��m�K��6~e�e*��K��C���A�K���la���-����{�<&�s#<
�5������6__^�x�����������}v�h|+1q��K��n�v�-������}�y�,[�|���\p
6��> �T����.�ivN������B�<��23�}�W}��4�C����.}����U�X��+�z.�����J�4.#�%��#�>+���m�3jv�������Cd��u����s��s!s�T��|���.��k��ID����Q�x���Kn�:�6���d]��Q��W���dN�gwp.������Dvi�1�������;����&����w��z��q)Dj�.7��9�|/�h��{m>��C�M�c��K�_]���?g��z|���f7n��e*xl�Di)r�!��7?�]�__���L����i���>��7�P�������]:�����������]W��P���oW�f=�z&��6=����gv�����sAI>��#�$m�v�.x|��!^u�/�GJ��,�}B�WW5��b9�;�1oKn��jy}<�����F`�bW�e���k�8���O���F�z�e�7W�32&��,�@(]*�x)m������sa�aT�t��B��g>]�3c5�W��7s��G�^����qd�Ja�^��y�||��9��)�������i������?��G��\����;���z�<��w.o�^F\���__��S�ABh#Gy��O�l)_����j����.UR����}�W����>9���6x<����{jO$�r$��)A~���������r�������W5��%��ckv�\����^�NS���X�9����[��O��uo�3��t1��qk�w�������N���p�-�L����V�����j���;�.��}��{]�c_����s������9�Kg.~=3�r@���A~�Y�\s
~d���+/��u���n1��m�bhv�[_=��cf���RcNq�^��ib���7����3�����$\����H�>@m�+�;�I����
�8i�mJN}����pM��k9jb�tN�~6�V���W��U���0���NoFsI������}���W5�F���e�_Yv��{u]�{��#�XC��-K���y���o��r�#k�����O�w����:�{X�Rt5��l����k��Wi����x�,yj�����W�}���q+�-�n������_�]�/�<R��:��b���������R����U�/���R_T�\�M�������������R�t��E�~�3�W�������<�>��;��������C�my�m�����g����s�k�m	����*�S�#w��~[9�����3v��w9����!?�pgj�y�)l;V�>;w�3�5���0U����e���O����7��}E}��:�n�����.�5�������D�t�E?l�]����}|-m��Ru�]�k�_R��b����	�Iw���O�����(��1&��|��������]�7�<q��;���r�����e�_\wJ�{�����*'C\��g������w���\���M��-�F�i�����;�����zl�Z���pU�C����}�2����}�9_���9�Z�8�|�:�'�n���/w��)��r����[=�zj�;�.��y@�G��c��|q������/�k��n���|��A`��U��}r�~�Y�mc~�>����|�qX2���7e�����'��uo?���>}b.�Mm����\��V�QS1��qKU���w���y�.�R���b�R��9J�zn�?�.��yI�G�
��ZC���XC�vr��i}E���������wr��i~�=ju���z��!�T���u�����G���%�n�5���:�;���a�-{=;nC_��Z�������a�m���g^����7v������m*���S������ih?�$���I������s~�����%�x���3j��������3�D����������~\�v[J��-2N
�4����(�:Jy�M{�L~�
W�_J������+���s����ZN�z,v9m��i�x������J�KM��e�];�����<v��r��3��1G*s�#r*�
�uS���5�W4���)�r| [��{��������3����������T
��U�/��G������d��`������/}��r��`����=�{������Rb{?C����=B.�C���}������=7`���>4�;Su*q\��>�������$�����-�8��8lJ���~�����R)�������e��23�����%W�j�{��s�N5_�~��Ol}drn�F[����\��T�\����m��i�C{�^��[��k�#?o[��]0z��!m����w9���D��+�3�Z{�]���y�D��W�����riK���I����u���ZF������������G���D�����28��p��e�q�����"�V:3\���s
��qd5o�r�NA���o��r�(��(���������������q�O��?~uf����7���?����$�.���������~Jy�����7�?��yT|���7�ph���[^����=~N;��|x��������N���7�<lc����������|{��}����?���C��j�m��������^�����<��>f���1�
�t�.��}z>�}���o��������y�$��O�/��p"<�����:���&��l�����z���0R���\���S�r9��7�m��0R�������F�F�z���RF�0z�{c�Lj�\�����vPF�0z�+'�I�R�:�'�a��'���
�|���oF��6��a�$W]m���$ui����vPF�0z�{q����gy)q�7��b�H�(�p���O0s���/��?��c!
Z
4n����������E�f������~��zD� ��;��K������ R�����H�]���-D�A�"Q��sR�G��� R��������6,�A�"Q{y�P�\���t6��:�D�e������D� ����W8.�a����M�eG�v6 ����:�d�����&H/�}at�a�
�����{����_��R�W_?����[�\�������� R������*8�_b�HD��r+4�]�����:�D��6*�6�0�D� ��G5�����%6��A$j/���%�G��� R�������%`��F����'�����D� �M���K�T����D� ���\�r|��B��������f�,�}����G���J�%4ky�
"u�����s�` /�A�"���J�6� Zb�HD�Y��8�f-O�A�"���F������ R�t�r�����L�a�n�$[�5J��(-�a�#Qc��J��X�Im��H6e����1��� R����T*cM���B������O����S{_��,zQ�X���<���:�D������o�RH@���Xr��,�A�"QS�:��$l:]b�HD��r�[.3���0R���*G��U�;Zb�HD��6���amXb�HD�G�5�8�O�A�"�Z��>bk�%6��A$�s��h5N�}At�a�}	Y�"�����WO?�~5��4Rs�{.�A�"Qc9e������ R����U��[b�HD���X�f+/�a�.0��W9QM\���)6��A${wJ�X"���:�d3�+����K�� R��Q�q(+F�,�A�"����Eb���)6��A$kS1�6�.�}At�a��	Q����2X�`�����G?J���H��0��:�d3�+qN/�b�HD��r��B�p-�a�nN5�c������ R�lu�H�3c��D� 5�St>a��D� 5���xp�
"u�V��G�V�%6��A${�'�������:�dw��RB��^���������w ��)���~�(j,w.R.
��h�
"u	�c]�[��)6��
���c!�2��Zj�HF��rJRK�'�a�#��p+�6Z���6��a$j/sk�Zu������:�dK�G)������0R�����<�&�����:�d��z��8T,@;�
#u��V9S��:����{�V�:K5Qq��3�R�W_?������
�c��%6�4����\�1�����B�D�f��reHKm )I�p��������@R���E8�.���$�kr]$_XY��6��$\O��^@yRH
A>?](e�����@R�������;�
$� ���\��� HK}_ �cC��t�\e.����z�t�o�����q ����RH
A���#�P��:���B�d��H�$�j�%6�b$k=�&:��FCl)�H6��0!d�.�b�H!F��s�XJ��)6�b$k:2z�g�
#��Z����"<����B�d
�8.��������B����D��
FGSl �wsA�Kt�scj����6��$�d{�����tRH
A����:,BZb�H!F�^vuk�.�a�#Q/;Ur�elD\b�H!F�^v*�]��%6�b${�j��#X�u�
#��^�(yN�h4���B�dK�9
�elD\b�H!F��$�������@:��`Q��JD���K��X|v�B
u�K"����0R������W`���0R������x:d�
#��z�c�j����F
1��K�V
X�j�
#��z��Qm<:����B�d���L*����0R��l!��I�'*8�b�H!F���q����H��H��#�@;f��� {�
#��fc3��#g�
Sl)�H����R�`��F
1�����V[b�H!F��=�P���0R����}`B�B�%6�b$�c�@)$���Kl)�H��LN`-�%6�b$�c�L�kc�)6�b$}S��`�`�
��=	�x�2��>v��w`�?���B�D}��g*��*�v�b�H!F�>v*}_=x�h�
#����)P�^�����B�dk�dj-z,6Zb�H!F�5E<U����%6�b$[S�Q	!b��F
1��)�)����h�
#���	�R�Yb�H!F�7f�����z�
��=	V��{`$}�0J��w-�a�#�|������6���B�d��qx0��Z�H!D����P3��� R�l.v!��Um�
#���b7���+�%6�b$�����"xNm�
#���b�y������ R�t&v��h7L�a�#�L���/9a�Hg{{��TWPK:�\bG����.���$Q�U*��;�Kl)�H�����/	[�/�a�#Q�5��&���)6�b$�c�����Qk)�H��n�R��h�
#�����"�R+XGu�
$� �����9��jKl)�H���k�VS�0���B����8�x\b�lOb�gV)�����������@R�����O%c���6��$�e������wRH
Au�CG�8bS�Im )I���#/-�
����B�D=��2n���6��$�j��(��}<�
$� 	gg�>��9�G�A�"���L1��8ZjI!H��v�=x��b<��������"?�� �����G����0R��������&L�A�"QG���R����5�B$�f;�-��"Sk)�H����K���FSk)�H��>LQ�*�(5�"$�_������ R��w=��a��� R��w=F����5�B$�[���&���Z��������~���fO��� NjI!H��u��8;�r<�
$� ��bG&�%��XjI!H���!Si����Km )I�����*�I�Km )I����?�S�TH
A������+����@R���b�c���xRH
A���:,W_��Km )I<��������6������T)����gG1ep���6��${�c�Kz��(��6��$�ms�r��'���$Qo�}#��wRH
A���q��2�'���$����"����Kl)�H��n���k�N�a�#����8����Kl)�H���N���G���@R����C�x��HgA��'rek��@��.���@R�p�6yv`��F
1����R.`j�F
1����Tb( �Sl)�H6S�01z�
Kl)�H6O��:`��)6�b$����
c��D����#f4=�(6�b$���������B������"M�3����9:����O~x���w?~���//�?���������Yx�����n��>�w����#%
f��jI�a���(�F�p�t�\���j�HE����s�3����F�6�ds������F�6�D�eN�Z�h���6��Q$�-�x�%�!�>��"m�����a�<�3���6�ds�c��*<M�Q��"a{�c#N��yKm�3�����o����wE���=�)D9+��k�p[����g�����gb�
AG�1��!Qs�cx gj� m����[���bcHC���/�������6�DM�>���@'g��!m�Z�czr����������|ZXh��!m	�cp����h��"m�l��cO��C�RE�(#��8��wE���=6%dG��y��Ig�����E7���R*-��������"���%6��1$[�9��,����6�d����BAC��6��Q$j*7G�4"�bcHC���9�:M�Q��"�<ev�]A����8����=�Z�[^.�1��!��GG-2Z/�1��!�}�J59���%�+��?��1!;RU
�0?p�����E7��Wv���+#l��bcHC�y��R�ch��!m��)�Q\���%�����l�r�es�x�;���6�d��{��<x�|��!mI�)Wj\�j�Sli[��hm�8�.���(�F����]]�k�I��F�6�d3E\��*x%�C���F6a�����:�����(e���������:�Yt���\�pu��Qki#H�P�Ki\=-�1��!QC�
���AlicH�P�CK�%b/�1��!aC�0�Y��F���V���X+�)����6�dkjf��1�������!zO!����KlicH6g6P�)�gm�����hH�
�����:�����,e�8�v�%���~�(j'�9�s���sC�����RZ��%6��1$j'��Pt�]XKlicH�N�����.���(��������3_bcHC�W�dr.:pst��!m��&3���C���M.}�U��������l�c�]��,�1��!Y{�R�!cmX��b���[���>�����{�����G7�f'g��}KlicH6;9Qh������6����=��`&�E�&Q;96�
��ZbcHC�vrh�b�X���������+��eKlicH�N����CSlicH��OZ8G�
KlicH��O��a��������>SH�Tv��A��������|���MK|W�,�Q�L�j`~�C�6����R�����F���@�vr�rm�t��F�6�d��Z(pk'��F�6�d��-�\(`����(�F��������F��F�6�d���J�U�����(�F�����E��b�8��"m����F��,�Imi�H��*��o��I}W�c�B�Q*�8�/K}W]�<:R�`�q8��/Km)�JQ��8
)�0Nj�HG�63�H)pC��6��q$k4���
�p����>�d���#g_28�.�q��#Y��4��a&�E�(�5�k��"x0��6��q$k7���"8�-�q��#Y���Q\����6��q$l�Fj)���N�������>e��IM`�����:~���D�������d�N>Km��H�r��U��F�>�d
�H��&�L�Q��"Y�9R����b�HE�fs�P[C�P�b�HE�f������(�G���)���70�F�>�d��1��YAG�Q��"Y�9S,���b�HE�6�*����7�9�T���q	�NjSm��H�����#7l�xRG�8u�s���=�)6��Q$�`'G%��9-�Q��"Q;y��;?���>�D��)x4=d��"}�^��G�	k�E�(��=�Q�K[b�HE���"�P�K.��(�G��I�>��T��h���s	��y��CI��F��R#HA����C79��5��1$�Z.���Kl��H���`$����(�G��k}^����F�>�D}�1��<�E�(��;}���XtE�(��m�/�=�3,�Q��"������R4�F�>��kf�i�xx�?�F���c0��t�c�����ZcHC���B����E�(u�=Sl�a��E�(u��������F�>�D��Fh��%6��Q$�\�I�����%6��Q$�\������G��� Q��-)�24�F�>�D]�1��VyXb�HE����������8:��`���*�(�[�D�C[b�HE��u
�R3���>�D}����F�Kl��H�NH �.�'b��(�G�l��D�sO2N�Q��"�J!�����
Kl��H�RH��z��Q4�F�>�d+�r���)6��Q$[)�Q�<��F�>��+�����FSl��H�N����E�������(�G�l�u����WSk�cH6�:Sq��h��"}��\��%�
C�E�(�����K���5��1$�q]�G��� 6��Q$�q�G������(�G�l�u^*|m��"}�f]�H'�g���(�G�t�u_v��^�6������b~��%�k��G��^w����>�D�������Ym��"}���-���7��F�>�D��6*�'���E�(u�k#�=���F�>�D�kv�JK��i��#}�:�c�a�L_b�HE�6�J.��5��6��q$�a�&xVv\b�HE�6;�ZbS���H:�.�A���I;���fW�P��6��q$�b����[�'�q��#Q;p�b�`>��#}�:�!Wj����F�>�D�������F�>�d3�S�1���,�q��#�\��(%��;��#}�z��F*���!'�q��#Q/��������8���tFvNT�w����F�����~�AA8'�rH�i�%6��Q$�e39�f_M�1��!Q�Q��0����������H`��Qj�#H��X�h��C�u�>`���C�u�\T,��ZcHC��u��G�CCk�cH���\0l(�ZcHC�n�������5���|X7��J����qB(e,�>��#}��]�\��?��#}	�]{�5���Im��H6��G�"�RG�8����BN
[�����>�D������<����>�D�0���C���6��q$�{�#����X'�q��#���9�Z@#��6��q$�f�(������H:Gx{�S�?��^���+x:��6��q$|���\���#}�����r��h��#}�:�9�N�Im��H�NG_5b��Im��H�.vl�j*`]��6��q$�h�H�%���%6��Q$�g7O960-{��"}�V���N�{Kl��HAUl�	�9��6���W�����e�F��6b��#}�z�������GKl��H87�j�pI���(�G�lf��V
8�-�Q��"���1������(�G�lVv^j*`��E�(��&}��)6��Q$��:�����b�HE���T�����b�HE����(z��?K�A����Mx���??����?�����~~x�������<,��(s�������g�����9R��xw�RE�(���E�|Kmi�H6M�s|��Nj�HE��2s��=���Kmi�H6E�}��2X���6��Q$j/�h\��h��"m����9���aFj�HE��2�L���M�'�Q��"����*\�=���8Rg�I�G�V�"V'�]Qt�a�m
Q�J��2x���UG?�n��A�50�b��!m�����0������l�>��rYbcHC��r��V�\bcHC��r���1Ci��!m���ch�	��~��!m���n1������������p��Q��(�f��f�r��KD���6��Q$;�B�60z�����{lJ��U>Sv���^����g�����Q��OSmi�H�T��Jv��%6��1$j*7O)d�L�C���VvL9����<��"m��s�X4���Ski#H�T��W1#`��!m	��=P�`��Qj�[^�?�T[��\����6�dsf��(�C�����b"/�]1t�a�-	���R.>cV��UG?�n��O�XT���C���O�X�I�pbcHC���u���9�)6��1$��<���`�bcHC����
d������F�tvr�x���5��-�ds�}��2z�f��"m������Es��~��"m������O�1��!Yk�{��0L�]1t�a�-	Q�r��j��^��������vr)�-,tZbcHC�v�Z
�,�1��!Q;�x���C�������<����lj� m	��c=�\�OClikes�����%6��1$[G�QI.�C�C��=6�����%6��1$�/����XbcHC�!}
�B�����w����=6$d)cbW���K|W�,�Q�LN���dh��!m����P��o_bcHC�fr���k	Z��������WD�e0�}��"mA����R�`��%6��1${J��h.�1��!���c�3�JZbcHC����*3~��AlicH6�1�0���)6��1$kq���t�)�+��?��%!JY�CRbp��w����es����<c����6�D����m����KlicH:;y��Mh�;�F��	E�N��c<fG.�1��!����B��H<�F�6�D������0���������R�`��%6��1$[��Sn���l��!m�����kX�������~�Z��<�%�+��?��!!u������-�]u���FQ3�������KlicH�L�Kf)�b�H�` j&����+�_j�HE�vr�\���F�6�do�-�<s���'�Q��"QS��0h"x���6��Q$[��f�-�
��F�6�d����V�;��"m����D.x�5��6��Q$kV�F��F�K}W�c�B�Q��'�v�T�UW?���5�#xp��6�v����*�����6��q$j3s+�"Z���6��q$k4�H!7xY>���>�d����N>��#}���m���r����>�d���TrD9Zj�HG��sM�`��6���>�dsl�a����%6��Q$k�G���Y'�]qt�a��i��3�h�,�]u6�.���Z���\l��|RG�8���#��]Q�F�>�d
�H%�&�L�Q��"Y�9�[B�8x��"}�����[b�HE�V3e��5�Kl��H�hN����b�HE���}��t��ZcHC�&s��BE3���(�G��}@cFF����O�����G�O+��Nj�HG��u�K9Zj�HG��u���a����F�>�D���)�
NjKl��H��Nc�>b���C����#�C���E�(��B������ 6��Q${w���.�0���(�G�l��>��fG�1��!�3��\���8:{d<�����Q��5aj�!}�:����,x��F�>�D}�26�R���%6��Q$�[�L>�n�E�(������Ul���F�>�D��>I�7��F�>�D������x��F�>�do��\k�.�Q��"����8$0+d��"}I��*�|ep�?�����Q0]���c����F�%6��Q$�^{O�1����F�>�D�k��K��E�(u����\��-�Q��"Q��/5V���E�(u�;�sc�)6��Q$�^�P�5�z�%6��Q$�^�P�cp\tE�(u���R��g���(�G���j=�	��s�Al��H��SW�t�s_�{���5��1$�]�H�=Xt��"}�z�)Q)�?��F�>�d+��q_"X�h��"}�V	��k�/�Q��"Q��OR��78,�Q��"��!=`�����F�>�dk�d���o`��"}���2T���%6��Q$]5�����|Sl��H������E���\
t���(�G�l��H����M�Q��"Q�:x��"�-�Q��"Q�:8���<�%6��Q$�y���9$��E�(���.���`l6�F�>�d3����X�q��"}�f^g�\�s�Sl��H6��/=�g�)6��Q$�y��Z<�7,�qt�#�����*iI��S
�����8������8�N�Q��"Q��]_�9p[z��#}�:�5P��_/�Q��"Q�F�����%6��Q$�`��%:��%6��Q$�`�I��J�E�(u��N�B��5��1$�_w.Z��}�Kl��H���h�&<N�Qt���3���/�^G��1z��Im��H���P�����6��q$�<�V�c�'�q��#�l�T�/=��#}��`�L.�
+Zj�HG�v(�j�9.�q��#Q;:��r��'�q��#Q;p�X�b����8�����b������6��q$���<5��b"'��t�+�1�35��x�|�D1��l�b�HE�~6�u|	���Qk�cH6�\|G�1��!Q�sQXzvj�!}�z�cl7��R#HA���Y��!�Qk�cH��CK�#��5��1$�Zw.BJpD=���>�Dk&N��V�Qk�cH��>�Ph����(:g�a����es�3������6��q$[�������Oj�HG����P��}=�F�>�Dk�%�@�E�(���.�\�
-[<���>�d�_�H�}F��j�HG���%����Nj�HG�����6b4�F�>�d+`�H1���'�q��#���q�,%�zGSm$�{�`��S%>Kz��������(�G����}�`'{��#}�:�>U���y�'�q��#���q�G�`���8��������s��(�G���=nk��^X����>�d3�c�����RG�8��[!�}�f�%6��Q$�e7G!���%6��Q$]
�Q�R[b������_���.R���Nj�HG����P<X~v��"}�fd3��}�1��!�J��B��MhKl��H���G�)6��Q$[�)f�0E�Q��"Q�:T��%0��b�HE����
��Kl��H���'�
X���5��1$�]����
^2�������^�������������Ooy�����7�?X}��]�y���`#���z�Y��lij�\k`��RD� ��M��h����� R�lz��^���]j�HD����'���'�A�"���P
,�pRD� ���v��o���� R�l��q��x��9�
"e���v�<��B<�
"eI�����@5��6�O�`�T�����'��?��7!�����5amX�{��g���e7��O-n7���2�d�Gs�@�_bCHB����j��bCHB��6x�
`y�)6��!$[0z�]$03p�
!e����TD����5��$[&�03�%��R��t��17y�"�)6��Y3�����"X�u�
"e	��3x��I}O�c'B87�RK-`��������E������Z�Kl)CH�js�mZH@�6r��j��8����2�Dm����Ar�
!e���5��&c��@��F.������ R��ld�hh�
"e�j�3��|��^�B���n9�����R���6H�=x�f��	��{�C��S�r�L$��{��g���������y��R��l.r��ODL�!�!�\�J9&�$�B���E�T����bCHB�������B�Sl)CH:���5��j�� R�,����"�X��
"e�f#�H������2�d3�<�@�q�
!e��
�R�s����:���^�(deT�	`2��S??�^5�;!���)6��!$����()c6�B�5�K%v���w�
!e��#�	�bq�B�6����j��)6��������r��}EKl)CH�Pf�qTs!��R����D9���Kl)CH6E�����p�
!e�F��)���xl��	��{�C�B��k�VMS{O��,�P�B�����a/`�
!e�Z�}���50��bCHB�rX����-�!�!ay���1k�
"e��-��j����R���-'�s7���R��ly�F-�4��2�d������F��R��l^���a��%6��!$����c8/� �'��?��!
Y�����P1������e��=%���R��lr%N
X��R����\2��f�ZCH�\"j �@��e����2�D
������9���2�D
�������B���;!y0/l�
!e����K���'��R���I�>�8�[bCHB�;��\��
���B�����
�=����S|O��,zQ�B�_?��Kl)CH�B�CK���M�A�l(�����T�N�A�"Y9�'$��Im)�H�����}g��� R�����RL�R?�
"e�������� Zj�HD�T�z��Im)�H6E�8J�5'�A�"Y�*J>U,�?��	��{�K�:I})��~���z�y�����5R�
����6�������=%�
L�Yj�HF���O�E���Im��H�^����\�/�a�#Y��/�8����Nj�HF�s)=h�`����0R������1�Oj�HF�6s`j�����0R��lBm��������:�d�������������=v+���q3Z��#��{�k�U�V�y��F3�J��b����:�d��H��I�Kl��H�f�\p.8DCl��H�d��r����D� ���3�VJ�ZCHB�9��j�`��%6��A$k.� ����� R�l�\x��D� ���#�>E�6�D� �v�����Sl�K�s��D��{
^�-�a�#Y��J����Nj�HF��u*����Kl��H��N�\��V�� R��k�2��
x;�D� ����Z�[/�A�"�+Q�-��M[b�HD��"$���^�D� �-��)�
�cXb�HD��(D��5�Fg����T)���uI�Bq�q�
"u�����sf�)6��A$�Yw.�k�}MKl��H��.�^��Xb�HD��usBbp�c�
"u�z�}p�=X��Kl��H��\�^L���:�d����[9>j
!u���4�y�0^b�HD�E����`��%6���|�<|��u�|��x���:�Dk���^����:�Dk�TSl �Sl��H���������l�
"u�:�>�R0�s�
"u��fj\�m�%6��A$�X��s��]b�HD�����sk�Xb�HD������S��� R��]iL������0:��`���*�(�Yg&�-amXb�HD��u
���_b�HD��Aqp���Kl��H�2H&.��M�A�"�� ��c���D� ��R��&�.�A�"�� �*g� �D� ����Xro�
"u�V�]	 DSl��H�2H��Zto�
�3��r�T��Hz�!P�\`��D� ����sG�n\b�HD�y�����	�%6��A$�g��{�`\b�HD��usbc���D� �����W�Kl��H6�������� R�l�u#W����R��l�uZB����)6��A$�e])���DSl��G�r���Z�������a��0R���g]3����5��!$�X�1�p�����:�D�:2�,����:�D���9���Kl��H����BL
��� R��c=��=hxN�A�"Q��2��(DSl��H���\��:�b�HD��u_���0��� :���`�O4������rM`M���0R���c����84W�
#u���!'j)'�,:�
#u�������r��]j�HF����������%6��A$�\_�4a�
"u��Z�@��&9.�a�#Q�:�H�f��D� ���n�\���]j�HF��u�H.44Zj�LOb#�g.�{��es��u8�Oi�
"u���L.�8���:�D���7����B����������5��!$�YF�
���A���;���Qk�CH���X�&���:�D}��*��?j
!u���c`qp���:����1�x0�qj
�3�����zQ��IA�g���Im��H��ue��D�N��6��a$[�:U�����Im��H����P���yKl��H����k	-�����:�d+Y����D� �d��kk:����:�dkY�@�%�����0R��l~u��J

3�Nj�HF��;�RBC��6���J�c|�gI��J�y�^���0R��������]���0R����=J���UqRF�0���s"�����0R��l�u�TZ��]�Km��H6���>���
�h�
#u���nTk��� R�l��s��zWSm��H6��1����TF�0��q���h��h�
�s��}�6�J
dhj
!u���}���h�
"u�����DKl��H��L���y�Kl��H��u�V�
�Sl��H�����x�h�
"u�����Z���Sk�CH���R��� R��c����80��b�HD�U�+����Z�g���#K����&�?�����������z����??�������{���-����o��w����#%m�����`���6��Q$[{zpQb��RE�(�-?�2J�TE�(���}���6�F�6�dS���h�C���C#����y?Kmi�H6!z.-3XLx��"m��C'&�k���6��Q$]�:%
��7����:�OtB�*���-�]1t�a�M
Q�j1-x�t�����E7���`��%p�k��!m����X�\p������l���Ep`f�C������^�����6�d�E��3X:j��!m���f
��1�AlicH�P4���x� 6��1$]%�����V�E�L�ZN�]E���(�F��@��3x��R�E������eb����K|W�,�Q�Rn��ebl����6�D-�V(D�������6�d3�]!9�����(�F����'�V"��ZbcHC�����	��`��"m	Wn�\�P@Gi��"m	��S.]�M�Q�m�-{|��e;'02�bcHC�y��Rm�MKlicHv_�v,b�Z��b�������:��N�]u���F�<�:��k������l�r#n>�9�SlicH6O�RL��M�1��!�<�����rZbcHC�y��Bl���)6��1$��\��
�J,�Q�mq$��\(�c��Yj�HE��r_i��^=��"m���{����}��������������w����=�%D)��8D/������g����r��s����5��$j(&W����%6��1$j(w,"�{Ski#H�N�T��[7M��� a3���NKliie�G�Ts��l����6�d�iz*-�n-�1��!�����2\bcHC����Jq���C�
����cki,�]1t�a��Y���"8�L�]u���FQ+���g0g��!m�Z�i\���������������x�tC������8�ZcH[H"{!SJ�a-�1��!�KQ��Ag��!m��@��!�>G��� ���L%8�BSlicH6�1QNkZ#HA���o8���C�������������������9��j`��%6��1$���#�R���)6��1$������������D�H��|�������������,�:���6�D�����"YbcHC�Vr��9��KlicH�����apm����6�d���/a���5��$��������C�������=9���xK|W�,�Q�J�l+��EKlicH�J�L�7q��(�6����/�8�
B��F�6�d�dW(F)Zj�HE����B�U�
KlicH�P�)�����Imi�H�v]�"���7pRE�(��;������Nj�HE��j����Eb��!m�U�Q-��l�����{lN�zI�����������yt�����)�&w���������}�G|__c��Im��H�`��������Im��H�b�\
4v��8������B_#�r����>�d�f(q�kSl��H�6b�T��Q����>�d��(6�w���8����������@�h��#}�����o�x��w����=6.�}����\@�r�����w	��'r}E-����{_b�HE��s��r���%6��Q$k7w0B��%6��Q$k6GJ��c�Al��H�j�z��E�(���,���F�>�d��H�S�g���(�G����C���M��������L);���%6��Q$�^�I��u���8:�&�|�����R���&'�q��#Y��b�-��6��q$�_�J�:��a��"}����QL1b��E�(��S�Pb���%6��Q$�_'O�%�"���(�G������m��Kl��H���4����Kl��H�PZ��Zzs��"}I��dr�9l��������#�*�P��.�J�����(�G��]�Z0�aj�!}�z�%SK<���F�>�D���(9����(�G��w]{��*X�u��"}�z�cx�	��{��"}�z�_\/�Q��"��6s_u%R4�F�>�d��F3���(�G�t��>M�����Gg����/����|�����(�G��w�=e�"��)6��Q$�^{�Z��� Sl��H�����w�q��"}��������F�>�doC���E�Kl��H���`����Y��(�G��{�')��_b�HE���^��,�Q��"���<��x|}G�:�q�t���s���E�(u�S���+�-�Q��"��!�8����b�HE�uC���9j�!}IW
)�8�M�Q��"��!��g4*�b�HE�UC�8N�Q��"��!�J�E�(��{�\��3G�1��!��!�[����N�b[~�+]Ds���S��F�>�ds��R2��?�F�>�ds�3��h��E�(�����+xHj�!}�f\gj����F�>�d3���EG�1��!�|�1�D���E�(���.�����Sl��H6�������~��"}I�[7J);lD\b��\Gb�	?�5���5�@.g����6��q${W�k���]�Km��H��f�sB�R-�q��#Q��9���q��"}�:�c|	)D0=f��#}�z�����J��F�>�D]��F	����b�HE�.v�gV+^b�HE�.v�E���VSl��H���T,`��%6��u$h�=��"�����|���8������	D{'�q��#��Z���,�����>�D]�P���`��Im��H���QL�!���8�����Z�j'��6��q$��]yn���Im��H6#;9������>�D��P=�#6(����>�����\!-��t�+�1�3���h^v��=��=�F�>�D�lG-�C�Qj�#H6��CG�1��!Q�-�<
�1��!�L�>�x|�6
)$H���#K�`���C�����Q���5��1$�Y���+�T6���>�D����Ai���G��\�i�Sk����n�O���Y��jt`6�Im��H6�:�>�x�P�Im��H��>'Fw���8���l�53y�l\b�HE�9��)�R����6��q$�s�����kOj�HG��u�q����im��#}�����������>�ds����r���zRG�8�����s�,�}RI�H�
{��gI?��B5���l'�q��#�{�,�r����>�ds�s"WJ�8:��#}������z��TG�8���1D���hOj�HG��6{�������(�G�����\�{Kl��H��n�7��\b�HE�^v�c��C���[�/��Kl�urA�t��yr!����6��q$��](���yu��"}	�d��{Kh��Ql��H6#{\�2�*2�F�>�d3�=����Kl��H6�Sv�a$/�Q��"�llb�C4���>�d3�{��*xU�E�(��&�">�F�>����9f��)~�����Ex���??����?�����~~x�������,�e���/	�}�����G?J��=U�Z�|�
"e	�G{j
-N=���2�dS����*��zRD� ��MC�"5���RD� �M�.�bv	k�Im)�H�>ul�C�'�A�"Q[�c�P���%6��!$�)��E�.��� R������Y���9��6���}�G&.�{vR�D�������q����%��~~�(j){�xK�B���T����Y�$����

&�����j0f"{��L2�������X$�2�hH�zEdeA�����y��PNJ �p�����#���GH�|�!a����M��A�	C��N��%U��C�	C��L�TD����+B�b����d2��$V��!�j%Oc�+�&V��!�l$w.\(����"a�s�s%W
:����0�x�`�w��r<�����-v"x#���k��;�o����ys����Mq�Z!��\*e_��bEHB�VrumQ�1+r�*@��������cC�	C��Ls�"�W��ZH@��-���+P�X�w��D����+D����U[���!V��!����)&S�6�"$!�m�J5gp>=������-�!x�T���
1����W������|�Dh+B���En��V4�f+B���E�d�����Vo&r!oJ�,V��!��������	MbEHB����L�h��Y�	[�f"�@�f��X�o&r6�����X�oF��h3X)c�!a�.%W����:���.+dm�H.�G������*z��Bn�+�`�j�!a�Z�-�����f�!a���-�X�^q5���0�XM���U1��X����BK���2�
��9-�]'���|�X�o}CG>;���!V��!�{4��w�
bEHB����B���~�!a�����XR�0�o	��[�C�B(�^l5����W���&r@l.��LbEHB�&r,�p+k�!a������+��+B�b6�c?�f�������%����	{C�	C��~�H)n��bEHB�y��
��d�
�0�x�5����|�X�oFQ�-��<���0�x]�D!9�.��B����`����u9c�j�o����9
��(���I�+B�b5���l=�f�"$!f��SC���$V���&�������5�!a�Z��Q�L�bEHB�r���0���0�XM�F�q��;���0�x��8r�b&��U���{���Z^.<k a���{J��wd
�-!t�a�=�����=x���R?_E/��}2x�+B�b6�;�Wl�b�HX(`5�}�����C�	���Bv}�����G�B$"��iS�hL�l��Z!��l������Q�	���8]�TK
�yT+D� �=�Z"e-8�j�HD�	j����
�B$"^��r�U0
�-At�a�}	^'���b�
�-��u�"�{�R�1`���V���$���O���1��j�HF���B6��iC�����\��-�<��b$#^{�L��c��V��a�[��P4����Y��������'�Qop�#q1��.k���j�HF�&���j�b��V��a��}�@�_S
b4�o	��[�Up������8�����G~-�C���k�5`��Z1���L)$�Z�!V��A�k2�6{�I�����bn�%:��X!os��4�y+D� �5�Cw�
�$V��A�k/7.|�X�X!���(��!u�"q�Z�m�SJ�#�$V��A��T��\�X4��/�I���t��t	zt����V��a��Z;O6[��Z1��
���X!�o����V���+D� b����g�3�+D� b���l��z�!V��A�{j.��5�X!�u���� D�X!o)4G�$�E�!V��A�}��Q��`�p����f=V�!�o�3yo383��
�8�X]��V�b�HD���E1�B$"V��X�9��Y�������#T�y�"q�z�9P�����U��!��X�D�Z���!V��A�{}f����L�!V��A�[2�/�,x�+D� �.����
��:�����u0Y�w�X��V���6�,V��A�{��#�l���+D� bu�&;����V��_�|�"����8�X��Y��/�B$"V��q��q��9�
�8�X�jg�0K�*B�bu�;58���Y�������\$07x�*B���#�Rr5�Mb��D?��U�p"�W�e���!V��A��U�@!g0�B$"V�:�z,�>�
�8�X����$�$����8�x�����%���$V��A�[$��.��h+D� ���f�!��fC�����H��c���+D� ��(����B$"�z ��u�h+F'����X��p:��S�1ao`�"q�fWg
���C����7�:Q��v�"q��Wgr<�8k!q��Wg���Mb�HD����0�k5�B$"���6��)��b�HD��u[�;�~�Y��C�7�:Q�)�I��X!w�u�X�s������XBs��6D�����P+F�0bu�k��C��Y��������B�y�"q�:�5���mb�HD��u��Mw��X!�g]*c6��B$"V��q�X�X!�g]#���H4�
�8�X]�\z��+D� bv�9�ob��D?bC���\�xN�:�D�Y���Z1��k�C&����\��V��a��[{g������Z1��s��'[#x��Q��������S�����V��a��^��)��L��V��a��s]K��<�T+F�0����S��H�Q�������)�I�b�8�#qq�^74BHL�j�DOb�_��������K7�f�B$"V�P5�a���U��!��`7,<x��A�����nT8a��V��o�X�� U����X��b�Q�k!q�����&�A�i!q�:�=�����V��K�#K����!q1;��LRE������{�>�����b��i��Z1�o�u��4���8������26�>�#q��W[K�����G�b$#���F����hC����7��2�hj�HF��u��$��&�b$#����|
�h�#q��W�6i�A;�#q1���E2����Q� �	�F��R�9=l,��
���b$#��K"g+��xT+F�0b��mT�\���8�X}lkk[����C��������R���j�HF�>v���spm�I��������L��i�!V��A�]�:F���?f�B$"V��}�0�"q1���'2����!V�N`����V1������b$#��H�pg��U��!���M�����!V��A���������Y����7��q��8�b�HD����R	��h+D� ����db
��h+D� ����#TD!��
�8�X=��F(+�+D� b�������g��1�;K�^���w_�~{���w������'�>���|�f2���V�w���@[y�o����YMek#��;��j�HD�	�&��b�B]C�	��7�9r��Q:�"a1'C��k�f�B$"V[�ZO��
F��V��A�j+����GO��B$"V[�O�gp���V��A�j+��R�/�>�"a1�����<vT+F�?V����u���G�-At�a��	V�R���r�����*z��Vv�J��r~+B�b5�9T�a����0�X-eg�:^�2���0�X
�XB�|�X���<MoR���!V��!�j&w*����~�!a�Z�mzcX\|�*@�b��[`I�TxE6�"a���\�2��1�
�0�x�����1���P�D����`��x���K�!��~��^d���%[�1���0�Xm���U��6�"$!V9g*��e��X���������C�	C��F���M<u<���0�Xm�R{Z�:���0�����/y��h+D�V���S��T��a�!a�f7z���E��X��6H�6C��[�����Q��-��	\�����*z�7�P�<q�*@���C.���d
�"$!�j����	Ch�!a��!�9���"����0�X
d�)�&��"$!�:�����m�B$lQ�[��x*�4�}V+D� b�D�TB��8�"a�&���Ok�!a�ZS�JF���-!t�a��V������C|K�|��i$�D�����!V��!�j$��R����Vwr��ambEHB�6r����X�X����=�d#6b�H������J%����X�o�LK������X�o�����\�
�"$!V9T��Fl bEHB�[ �r, B���:���./d�j
��e�R?_E/�Z���G��ZH@��4I	���X����F����0bEHB�r�B�MC�	���^Sk(�V<h aq�������X�w��T���C�	C�79����f�!a�&��~������X�������hJ�,�%�?l��Y��mEOB��[����EV�p>��|+B�b��[`�m�����0��-���Z(l�=�
����7��N%����X����
���Z�C�	C��D��r�h��Y�	C��D��lL��l�!a���qTRr`$����0�x��*���bEHB����R��X:ko	��[�B�N�M?�k�b������*z��r[��"4�!aq�C��%��P�X!
x�!�Jmp�d�
�0�XMdW"�z��V����Q�5���Z!��l�'c�����Z!oi�l�8V�:�"a�N���A����0�x����]���G�B$"^{��q��h�o	��[�H�zH�����D�����:z��N���ZK��NG�b$�'y-�L��^�7���8�x/���BBkl���8�x�e����'=�#q������������8�x������l?�#q����OXDb�HD���m���u�Q�����dN�l2���Z1���9S+6�������-�*���d([�}������qp����$�������8�x��@�����C�����f�=%��[��X!���&���<�"q1[�d�	�r|+D� ��`�TJ�t
�B$"^���P�0)q+D� ����\�����b�HD��r.��o��
�8��}�^���h+F'^$�%>����Z�H!z�oj�HF��uq�s���z�#q����PL�Gb�HD��u���K$RH@��u��1�N�Y��������B1�
e+D� �����!��h+D� ���R�`��
�8�xK���[,�B$"����RA/�b����Z��C�:G
!VpV6�"q�����`�m�"q�z���K	y�"q�z��P��aC�+D� b��s�P�
�B$"V���P����!V��A��W��b+8�b�HD���Vr��
�B$"�r�-�o�9Q+D� ���V���G7����3�i���g��=��X!����g�[lPb�HD����m���\D�X!�g��Kt�`��+D� b��[p�)a�p�*B�bu��$��b�Y������v�|���C�������T���!V��A��X�����b�HD���Y�.8Mb��D?���p"�c�yk���!V��A��X�D&�
^��
�8�X����@�j+D� ��R�dn��B$"�� ,�9�
�8�x��d*>�G�g�B$"�� �Ru��C�����*H.�:�N�,V��A�[�Q.]��b�HD��A"�i�c�,V�N�#x��c����Y�^��:�hb�HD�Y��j-`Q�!V��A��e�(��b�HD�Y��LNLL��
�8�x����V�b�HD�y�=��
��f�B$"�<�\\0`��,V��A��g����Y����7����3<���
�8����{�"6�����>���+�9�j���EG�b$#V��f
�G��b�HD��uI����+D� bu��'��+�g�"$!V��8���S�!V��A��W���L-�C������.��
`]�!V��A��W�J!�N�g�B$"V��Ms��`�!V��A��W���*xv�����4���X70���i��Z1��g�M�u��L<�#q���>9�)����j�HF������Y�j�HF����l0�

C��������P()`��Z1��L�d<��Q�������S��c,���8�xs���T
Z!}�#q1����6��[��
����"�+����{M�����
�8�X]l�����U��!��`7,�u��V��{�#K��8h!q�:�
��
��"$!V��a����"$!V������� U����U��b3x���U��!��S���e���A��C�����%U0���U�Nx{X/���E�<k��8,C<�
�8�xkYK���
gG�b$#�j�S!=����g�b$#�z��P���u��Z1�o���Sp(F�Z1�oMk�)��z�C���������J���zT+F�0��k�9���V��a��e��^�x����V��a�]��yr�V4�j���g������b��O�g0-��V��a��c�E|0&�>�P+F�0���N����Z��V��a��c[O�MRH@�����o�.0�z�#q�f\�D�4Ym�#q�f]�L�0ao+D� b��k �\�B�+D� bu�k�����<�
�8����j)�T�X4��S����;t��D���Z;C������u�h*x��+D� ��rm���P4�
�8�X]ko����b�HD��u�������8���[S5���,V��A��Y�IN2��b�HD���wd�K��B$"V���P����i�$V��A��Y72J5���k����eo����/o�������?y�����w�^�{39|W�)����U5�����:�*���P��J	��i�� Y������*0kl�� Y�Z���K�����b%HA�>r�d\���4�J�,�Xm�j�g�\�Y��"��C����s3�J�,����K���	C��"��������g�$� �t�L!F���+C�l=^C3yJ����G�
1t�a�
^�l�R+��
u�Ut#o1hC.Gpk�� Y���0�M`5�Y��"��t+'h+A����l�{k�*>�X	�Eo��V@�� Uzd��[��P���
g�$� �R����b%HA�U���d��G�.V�d2��q�bx�,V�d�[��Y2����g�
1t�a���8�+�\F�Q}C}��j�b):���Q��b����qTbE���J�,��s��G��$� ���@6x��A������>��l�	dx+A�b��K��<X$w�� Y1��-��<�"beH���������"�+A���d4�S��$� ���B�'t�a�A���~��R����s<�7��W���Y���Gk�$� ���B�[4�� Y�f7(���!V�d��y\(,���#�7������XC��"�;��
M����beH���7���66��N�f�2$�!��.�5�/4:��!Y��Er%Fxt+A����"���R�C|C~�b��������6�
u�ut"�}�{&����V����y���I	�.
�$� V�8%2m
NUf�$� V����h��C��"��<���0�x��!Y�Y��o�*:W��$� ���L�:l����,~x�($��[�
C��"��6nP��T�!V�d��������<�!�!�?l������_3���P7_E'���&�T8��b%HA��q(��G��Y��"��8n��9�+�Y��"��8�s�\���!V�dMFxVd��9�`�,V�d�{�M �l�(b%HA��/��t�*?����7��V0u+A����m�R�{C��"�u!�*%�"8���7D���-�x�T��h�
u�Ut"o��'�m��Y��"�7��S���7�J�,��3�c�`��+C�����~�}4X�X	�E�q�+��n��$� V��;�!l�?�J�,�X�co�fk�88�J�,�xk�82.0�b%HA��vZX1<�>�J�,�xw���&��
�
t�a�������������DV���&�7>�$� f���aK�@�X�X�c9W��P+C��5�M&�|���V�d1�{�llT�z7G�2$�!V����m�X0<��!Y�V���Jq��
�2$�!�����kK-��<��!Y����D����e�Z���9�b���b�����:���f����"6��7������f���d�X�:��"q�j(O��n��R$�"���B%W+x4��V��Q�k*�@�����V��Q�k+�6�1`a�!V��1�k+�B%���G�R$�"^c99*-����V��Q�k-[K�90���V��Q����)�RA��Z)�F��Yeg�����:����'��Em^��vT�PW��78n���T���������4���e�-�2���4�x�eO�����X�����g���Y�Ic��Vn�S0�T�beHC��r ����$V��1�k)���
xy��!i��
�h�m�Y�Ic�7��������X���W����!LQ+E�}��?�XF�S�l%S��!V��1��T�B9��z&�R$�"V�:g�>�	�X���W�B�s��^�,V��1��U�J!����!V��1��U��[%a^�+C�������)co`��!i����)��f�2$�!�Rym������X�������P/�;b��DF���;���#�kge�X���W�
�P6+beHC�Nu�":f3�2$�!V��aaJ3@�X���S�����MbeHC�Nujvo���,V��1��T�L.���+C���M�
O)�;fC�Ic��2��\����!V��1�]��P,\��Rt";�K�:��S
1`��+C�bu����R�feC�Ic���nX�j�C�Ic�����%e�9�C�Ic����������X���S�����i�!V��1��T����T�2$�!V��Oqr��!V��1��T���������4��o>k�����f�Rt�~X��w�T'O�:pF4���4�X���(���8���4�X���)X��l��!i�V���ro�beHC�Nu-1��q<���4�X��6��)`&��U���[�����c5��!i���-����<�!V��1��S�Ir���+�Y�Ic��F�D!0m����v#X`��.`���} �M���+C����N�J��~�,V��1��Q�������Y�Ic�7��-�L�7��$V��1��Q�(��t+C����nK-c<�MbeHC��-��
^�2���4�x3��'�U�X���S���<�X��wFu��:�L�!V�~�����u�3�Sm}�w����V��Q��U�J�d�^�!V��1�{�b�Rc�2�beHC�^u1\}�!V��1��U���}�!V��1��U����o2beHC�u����+C�b��{hq`a�Y�I#���.����=4���4������X���Y����hi0a���
������C�I���������C��V��Q��U*�"��:�J�4�X�j�3fv�J�4�X�j�,���WpT+E�(b���dST�J�4�X����g���+C�bu�C�b�`!��Z)�Fo�����`����Z)�Fw�u��M��i5���o;����?�5��P���a��!i�:����N��U����Z7*L/���J�4�X�FEB�|�Z%HA�nu�"�.)Z%HA�Nu��9�M�f�$� V��Q�X�q�*A�b��{\��u�$� V����2�&�$� fo�G����
�2�[S�D�X���K��96�?��"i�����\�hQ��V��Q��S�"�T��6�J�4�xkU�����1�J�4�x�U��bs�EG�R$�"��j�D������4�x�U�H�����P+E�(��X�,�l�]��Z)�FoN��=��s��V��Q��S������Y�G�rtbvN~�����RBs��j�HE��u�.�d0��V��Q��Y]����X���smk��$0?��V��Q��\�6[)���Z)�Fo����l���6�J�4�x��M�Z<x��Q�I�������3t>g�2$�!V��
6�o`��!i���6%�n�Y����@��w�Z[k��F�R$�"�*������!V��1��Y{C%���!V��1�[������j��!i���n����q<���4�X�j�)9�<���4�X��Z�";���4�X�j�(g��y�,V��1��U�ir���C�Ic������`��!^H�/����<H����w?�?D���_�����������>��?������������0������wo����W��N?�����v��7��/���h�����O�����?�eNN>~����~��^S2���?�L���k
��������fz���O�����wO�|x�������?����w����?��������������������=��������?���<�/������������==������������g���������{���������{~��^����{q�a/�y���{y�a/�?��={u�a��?�����r���������}���?�������?�����o�������4����Oo?�|7~������������?����������������3~z��������w~~�����w�?m����8�	��q�h��l�E�5��6Q��.��l!���=A*�����_�y��{�����=��yO�y��{�����=��y��y��{�����=��y��y��{��������y/�y��{��������y/�y��{��������y�B���g	w<�����8���������}wb����0��o�������\������������;g/�|����������w��+y3g>2����V~'v��Z� ��/w��lt�!yuC����}������'?�k��_D4���>�i��W��/x���/������"���q#x���A^�����?�?���/W�d(7y�
���^h��l���3���9�z��@��L���hcC��O���<�]���e�&��ZRA�����;:Pu1���O��)i'�x:��;Rc�#���[���?Y��`��,%-��]�0��d�/y;�����'��
,������7����]�{�B��1�I���K-�����}=.V��7�O6��j�\}J��
�����������R
��]�E�/x;}:Xm��'��-l/�E��W���,i`i�����;-�������ic���y��5V�<����
�w����Q�f_	�!v��L�y+�T2��cb�<�(m�Z+���xaV���6���v����?����pWs4�724��u��������){���I����}�&Dtq_r���n��J9P��cN�$�����m����;7y�L���y�$'*������������I�{���x��M�7��
N�F�����29���CW�vre�f="#�j�I�$����H[
8�t����T��4�'��
&��]����
X���w^W�D�8~"]��l+�\O�<��|1��aR_I�f=�[B��CG�I������������{���X��`S���`�\
�%��;�~����M���d�b���.��}���R�U_o1wX2��m��26�M�+	����kMhe�M���-\G�Ut���;����mX�`
^W����{����OW�x�#m�<�����E���I�s��:�������/����	7�$��{-.7k	
[��l�]�;��H�.o(��{����-��/������K`��~���O��,�I�sK%�:�w6vl�#o�XP��;O�m6m
������J"9s!
e�>!�(��}�����q��I��7������9�������Pky��@C)Y��I�sm���L���{O)�#��w�����b"�1w���)�i�G��������d�G��Hc,8�������w�uT]�{���C�z��B���;���G��i�&p�vO��xk��#��K/�_�[�B,�<���%��J�Ua��0�c�V�����������x����bo����m�)��pS����7`�Q���I�f���A*�I�0��J��P��Z�O,�
=�a����.��z���H����'���Q�DmA� ������o�mSUk����'��������;�~
���I�s�\���&h��Si�p��������F;���#�|����x_0�#C�`�B�=�q}O�����
�=}�l��}��V]�w	G&Ztr3���@��V-�v�������'i����M�GrL�A<k��`W��^-���9�6����'�����
����X���;�/P������>���
��<�wo`n���x����F�-�7��%vc����.<(f�S
06v��u��t^4$�z��%�w��=�wo`�5�
��t_�Z���x���<m9���aW��K�Q��%S�D���70^��
�(<����&[�������Y3��6��I�o{B�� �]�s�.�l�a��`���������������	X���;wo���"�����G�FT.���GW_K�FS�'r�����E��;O+|?��R��B���r�7����$�����R/������[]/������|�&����A�wC�����A�o,�=�����~�*A�L$}�c��Jl@1�G�����W����}]���w���5d�������]\�5��3���M���K6�Kg�P������3�h�d�P
��H��C�K���A0��s��/v��>e�S�4lH������B���M��g�.��{":��.��b���$�<�I�����1E&�;w�7�lE_�$�����h[��{l��������?�X�,M?\x��0��L��9�������:x�����}�6���I�w7�����Nx�\�$�i���#��v�	M�?�w��O�ahjzW?P����x\2F�c�o����g��-����4p�{������[U�[������pn�j�K��)��M���Y���1qA]�-F�e
lK�f5O��h�b6;�g�U+����t ���_C��w����s�c���/o�������?y�����w�^�{��~��ZW���O�?�����o|�{�W�o_�>�m=v}K~z��O��/"s���4�������7w����VPS���?n����/l����_~�[\���K����o�z������������������l�������������m����5��s%&~����=�m��7h��K����j�=�5s��<�����-������m�g����yN5>�������/o|-��)��y��\>����B�l��+�7�����j�����7����y���1��;���d�n����gM-6������$�����,X��c��c�?�������dHr�������G])�M��K�>j��`e_[����}�����&c��7_R���ZB��n[9NS�d,X���!������6�l�&o���7�c�����{���M�?/W�=E�j�����'u���H�&C����cjO��d������x(�6�.�n��P�.����JM,m �~�8mM�j(���= ���������L@��4���7o����}[�-���d(X��h�i��bk<�1v�����7
V`�[<���u�Y�2�m��7��T�7������[	m%��X��~���8�_��2���=`�T�]��X�/	�����M[X�`0h��m3�h|icA?N�}r�6f�M���4�����?rZ6;-�XD��L)5�e�?j�_\�����m!�����<����c���;�i*���hvd�&C��`��J���s�[�	6�������e��P���.��EM�G��s����6�+���W5��E�X/���Ppi��7�������b��?jOv��?_��~�+�!,�=as."�M�y����5|j�a�
�/W4��{����"L���������?�V4�8�Wc1����|�mY�����t�E�[���w�%cA�!d��L������X�������c�W������f��������fj�����x���~�M�����M���/�l����Y\������.����\�d~��x��U��n�-��7q�^]���m����j�i�0V�����G�|�E)��	��w�h�hk���~��M4Kq�`������}��:��K6�K?��H�������4�e�Oy�j�l5�i�u�$�K�go.;��m�4/V4���k�E6;�h�>m���������O��h�do�Bn��������L�]����6�����EGv~=�C�����S���6Ae�|����cm$��_�I!Z��ZM�%���1K2y�rl��?_��]	�[�>.�����6C������m���_��f��$o�\���C�9x�}J���m�j��wmL����E�����}c���E�A~=Xs������SO����X�*>���&)�����6���#�9\��6&������o����O�F����M��[�7<j49����[��mx�M��U����6M-1�E^��h8~��kbc>��?w�9�h�S���R[R�6	
�����{�`�rj�]������=d/��e�����Y�)���I^�|�������-KR,��h��l�������MiI�u?���1]�����ss��uYrr�dZ�����mqz�~��/1����I�_�z����^k+������v�%��Uo?����k�)��n���T�����#or ��g�%gK'o��lT�,I+�M����7���6�y��su��f(m���lU����w��%)�����
��)&�6ku�.9a����`�:xB��gS�Y
O�&�h��o�}�B�����Ie�M�u��l�>�Y�(e9=hC����v��v>4h/95�R�q���2��M�79`�tU�mpm=�g�}�a�N�6�g���L��w@�n��T�m��W5?��Bk[48��U�=g�o46�i~���������M���f��U�7�����S��r���y�����^.m��f�5.IAzx�_���V�dl���N�S,���,�;m�e�tU�{6L[��6�-\V?���
����|��O}�Qp�jhX����Y����.z�F��*�{
U������g�4��a
;�V���~�����g�v�t�U�7mlhk�Z��Z	�<XAM����^��
����B{�yH�O����{��6�����SZR�8%�j��.>���M�������CO�K�S/������������`]TW�7�m�U�o��|O�\��
�/�}�m�c<}��`N1m5ld'��pK�����G����x��G���MF�������a��G�3|�����4�i}�M�J�7���nJ���z�������������5o�����);����
���8�9����b�= gk�Mu��Tuy���&y��}��lV����W�����@�m��d��f�e.����zh��p��O�K�z��
-���1��Fn������~�?���9������aM��w&�ny�%3�64��
kZ_}v��B�����_�&��+�oe�����������V���u!�\zv��S%(�j~�vJq��E~R�r�
�ag��ig;@��O �ei��B���{��t�����7�P��-wL�F��{Ij}���)������hl������'�7J�|���5����{q\�Y�Y�U�o15��!���F|�h���*xj0��k]R��T
�d��Z������i�/+P[��^4�W�nr�����������u�I���>�C���U������O
mM�����e�5��U���Ib����U���l�hX����+5~���,I0�~�������j[p��jk�i���m�����e~[sZ��]�X�7:��j����c{�������<�Cx��&g��|$�]t ���������Uy�Y4�i�u��)�\4yQQa��{�c���{��|���/KN��\�IOZ�o���E�q�����7�n���w?����)�E���V7+�y���7r[=,��Y��*����!XS|����$�-<|�[������n���n>��.8�X��������d3(>x+:4�h~���RcC��sIa����*�lU�c
��~���9���a�W����O��YXc�m�����!��R���e�`�F��5�o�Zlk�X���%��)o4-z�����^�����\[������n������
��6�k��~M����lt������lm��O�,Y���`!tlX���m���Mt�$6YW)mtE���_��5�~���k|���yqy����\�&;�(E&��&wu��o5�'k�_��7�������k��������<)�����E���v�qDw�u�&��|-��E��1�e}zy�������>���m��KO��NZ���z�)N��(q[�A�z�5����zr������>�u���Cu�v�e%J6+�����^&#�]����6&n36�k���l�[r��7qm�_�2�x=��yr���>}����Om �zn�����7�~������}��o����������'������?�PK���%�Z!PK_CL�l9�..mimetypePK_CLS��)�%�%TThumbnails/thumbnail.pngPK_CL�����K&Object 2/content.xmlPK_CL�P����6Object 2/styles.xmlPK_CL�A�5g�8Object 2/meta.xmlPK_CL������7:Object 4/content.xmlPK_CL�P����LObject 4/styles.xmlPK_CL�A�5g�NObject 4/meta.xmlPK_CLPConfigurations2/statusbar/PK_CLRPConfigurations2/images/Bitmaps/PK_CL�PConfigurations2/popupmenu/PK_CL�PConfigurations2/progressbar/PK_CLQConfigurations2/toolbar/PK_CL7QConfigurations2/accelerator/PK_CLqQConfigurations2/floater/PK_CL�QConfigurations2/menubar/PK_CL�QConfigurations2/toolpanel/PK_CL��h��Rmanifest.rdfPK_CL��en��TSObject 1/content.xmlPK_CL�P���cObject 1/styles.xmlPK_CL�A�5geObject 1/meta.xmlPK_CL�a�'@��fObject 3/content.xmlPK_CL�P����xObject 3/styles.xmlPK_CL�A�5g{Object 3/meta.xmlPK_CL�mi��&�|meta.xmlPK_CLE�~���,
S~styles.xmlPK_CL
��r�2z�settings.xmlPK_CL����Y-
&�META-INF/manifest.xmlPK_CL���%�Z!��content.xmlPKm �
bench2-dbt3-10gb-duration.pngimage/png; name=bench2-dbt3-10gb-duration.pngDownload
�PNG


IHDR��8�r	pHYs���o�duIDATx���	\TU������ ������)T.a�X�i�eA`aj�O���(����2s�5�RMMC�
Qs�
7pAD�7������:������;�����9��{�;3��L&�����;P���� �A��D	� $@ :H�@t��� �A��D	� $@ :H�@t��� �A��D	� ���b�
V633stt�����	F�mdd�Y�H$��;R0,,�����?�����e2�f�������Z�zujj���}���?���:�jd���o��&�4!!A5���?���������
		���/����g����,Y��?�dffJ���m�������������e�������/�S�Qs������o��m���E�v��8�15P��
	�������O�����7o���oc������_���T�C	��;wV�Z��oP3i��w�}w��1���w���s��=N�<�Z�7o������>x�����9���0yyy{���|��s����S���;j��w�INN>x� {v�������������[�l����o����{o��M�����ui�yQQ����i_����TT��c��CJa]\\�K��@FFFO>�$�p���[�l��f��i����:/���������)Q���������zvW\\��/�P.2c����:t��C�����*�������'O�������(�6l��_����>��3��4(66����(7����0a�
k����j|]Z;O�m��SO�y��@�����#��#G��>�d��=�����Q�v���|���>��Y�f�LMMiutpp�C�VVVw��Q����LLL4+?������������IIIS�L�#��H$����
,�<f���|��������P5]}��uQ���@R�����[o���oUUU���'�����_|��-ZPRH��j&$$�����b�"ei�~������c�����R�M�6��766^�t)��������{����<������d�����JOg��������5����a����/�pss�����F#L�>}��G`��/��r��)))������OY����I;����
�n�j����<z�h]Z!0��V�\O�����Z���_N�6�avQVVVPP���>}�<X�N����n{��E��}��|����m�^�p������y���������~�u�����O�������z-�z���(hnn��)&**j��9���;vlZZ��o�I���'����(W��v���������#G�}���
�%S~��3����3����R�#E������]�������I�&Q>G
R������}��Q�����������Qb���9u�����s�����P~�m��a��;v�I�&��+��B�%���!0H�������5�=���T�@������{���0��5k-�����o����>�a������aNN����������###~�z]�]���h��///o�������C��Q�F���[PjJJJ>����#G~�����J:)e���_��^��_����C6b�77�+V����{��P�������HJV�!
u���?��Fm��"?�;w.�m��	�l5??�����7m�T�����o��f�����9zQ?�����'
���39��CT�
;5H/�����ob�H���W���)N���X�LP944��������KEEEaa!+K�R�)Z��JY�W_}���O���_-�yP2�����������=_������@����o��E�N�4��WA������0��'%%���E�
��C�X"��{w�P�A����7z	;v���i����:��gO>���;����S�'D)���)��d�����l�������������:P�t��	�����O:�w����j�=`�Jrr2���uk>��W/�L��...��:�"�������7k������S�
>|����A����e���t�������eK'''Z��gd���8VX�z���[U������{���w���s�M�T��P�9��L�'O��eee�(�}��7������e�����a��#Fh��H�3�?C��������\�r�����Q����������yQj=���^�&M��m��w%�H�e�������?!��{�����S��'@T���C���C����{)�qsscq�Z\]]��=[��yyyq�,-  �E***._�L	������Cw��E+.�F�B8��e]����8>>~��uZ�b��)**�#w����j�RQS��r��>�l��a�lll���F����[�f
�>�������3���5vF��V�\��/�HII���<�o��C�w��!!0�~�a�������!j�OA�I�.�E�}�r���W^ye��y~�!���u+==�E������S����l���|e<�����P��������^���7��Yii��������u���Q����*��;v����?���������s������k,�c��?�gT�|����~��o������g����o_�����`sttd���Y���a���zQ���p����,B�mvv�C~cT!-c�}�������_~�%&&f��Q����fRXXx����������������x���?��S���s��O>177�������K��������Bk<�gC��<y2����:m��#F����*���w��%�T�=BCC��kW\\L+���k�5z��k������o)988}��w�:u��������}��2�:<x��2����1c������i3l�0���-[����S�����uG�����i�t}�Z�3���tFm.�J��LNN��9s(��
���i/����Tf��f(i~��w�������iFM�:�y��|>	�(������i�.]��_����^�U������}����������X��WJGh���������5k:v��Y��0��+����+��^��rZ�?�����;vlTT_3""�w����,\�0==�R��m���o��������uQ����/j��I����TQ��h�"���S��P����GO
4��~�����={������~K�P�&Mh(����+�a(7�WZ��p���~��'�{����wF
e{���xzzR�3k����G�8q��7�())���<�Z��R���DB�O�Ra����7o�������<��
_�Y�Pc5JG�W������0!
��������+�l^��E._�����[�l��<y�/�������VV���M�U�!���M�6�7N�/�Q����tFs��*�F���/�|��u��:>FFF�4;��///|���Xdee]�v-**������q9x,!���u��o�����k����8<~��#�[�n�~�� `��x!�A��D	� $@ :H�@t��� �A��D	� $@ :H�@t��� �A��D	� ����k���k���-�H�/
���`jj���?�9R��Pee��!C�������6Tf��q���={����4T@l�A�s�N�n�^z��/���~����-;y�d���
��������_����;;;��'&&��o����E�����3g���sgAAA�����������V�\}�����[S��'�������;�l������W�^�|�M���k�*���Z�,X0}�t�gi���������oz��}�6���kmbaa������/��fff��iccC����+�����%�a�J����Ts��Q��������JKK�������6����O?�Z�:����A�j3���g��IHH��!/>>�����������0@-�t�R]��6G�������^�vmjjjYY�������?��kk���������&��[o�E�R�K�iI=������Gz���W3f����<�SL��(P�B#_���DEE���Q>��#��������)R���C��yll�����^PM�Z!����lZ?h����h�����������oNNN�~��s�=w���v��m����w����{���{�nZ�h
��GW��_=))����5������/�.�ZQE9��V{��eK�*]}������i�����;w��)��L����iMe�hM�����@k'�)=rtt|���4{����&-��G��c=l�0���u�h�i�^�j�Pus�-�y����k��XYY�~j�R
JY4�Q��������\]��6G���K�,���(-055=v�XDDDJJ
�M5>�U�9�I������O?��a����9y����������B�t�MjY�rdd$��K�.�o�������]?��bh_4��|�4i
���BA
�	�������SM�4?~<-��<�{6++k���;w��+8��t�����o��BK���
�kd�YKK�+Vl����������Y�4wJw����Z�CkU��m5��QE7�...�r�n��!el���.%4� }������7���e��_~��������}���;h}Z�~������+��h=k����}��"4D�<'''k�^ee%�C��i�O�MZ�h�:y�$�b�������5t\�6m���,?\�����=-�Z;�Z�
_|�E||��?���Qv8n�8�I�1m�4>�"�������wMIM���*�����]�v-]�455U��dnn�:m>��jj�����IE	���O�P�Fi�
����Ci�����d2����y�V��x���^z�{���2i�����f��
e94>4])V�L��u���x��H�C�KPP_G���5�T�e���C�C
 ,$@�`���C�M�0�����������(H��s��988���VZ����Vq���M�-[Fq�O���n�2J�����F+kHHH�N�j�Z6��}��=�6��s�}V��'Ut��y�f��������(��{����gi��K?h9�������S��������������{���h����}�D)�O=�����<s�{�L���G������u�MW��nQ~I����z]�{��us}���^`yy9������a�3f����g��oO�$�_��!Z5iJP��u��Z����R
JdCCCg�������_%v��o�x�"�{R�:�j	P��]iT)]���Ez)��YM��7�A[�x�jr�)>1TmN� R���N!��������@���t����q�S�N��K��Ry���H��~ �C��k�z{{���]�t�����,]�|����S|��r��>��s�����N�2����{e��1��q��aZ_iA�L��2e������gAA�����{���&M�|��7�v�8q�����Ty���t�p��q�����g�Q��r��A��:uJu�P�O$���9�,�=%%��_�;cZ��[#�U�[W�U���w��hC��W�)�%�����+W����>��o��
�S���b:v����O>Y�V�^���O�ro���.Y��20J��L��_�K2�',,l���lA��o_EE���&��E��3g��f�}�]�����9�!�:�(%�z�������^�r���?b��V�Z��Y�|||���A5N�����4��>�,�l������3���G}�e�����/��RXXHA���/�cK����A
 hH���iee���������1t;�Z���t������{MZ�Y��l��*Z]�Y��
>������-�xk����|������������KW|�gn��A��a7n�������{�}V�c����[��Y'U��>��������7St�����O�o �v�~���<��[yJ���z���M���X|��KZ#Y�xZz��d�����PA? Z�5;�~�z���Jt�?������m�_)��44b���-���K��C��Y�|�����+��:���]3P��w��p���o����T��������+VPA[QB�&��������F���TL5XVV���O�f}j�n({�;
�8�RJ�.]� *�C��J���?����^�&���|t�\�`]=�Iw��.��q�����B��
�KEUU�Ps	�D��j��u�����
2��^{��?���6�4��?�������>
ef����t�KW���R��r222�?i���iZ(U������'�������!=}�e,11q���jq]}��f��m):q��v�.��p����������*.�*$$d����U�*�������������H�Y�	(K{��W�#H{���G���V�e����L��|��A����k��z�jJsu}E��T�<������^�3
�1�?q���c�����VMBBB����~Y�h��Y�ht:|j&O���gOJ�)��,����j�u/�cK���� h�������o��I�p���t�����P����13%%��Z�
�;w�}���/^=z��w�.�t�[^����W�^F�I���rB=�%��o�����6m���+���I��K��b�������������Oe�C�����e'�7o�:u*�O��999|�F�����W�Z�������R4���K��7=m�*N�
e$������V���������Pv2`��A�QR�^;-������|��
s�����S|}{���>>>4g4_��AxP�f����r���w���|D���s�y�'������9sT?Ee_J�}�6�z����A����4�nnnN�����Z_��������=zPv�r�J:@}�����#]�K��fff������H��a�����+�N�b�,YB�JZi	�K���C�bMI����o����K/��������9{�l�(���~��7�n�z��Wk�������T� �t}��������(SS�/������*))a���������,hccC�l�ytt4�=���~��e��U��8n�����k���y���BB��S$�F��I�|���&�?-X�����a���������w��WY����7GGG]m.^���
5�61��k��9z���o�)..f/�������3gv��U���j�j����={�l������z��J�T?�z�������/�Yc�����m��g�i�S��PKVVV4'��n�������$�}��5��}���+�S��R�A�_�p��?�D��	KKK=����C)���i/t~��w������7�|�cjmm���+&22�����Le���Z7�u��������'k��3A �@�����������)�$X�n���������y�[�6m]C)�������k���
S�L����u�.�teW�)�~QPR�� �����t;K-��|��!��9r�����P���W����P���CW�={�������>�+���BE������>��(
�?#pP�[����?�_SDk�jB�Jk�X�Z�tvv�tj��My�L&��*00�#���nQ�?T�~���>���s���	���/���QnG����������T N��������BmPRB�zll,5]3P��'��3Ci��I���3T��������:�N������3,��r*G�r�v��Q�JY��;j�g�yF���Q�4
hd���F����yV���3�4&L�� ���A��T���Z	����]2�C����������P�C����z�D���]��w��]�Q���B-��B�TA�)�����c�A�������6�R��
���L�5i�w�u+���T7K��9Jza���|Y�lyS��YF������U
2D�?�&�����C��B�����i
�C�:MW���+����U���u���������7n��@�A!/��x����/�j���E�%����w�
	��Q�q��a����| �H�+�>!5�}��5l���� BH�@t��� �A��D	� $@ :H�@t��� �A��D	� ��M����:w�<l���K��Ckk���J����Ow��A�����#""������������+` �M�:�����������322����V.--
		�3gNXXXBBB```�n�<<<4�^^^�1]*��sgrr��	n��Esss�_;;;]����---��������i�&*h����0���	PNN��o��k��-[��SSS��>lkk;y�����M��?��cG������3g���5�u�@���Q~��[oyzz��q��Q�a���G�6o�|���|���"KKK����U��f����Q������qc��5����[�Z������3~��������&//����+�H�U�����['@����j�S�����t�R�6m8��UTT��
6��y�g���NYY�����V������2�����&%%���j
�y�������}��'@|��O>��g��������!C����������q���[�R�m��yzzR����off�h��������-\����M3X�^�����_�~�/�8qbFF���+�4����y�BCC)�D'&&&,,l������[�����*h
�	�|��_UP�p��I��������VAk�@��0@t��� �A��D	� $@ :H�@t��� �A��D	� $@ :H�@t��� �A��D	� $@ :H�@t6��������a��.]J�?������5f���Z+����6�:u���+��������3',,,!!!00�[�n^^^|e�<<<�o ��J�v�����<a��[�n����xKK���p*���o��i���|}���+a�=���y���w���e�9�|���
^^^g��Q�Dk{{{�[��	�����z�-OOO>RTTdii�?������&Z+��Ull���5#�W�h���7n�X�f�j���&//����+�Hj�P�VAAA�)�Q�0�|���	��?�|���6m�p�������f������dFFFOJJ���U����[���`�zPuO���'�|r����K�������-Z�(22���qqq.�
��m����D���_�������D�_�HyLLLLXX����)�Y�n���;����J	��
Z�"@���e���D�
'O��_Ak�@��0@t��� �A"u�Zf�ikYy���#��P� ��*YNa	+�er�����)��B�V�\i��`�qv��#
 �������K��l<��lqfN��sXY���K�T�0���G���������n���m^��95lw@H�@t��� �A��D	� Vw�-e�q"g��A{��@����S���5)�2�P����A��C�]^i�����RI92�� �F(a7{���h7��_����A���1����i����0b��1SYpL{��]v
���1�+#������
��G �Fc���i�T����p�y���r��
�5�F	@��������Th��X%��;�,��U/����@#�D	�N���{���93%%���a����&M����uee%_����:tP��������NNNQQQc���0�:&@�n�z��6o�<t��c�����������gdd8;;k����4$$d��9aaa			�����u����zyy=������C�J���I�������:&@2�l�����P�W�^:t�p�B�������������---��������i�&*h���[����d��������������*��o����a��K����Q����7���-4"uL����^x�*������3==�������155�0a����mmm'O�������;v��?���:s�����f�n��Ky���;�r��V
��y\�&(L�����U�|���c�>F�V�{!�=���7n�8n�8���R�k���CJ�6l�p���������>��_TTdii�?���*R�>L�������5t/���w���A����]�+�heKV�_��!���C%@c��5j����K���#F�Z��=��O��������&@666yy�/�����DkPu/���j����AAA+�i�����ReA5��D%���3�n��^�w�>��5�zU9����>K�tAB1+��;%)���xjf	_���qWJJJ������:��������S���"6v���&x$�1:w����)�155���wPP���;���w����={�:eee����[y{{GGG�d2###z�������5��5������H����S\����KW��u ��p?x��E�T�_�s�.�{z/z�nW��3�k�"V_����e�7m�eb���}���x�om�������9����A{{������#���V@�G��Z�KR�(//o��q�w����jj*�O�~���!C�������/!!a���[�n����m����D������l��E������[�p����f�n���:&@���[�dIXXXzz:%�����/^�x��������<�*��7/44� Jtbbbh���gS��n�:www��5�X��5=5k%�L��x�6tw�fu���
�	�<y�/���$&&�U�h,*���+����+P;�S :H��B&����rUU�����AP��OW������0����$@ :H�@t��� �A��D	� $@ :H�@t��� ��_Ye������,	�2o�����%�i'n��r�6�H�	� $@ :H�@t��� �A��D��	���{g��������0}��I�&Q�������NNNQQQc��Q�Jk��P�[�n����7o:t��c����}}}�t�2g�����������n��yyy�[���jV����������d���WS�C�^�zu�����999�������5����i���s��[���kV�����U������^�Byy���;����z��_~��c��|//�3g��nu��y�
������C}	z������spp���)%***����������j}�j�
@X��;v��Q���/�Kmll����gsss%�j}�j�*66Vm��1(((`:M�`~~�T�,�������R��HLL4.���x�iO3�B�*��R�f��l��f��5s�s������<''���5���8��T�����Y�YN����X��:&@����x���#LMM{���s��1c�DGG�d2###�������������f�A���q��4��""1k�rNq�������A�|H�.���nQA"�fUmi+kkk�&��.�a�:@]=�����N^�/I��~�M������K,h�`���S|(qO���
�`!:8:�{Z��;:8r�A,R
��	h����q�����������T�>}��������E�"##8�p�B��m�6OOOJt�Vpss�����1�����%K������)��d(<<���8&&���g���f��u���Ty��y����Q����� ����;@�*�}||��'O��_Ak�@��0@t��ck��o$�=@��]��l����	<�rs2��S������������]�N�+�!��^W��2�J���`����o�Hj�	�����S��N�z�����Te��# �j�	���7'�������n��[����/_����������;x�5��ff���\*�����y��}��BK+g$@�5������ �A��D	� $@ :H�@t��� �A����WT�(��������q��GpH�@���W��la�C_�����Z��������`mn��i����CC�S�'w�uV\������T�j����_Y0��+���M8G��d� }Z�Z��z[^�a������:w9W^hi�����={H�@�K����%�>Z����[v�bE�Ag^�}�3$@�n�l~/�[>��;6lwj��	P||����/]�dkk;m��)S�P��������s���:�nu��������d''����1c��
��yUU2*H�,��6i��42uL�rss����.]��K/�:u����
������Z�*--
		�3gNXXXBBB```�n�<<<4�^^^���"V��RaRp��&?�����\�9�G�`e��������R������S�Ce��;&''�o�������*>>���2<<��~~~����6m��fp���u�4�����/�r�����}T�Zvi�N�G gg�W^y��o��A�O@@@NN�����	>lkk;y��������?O��������3�������
�7O���'Y���u��_���_�NKK6lXTTT�6m�]�6n�8J�6l�p���������>��\TTdiy��XYY)hUw��S��rNN6?x�`�������
��y|�����.��~��������|�TYP
*7Q	�Uo�z�%&&���_t��f�����wE����_������5���8'�'|0+;�I�����e |h�������*��Q��GsG���i�h���(�������������09���z(h� /�������C%@��=z���s��A�[�^�j{�O�>������QM�lll���g!4"�DkPu/AAA�i�(2k�rN1q���4�S�G'�Nf|������?���]���kiS�� �i/��9]���������]�$RiVu����ikkk�f���]���u��2��OJ��m�������9�=�=e���+���,�����)S��k����G�(��l����\���h�
��������.y]_^��������R�����l�8�nuPz�n+������N�rh(�����}
>8�����9rd��Q���0`�ddd��y�gOejYVVfn��_���-������aRR�����`�{ 6-�R��*�����Y����Me�w3����}{d�1*..~��W�X�g?����C���g���_BB����n�J�m��yzzR����off�h��������-\����M3(�k���������'*qp�������H���]��]��G&M����_/^�x��������<���7o^hh(%@����������=���u�����S�A�c4r�H�L�'_UP�<y�/���$&&�U�0�)$@ :H�@t��� �A��D	� ��H��-�_H�#�|���Y���E���Q��1r��H��������A��D	�����~�]�#/X�����7��z����\�uy��]Cw]�WPH�@t��� �A��D	���]�)>����!f&�
����@�>�~����T�f���z�63�����'H�����s��g�����}Cw���=����>}��K�lmm�M�6e�
?~<"""99���)**j��1j[i�P�V��?/�R����.�}G�0����R�(777((h���/����S���������g����9s����%$$v����������T���������� � �
E��<������-^���*���t��199������2<<��~~~����6m�;w.�U||�f*���*e���<V���T�1rvv~��WX��������R&�����:s���V�����`oo��:8������Y��(�����_�NKK6lXTTT�6m�;@�SVVVQ���B�[���c���=z����� ���<����\�D�Z_k�����U�/E

���������9Y7Q4��`~~~u����`vv�f��&~��i�i�K���jP��J0�z+�{���D�|L�.�N���>�����(����7�999\u������9��BEE���rR�]��e���e|�������S%X��E�z��6����_�����-P�7-��v���|�_��������Q�����@G��Ys��9rd��Q���0`�x{{GGG�d2###z����������
5n�����"�v,�����KS>emm�UeR����/q�J�w�[�������D�%�����>�#���vvv\�2(������A6�%RiVu���R��)�z���"f����A�}R�]n�%�w�Wl�)>�����s�|��Y�`jz
utp�����������Vr�����ZZXrUy�~:p������i��W�9�����b��? ��u���en�5�J%�|u������V��������`A:L�}����`J$}
>8���������+V������off�h��������-\�����m����DGk777�[H�]�v]�v-88��L�4�������	�={6�5���sww�����J	%:Z+h
H��#G�dZ�7�������<y���
Z��?���D	� $@ :H�@t����=�mZ��\[V��j���S
��bO�LL�����reUq�v��� !$@ :H�@t��� �Ap_ainqY>+;KZ��YYUR%���f&vgd���������������rr������k7�lt�������rP�\3[����D���r��GYy����U��dR��|��Q����C����uj��s�X�����
��D���b��8V�t�;���� ��j9n?�
�����S?���nB#�}�����X���#�-\�?� ���pgV�����a����W���+�z� �G ��_��
�
�xH�jp�Z������Z`W'[���<<$@58y%���X��o��4y�s?��h}[���"/4����Ix H�����\Z����L��F�;��BK$@�$@u�,����q�
*��`�Q��}��BP'&U\�uV������)T�z�{��	j���e�����;������,bmm]YY�W8}�t�T79~�xDDDrr���STT��1ct��	��I����;u��G������322����nRZZ2g�����������n��yxxh�����1������k����
�#���������M���---��������i�&*h���[���W����HNN�����	>lkk;y�����
������#�������3�����:�
�FB~	���b��q�m�����������7>|8_�������heeU��Tm666VmG)((`���l������yy|0??�rs�
����ILL4.�=�+�F��������3������D�����Jl����m�,����HV%�����V�f�T�,�������R=�0�k�Dr._�_����\;>X�R��4�����
���cc����>�:�S3K�`Nv���PRR��Itc�U���tMpjO�����>+;�I�����e |���/�%�%�f��*����-������<x�������m�b��3�����:(?L������:��6852j����U�X�O�>������QM�lll�TR�D�5��lPP��C;�����SL\{{.M����5W�I;[[��T*�����loW%���������tX�^:4yE����k������LML�
���\��V,�h���#_�\���V����i/��9]�������� ������l�?���)�0�k#��,��+�G/W^���������u�2h[�)k�Q`k���C����A�t�'���6\bA{{�������2ho��A��8pptd�����5��AyM����e8�+.r��:�c����������t���=�9'��y�zs���)�@��Z@@�����\�v\cA�T��W��L{�[w�XA�e� &��D��P��%����Z�XB&@7o����'{XVVfnn�Z���;::Z&�����$___�A{��������IckT��oo(��gp/��V����.����=�
�M8�&4F_}6�(�
�}���j�����	���W��g�??�����7n������m����D������l��E������[�p����fP�^=��O�~��Thi��_�����j�����sU��F~����rO����@EeAye+4t_D��	Pee%{;���������O[�0q����WWW�iLu���J	%:111Ts������[�����*h
������o�	��tC��qV����D�a�W��'O���>>>���j�wo�zy����	��
�`��09���V�d��;O4lg��bFtZ���oSc��4tw^yi�����rU�w�v$@�`Jr�E/e��#�����������B��p@ ��y�+w+�|���w���R�]���,�oZb��
E���?W&@��M{) #��D�M�G ���]4sE+�t�( Y9w/��������\�������=���,L���Q�]�;$@����a����T����&U%�,�����e�k�@�Z�����+/�w�"k�IeE���Xyv�'�%��40$@���)�0sib����h,�5nq{�B�f3;�~���h,��� �A��=�f��oYy����@����)����Z}�$@ :H�@t����.��r;���[5mb��B%�\�O,�t�V�M*tr���@OS_}6�(�
�}���2h�T!�������c�{.���dy��>\�%�.jy��:\�9-|�Il�is��3�Zr��������2��� �)���z�oUZ���Z��O�
 x���de�bewGoc#���48$@P�*�K���YY&�j����d�������IOe��gdL�=��k���X�}�S�2��5V�!�F'Nj^�=���U����S�d�����/�X	_�;+��r�;�F��/���|���sJ�
���hQI?e$�����	<�*nqU�\��jV�-�r����+�:������
	��r����
�fi��9|J�XC���r����_���M���
 ��J��-[��;�DGGGFF�����#""���������������
5n ��'@�&M������)--
		�3gNXXXBBB```�n�����W������������k����
�#���������T�����i���s�W�����U��������;v��?���:s�L�����o ,!�]TTdii�?����H�j�
@XB&@666yyy����\�DRc�����U�E

�?<''��S�d�D��J�����-�(������h\R���5��$�����YYY�N,Xy?����9��^�|9���@���\�,O^���\;>X��_�(4�����

��8
���PgggkeC(*U[���7�>���<�Z#��e[��v��m$���Z���N>Hc+�*�A�&*����T�1�i��Y�s�s������$'G��q(�����qjO��
������8���#�*S� RL�Y?�_(*��]����_TvvN�������*��e������|�3�KK,�X?��p�E�z�������F���p4Eul���i�8�e[~����
Z9�t4�i/d���-������aRR���dZ+��UPP��C;�����SL\{{.M����5W�I;[[��T*���;;���A�D�|��@z���"���P�]){���k�����wt�����3�����+j�+j�k��]'� ������r{n��|�s�;[;����Xg)�����&v�I�������G���J������wS^�������oE�b����?
���f&�U��O{;;;N���c�)HU��z������-m� ?p��i��r��p���[s�wg�)���\!,dAGGv55U��������k@�$��6����w�^U�~:p�����)K�i��G�^T~��M8������}c�i����������?�--,��<�����_����h�������b
�N����e*������R��������4��������`A:L�}�iO�2�H�|pj�c	�������-Z�(22���qqq.���m�<==)��Z���M�VR�����e�����>}zXX����cbb�0{�lJk��[���Nu���J	%:Z+h
H �Dy>>>���j��'O���5` �S :H�@t��� �A��D	� $@ :H�@t��� �A��D	� �o�l?v��
*�r�������NEU���O�r����^���H����pkK�*�x8r=�������Y��LX���w~=Ii�7O����LV�[|��K�o��H����-��F�V>�| g)�o�Lv��:������G3w�/O(+j�uk�P�E������BY�������T��2��W���@#s��_�.�����-$@��D	� $@ :'@����������Ow��A�����#""������������+�U�:��e��/��y��@!���������ggg�JKKCBB��������[7������P%d���K������oiiNe??����M�6QA38w�\;�J�(''���t��	�����<yrDD�j����w������u��{{{����=������=��-���X�ZZ�f���S��~����[+J�;��*��d2y����'���G�=��)Th*y�G���*��	�����q�(��a���G�7o>|�p�BQQ���%�����HA3��lll���(RPP��99���[7�r���`~~>+���(������h\"{�W\G���b���
>���������D�����9��^�|9���@���\�,?v�Bn^�,T>:
M����`gC����N�o.����5��!����r����V�Z�Vl����m�,����Hf-tg���={�����J���r�`^�V��?�S3K�`Nv���PRR���t��U���48N��PQ�2����G���sdUe�D���1���EE������������iS���Q���l�����*j�5V��p�wy**M�n~��&�*�c��������L���-�O���+32.S�[Es�����t��x�5m�_���{T�~���OY1t�3��Th{���
ebd��H�����>w`�,����IyS��o�R��|�3�KK,�X?��p�E�z�������F��	s4Eul���i�8$�A�arv��{(h� /���'--M�������������^�f�R�(\�p������	P���W�Z��}��?~|LL�jdcc������H$�A�f���T��Qd����b���;p�1��������-__*����g���-�Wb%���������tX�^������;-?r�&�����fL�"hr?��x��������v��ur
��.��,��+�<W^���������u�2h[�)k�Q`�V"�?�4�,������>:�WT��p��������6G}+
k4����Q�\���V����i/��9]���4��p?��=
8��V<-?p��i��r��p���[s���{���=W�Y����]�LMU&��rp(�v��7I��M� *���WU��\��ojf�a�x����_���|��2o�5�i?���X��$���?��z4?��7-{���������&�X��/{�B��n���rP�\6�o���( SS3���z,-,+�����0�����C#�W�hlKAgg�~}���i����������?�i���<�����_����h�������b
�N����e*���P��R��������4��������`A:L�}�iOA�8��>�W98���)n-�����)�C*�p%��sW�K+Q	����Q�����,��	��	PFF���7{����������V��������dFF�����$___�A{�����/���
.�6S�W�	�%Y.nb�������U��;�������@P����7�;!���W�2d��=~~~			7n��u+��m����I���������E�"##8�p�B777������e����G�w�#�*��������_���V�m8�|7�p���T0uw?7j:�h�uV��]�sN��U��y4�T��qB&@���[�x���322\]])�<x0����J	%:111aaa�g���g��u���TAkVr��)��7ul�����q���J�J���Uv|��S����
���Q��=h����U����'����Obb�Z�AX��R��l���,�c1�f��L��c��!�������>3�+�������[G��F?�+�=�B&6to�Q��K<�^][\ZN�7��<��Zet���������K�<����B�=-��wZwa��W�d��N�}�O����%���� *))f�W(*nRce-$@�+(�]��V��/9�R����y�g���O��}Q��N�|�L.=�:�J��?--�!��~�y�n
U&@���UP��������Vmb���4�����ATk��;v}/����9d���E���7.`���0��oP��������E:	���iq�F��?����1�z�s��J�r��_*�+p�S ���I�����,���P'�nT((������w�,+.>�_�K���z��V���=������G�q`0H������%�+*;��+~a{������AY(�:�e+G����mS����p;�(-K�[k{����\�+���pM6�`rF��"����\o�S����^2���L��>�_��<���������������'�WSm��{O���+WY|�+~��S��z�{q7~�R�K��]*P��[��/�A��D	� $@ :H����3�Y��v��u�����	@����/�A����|�le�gG����{�(����]���~����_���I��T�uj����� ��l���V�������>{s���Tx������2�U�%�s(e���f^a�V������LI��%���`�_;�9��
m�5�}}w��B��D	� $@ :H�@t��� �A�!-��vN+�l���V�r����V���'�X3#7�*GV�o����o��������X�������:�$@P��v<��XY���2:�g���Tf��h.���������|�*+d��&����<��
V��lf'�������8:~�xDDDrr���STT��1cjS��������,�u�_1�TY(�2`w@��L�JKKCBB��������[7///�<<<�o B'����vV1���H��gS�'�I�[�!���xKK���p*���o��i����+PA�V�Qv���B���ml�����M��{2��Ylh�W�:)��&��_};�����Y�g�UE��s�� A��?�c���C//�3g��X���^�V���-G���2Z�`�t]���)�e��e&�TV0KT~��$��*>B&@EEE����C+++��X����z���9����u>��\�8p�%��fe6���c1����'��B�6���������
n-$��aAk�����I2����\i��u�%/9�pN��!�4�8���oR��jF����\+'yAV*��,�fo'q�7efb�w~HO����6&U\�Te���$����txWe�.����z��Iu���q6Q���Y����|�S��-)��S��&��X}�a/��+������&�Y�Y�UU����I�V���7~�8�
����r~��L�����)?8��M,Kr��6����.�I�En�=����3��`iy;�b�����*�1�*:sw��#xvvoJ��e�����v�$��H+����.Uvm;����������~�<[�������|�m�(_���	�y3���wy���s2S�:K[�U7Vv�a��y�&-���Vw�����soV66�`������*�J�qts����q��YQ�|���9�^�^9TT���Ub�m[�~s�&�f�W*���q0?��Zr>��c��k�����zxW�4���E���o�B��������������N�V|����q����qNF,�O{�R�����M��Saa�1������]Z�d2�����7�����dr^�?�u�O��*�����s+L������5���wt�3��G�+L��������j����q��fk���N,����w���8�B���������������	�IW�Q���X�PN<+i���b�i/�ZX?��gc�O�r\p�v-��g����g'�$M*-�wU��jb��UO���>�w������0���F��\�	��������sss%I�j�*66VmGig��k&/�s&�6��'N��#�.�<WL�R�{R���ys�����*.�_e��2'��\�f��q����)��~i��B�I������+d����\��{7Ui?����u����x1����;o���J�+���{�+���E�uu��U;����Tw�+��w�������������?��S��iZv*�����,�����or���MU�����'�t����+�Z��d���7~�s�h��Y��v����|��.s'/�u���������7����Un���
&��/5�dK���o��#�~�NWw���t���T���������9H���i��9'�8+���w�qw��u^u�_������|�w�&5L��'K��b�W�_�����W���O=�w���}uM�����u�?�>��iv��5g�Z�PM�s-���,����|�����:�/ii��Q98�G��3�6�9���O����;::��]##y�������[c��


R}H��ZDX���F�yC���?��7���}t�qm�Qw���k�o���	��������E�"##8�p�B�o�����������n` B&@����������=���u�����S|��y�������5` �"D���D����'�W�0�)����kY���F�yC���?��7���}t�qm�Qw��������<$$@ :H�@t���<�	��e��y�������Ha[����>}��K�lmm�M�6e�a���w���3SRRhG�&M�}&//�s����
[�t���Z[[WVV�O�>��C��nGDD�������F���>��m���;�XQQA�/^�X����}��������Bl�8p�&���W���.\8t�PA��<��?N�ONN�EEE�3F��ui\��W�}�_]� ��������f���j�~�jv^��W�}��_�3\�sV�$�9��qC���sDS???�S�N�����D���^z���S�����������[�n����7o����1j�W�^B���:u�����m���gdd8;;�\�N���������i/�?��s�=���S�f�@M����rYYY�=��2SPP@����
�q�F�.]�������;w�����X�b��������Q��z���Z��zi�J�����9s����%$$v�����KO#���� �{�j�/���g9y5�������_���=5����l_��W�����P���3H�sVk�����Xs����^�14h��-��Ew����c���S��d���W�����t�u�����;wR�'L�@�k���K����	����������7oZZZ�n���i���?��N3����J����Tn�������3g������E�zR��O����o���oj�Jt7F�O+�i�o��i���B��+(H������x���N^���=5����?C���l_��W�}��_�3���H�sV�$�9���v��b�}� �?�* �7z��WX���H�SB(nnnt�)���JG�JO=����������~{��][�l�eSSS�4>|���v����~�C��������5k���������M�}&--����g�
�,]1�~�����hQ�|���������[UU�?����x���7�y*�?��A�C����@��ui\��W�}�_�� ��������f���zf� ��f������u�j�����B���� A�Y��h�}��z@���a������i#x�7n7n�����?�H�Ta���[o�E�����6]@7l�p�����@��
>\���}��uGGG:h~��'����f�j�Y�`��899	������+�{��������O?�T�C@��4'��_���/�����	>sv7�?�����!vdP���5�����������3���A� ���G$@uw�����G��;��L�5v�X������_z8b��Z��};%�t&T��Z�n�j�*V�������cbb����B�1{[���{��1�������������>}Z�6�+W�P�w�����Gg��!C�'������m����{o����(�p	��*���<�ann�D"1������=y9��z5��Wm�~������{DTGG�������s��]�x�������{�

��s��	��?�|��%�A�)QQQA���/H�7o����'{XVVF�M�������{�������S�ilff&`�����C�����yxx�����I��{�
�=��������+�>��h������722��III������k������W#:5g����A� ��b�H����0^|��+V��s����q��>������T���k(_���O�z'���_�z��{����DBB����n�*T��U�Vt��5k����������7~7��_���C�6���?�H��Q���?'N�(`��:�ti�cJ7y��
�}���?�[�-���<p�-.4���Q��=y9��z5��W���5���q���M�*++�Fyy����&�/t��k��k�T���4i��_-H��_�~K�,����K�R�����7
�yg�.�����+�o�vt���6m����~����<�����������&��wo���G��}���'O�,`�����?3fLNNN��w����I��lS��C�^�n��������Y��Wk�B���G����1=�u��j_��W��r��j_��WW�����V(��Y������LW��?���Xs��������9r�L&3P���
������;��E��6\�k��5\��)��q
6��T���ILL4\���������� �@���<y
�y=�r��A�_]�u��j_��W�
%�9��}A�Y]�b�}l ]��� �A��D	� $@ :H�@t��� �A��D	� $@ :H�@t��� �A��D	� $@ ����[Y��qKs���6��b���o��FUU�{��M�^�z���FDD�������"�,�kllL�����?��S
�����i��9qM�Y155��������T���?{����T���#��+��-n������<J����Js5��v���z�� S@$0�A`�.���Z�x��-}5^�]��0r�H��bbbXa��qvvvK�,�m�������%>k97p+�l�2==��5C�Z6���,�.h��H����e�F
��,�}�n<��kfH�������:t�}��...�)A�(�H���q���:|�������u�V�=��]K���N�>=//���$""b��)
��������������giV�\eaa|���	&���+
���&!!a��i������3g�;v��?��x���������Z���/�8q�DZZZ�N�,X�m�6�A�-\������;w�?>�CRR���[C��>,�-���O���4	5��0�`HH��a�����$##c��}m��������[HH��M��y���7o������7tg�i�|�6m���gi5���������]�l-o'N�����rss�
FK���?����={v��5,,l�������BCCg���c�Z\)�----..���?�t�2@�"�0++�Q��SK�9,3E����'����������$I�v��]�FWvggg�~(��E�������G0b�:���������o���������4N�>��/�������@�'���o���V�������;>>><<�W�^|�q����666t�8������S��	:,����[o�?Y����$ssskk�+W����nS4''Gk?
1&
	4$�T��Pcc���J�urr��m����7�k5S�|���=K)���#��:���.l���qt�������/l���>|��e�W�V���d[[[Z�Y�R�z�p�pX^P����&�nSTW?3H�����B9������6�V����hUx��'�|��=�g��.�������e�qi��y���������#:m�������;w��j��
��Q������?\�]�x� �G����Z�{����@Z�ccc��W�
����cU�j���������������B�N�V�\YQQ��=����~:,,l��]�>�lQQ���S�|����;�?~��#F�������[���/_>�|:�������^c�X�Ek?�w�^o�H�@`6M�z�w��{�p�q[{{����w�}w��)����~���T+��5+%%������������'��6�����MK\j/�.j�]�v�����988�5�K�.��!F&\�.Z��V��lmm)y�6m��o�]UUE/���?��U�Vc���
?��#�����7o��*dgg�=:$$���;�%�k�������8_6��P�$�k��O���������mv���p���E&��>�
���G��������O���;�Y�n]���{m���z����>��<����g���R@V�K������D��o����o���G5���r����)���?�62�B@�Q���zX�����x� x��l�r������qqqiii={�l�N\�Kw�����<B���V�\9m����p�D�q������H�-!

��z��0,�	� $@ :H�@t����3sR������O���U��}###�_�����O�4������V���j�7��l��o��}NMM���(//75�r"����ySO�RQQw8F3njj�T�_�n���%�K����e����M�0,�?Ej�
�y�������V�{�~Hg�������;]K����H��8����������WXka�>:t�}��..�_���e������ZV�������j�m�m����O���@	EO����M_3���3���:���K�OQ������j���?������g���7!!a��i������3g�;v�s�=w����������}�����O����gbb1e�������;��?�n�w����SO-\�p��M/^�1c��{�(x������_|�Q�y��E�9����q��7����C����~��u�n���������_��-��?�(=j�u�?�������?nffF����/N�8�����S�l����k��A������}HJJrss����F4E�A��K*](�����={���|������6l]�����W��S]�v�k�����_~DW�������q��M�>vR(...,,������())166���?ccc��~����[�n�={�C&@�l�i����}���m�6..�M�6��F���?u�q(����}��������Y�f����W�0JKKi���i�.](�}x�?�&�ay��(�
���������7o��
���wpp������e��+Upvv����-Z������tJ���_�������#�S�5��i�h�}���_�z�-N�b�
dnnnmm}�����?���H$�������Ek�����J���/_��w�������^�z�=a<���Pg(����W��EmX���AC��F�?���iS�����7n�pwwgA�9r��Vtk������ge�?A�h��n[U�������/(P�Z���4h���I�RV066��b�����:x�J��]]]��l����W����Q��/[[[Z�5�P7���4�)
�!��boo����?�k�K�����OJ���4�������w��������6c�kTc���Q(]���o��:m�������;w��j��S�,,My�>p��	���A�������{��M���L
>���aaa�v�z��g����N����ov����j���t���{w`` ���������������u��
��]w��y���,1bD��]�n�����|�����Sg~���%K���"h?r�pH�@pVM�;�zV3�����Cww�o���������������������t����oWUU�5�.��[�=tLL����;e�SS�O?�t���N�!�Ys�������#�gZ����~5�_�����'�|�`ia���Q(�����[�j5f�����?R����7o��*dgg�=:$$���;5�Qb��f7Jk\T���S�����(���Vw�o*������?��G���|�������������?Q�ZV���^^^%%%z:��L����g��j�������5V���(��|����|�J������r@@[�SSS��������}���v�_N|�R�S����G���8aX�1�D	���GH����c		� ��5�1{q��IEND�B`�
bench2-dbt3-10gb-pct.pngimage/png; name=bench2-dbt3-10gb-pct.pngDownload
�PNG


IHDR��8�r	pHYs���o�dv�IDATx���	\�����oAoQ@Q��#�RTL<��g�`���e�e���i���y�b�m*^x�5/��P��_v�q�tW������}v��g����3{�_ZZ�����;��!�� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �� �6�[��-����i�f���C����Q\�XXX���Sepp0�;v���U�_ZZ�XY\\����GDD��w����K�.,h����F�l�����Jcbb��������~{��u++������w�����G�������9���3KK�&M��F���Uf�T���{����/_�f�7����[�n�k��T�*\\\�y������p�;v��y��>J�}�:������[>q�m#�.]:u�T:X���^���
@�e���G��BQQ������3|�p:?�������r���199y��
����3a���?�x��a�b�������_�����y��u������_t���������������������9e������6m���7�?��;g�����w��i��Y���KOO?|����~�m��c�����V�]J{���s��IZWe�f���p�{�"����v�T����\��2i�$J�t,,\�P��p�T �2���~��9n��;v����W�\�t���{���a���ZJ��TCK����Y]nn��AYd��l���M����R�o��r���_<�|�2�
1��(������~`oZYY����R���_TT�JN�����F�������JwU�]J;Oi���;�����@������Z���g�7)�j�3�T�}�k_[�K�/|/{�T x��E���k���[�vm����iB���}��MMM����5��Lzzz�w�����N����'����'O�j(�XXX����
�-��t�R.��������F���[��E�w���{�/33���>��gOIII���)����[������C���K�'�dLLL�N��)v����b������P����C��7��������U�h��7���\�z���w�}���C���;C���KMg��8v������?�����a����w�9;;Sjd_l��O�>��v�t�������{�������������J+rss�?~\�~�2Dq<;�f��^��>>>�\��5�k��A�;v������Ul_�8�Q3,�o��A�7e����GGGS��)..f�o����?dggO�:U�Ufee�9�C�=z�P\���I�co��E�6m������I�&7n�(((8s�����?��>|��������,����_Q��m9q�����O������b�����={���������~Hi���K�RG��I�V��Y3sssz.��=K�������h�)�(�LTT���'OV���[#���FFFn���y��41O�0��5H�4='%%>|�fe�vf���d�
��=�2e
��k��9::R��l��O�.���P�c����@�����+�_���F���x��uwww�f���
6�`T��*��f�6V��T��j�D�5�i�`oJ$�{taM��������.����H������z��}y����_I7���h�(**��Kqy]�s|���tEW�J�,�����s'M��G+h�(���)������o��v���_|���4C��"���������J<�+dpvv^�n����h���Qqlg���h���4����	Kn��t��3g�34n�888��jff&
 �-_�V-�Frss��G���s�Q7ntuu���9s&#}I�`���M�r����Xr�Q?V��B�)YN�8q����@�I!���'�|Bc[����_�8�Q:,�;w~�F� x�����9�H�����Ea��AAA�O��>��Jqq1M'lYWW������f���{S������b���#r��e������N!r�d�����tu�u���k��}u��m����]�������j�v�Za�ccc����/}Q��A8q�;��n��{
hf�y�"#��6������y��q�:��m[���Pe���H_�������+),�{Ejj*�y�Gs?��	�Y�f�	.]�������B'������W��
�J�>S7�������w��(���z_v�(5��9�� x��y��m��W��];�L�����4���#����'����]�����]
��w���_?�^�4o��Jv������<322���gooO�&�����l�.�w���������~U����d���eU����-��'r�����(�}i������;v�;v�o��6`��w��vF�;t���XRRBO����W�\I�dddD+����+�Qr=����"&&&rQ��k~#��&}f���������[�Rdl��I�����q��tX�4����.��M�i�&���CJ]��������D���2[f?3Ag��R�qvvf�)���S����w������4�3�������
(:::�{���w/M�e1�!��S��������hU�4�~�#''��III��r�RQSl��(�|�M�>}����+]������W�>�����*��g��U�E7n����Y�~�{��������Z���E��E�Tr�^�����Z�jQ��|���������H�qP�������cJ~�K����w*�:���8�������`���!r�o�r!FJQr������3f��y_~�%[C'�'O���[��=����������~%���"���~���={>��������������[V�]G�����Q2]]�.p_h�I���&Q�R�������������l�c]�~]��~�����u���i��~�Yig>\ag�/�����7�������`����(
4\�����A���~b��c�j}f�C:t��]��A�g��{���k_�qP�����d��e��QW��Q������R���f@�et�f_)))y������g�).�H?"z�������.C{�����k����������ZOO��V������+��
		Q\866�����>���]��lD����'N�H���wo������-��c��~���j��MPP����4�o���Z��^a����O�������m@@��?���Ez8��o�>�^�3�4k6k�������z##�3f��?�q��}���|�z���+WRv���T�"__������������\gh����"z���%�C�IKK�={6e/z`LL�������S���~��E�y��i�������K{��)S����)��Tr�^���Q�F�X�b��U�#q���s$�����R�I�y��9s&� �$]i��A�&C-���}��V�Z-[���e��#T-cff��a��������~�n��u4QQ�3���u�v�~��W��|���Q���N��Qh"�;w��5k��������sK����U2e��K�>y����&M��?��#�W�+�]�!�~���Q&L�PE1���)��wQ^����sg������_~���_��5k���
��4�����P9rDU�aQ6�-�dg��7n��STT��3r(�Q<�quu�����?2d��K�h��������G-�p�}x��|z,�w��}���|(J����+���F��M�������/�^�\���C��M����7h�����R�x��@��Ji�k�T��Q�L��%U}���_J��m��Y�~���W~�HBB���O�p7/_���###�����PJ�A�or(�l��m���J?���3�5���������:u�+?x��+��GGGg��b��V�����=)���j��k�>��>;_�z�P����f����7B|||��7EJ����,@U@��=��������>�����X@P��;wN�4���u���/��q�7@
�������W"%`�������������������������������������������Ps�����%55���B�}��*}}���}������E��g��:t�������3f\�x���zzz���
hArr�����#/^�U~���W��|����SU��K�.�N�R�OKK�������s������u���[���g3g�������������������w�_�~���<h��-3n�85�gffN�6m���999������[�n]��8t��U�-�>}���4t��Qq�W�75m>}�����w/=����Q�FC��{
�����3f�'�|��%�a���tuu�%�����:;;<z����F��G����y��!)??��BPP���Wcbb{��������5�YF���'�v�*W�j�*U;Ue�����~�a��M���+,,�S�N�~����+33�
���\GG��v<��>���J��@�%�d���c�J�i��[`��a�,�]��G��t��k��
.4���|����;w�L}�;w���Z����u�V?)�9q����~UE����{��#�f�755�����z�T[4hP~~��={���W�X1p����8�������k�������?Mo4���j�>� 66��k��M����[�n�'~�(E�D�vX���S����j3!!��1��5k���#}vhf:~���}�hNe�9�������TO��������W��$#��4m2���>}�p�l������
6P����:��P���OQ������P)(��l�Q�X��LOO���ec����2��������_~��b�����BCC���K���{��1��D};s���_��o����?�;��'O�����{����y�6�e�����h���o��)WI;����e�/���1:^&L�@��fI� �v�$A��47����&&&�F��I�W�^����?�2e���Mgp��������H_P����/�T���=��[�n��m7n����.v?��s���Ul��
�����&M�(���G�����������F�]�R��	��/�d�/�fy�������G���E�?���_�E���-[�����_�������>|�{��l

M�7o�T�=�DB���+CJ��Ql�f ��._���Xm�������_�y�U�[I�r�����r�J���v��$�����������(�9�����:u*�H��})�S���B�*4h�>�{���{��Z����{��@E�������/����������(p(}����(��'�����7=�������48����y����z��#F�n��6��@��SX����W(�����J	Xnaz.4h@��!A7i-�2��/UcK���W��Cc�t���Z��g��8qb���vvv���t���E�t�v����-�=iF�����,NW�����WS=]�R���G:��%5�74������-ZT�'4m����hnNNNf��b�'>�z��};w���������RRR���h��S?h:��A�tU�S�i�:u������v�������h����}��"�������C�h�^���f������!����W����6i��|I����z)U����su��CXTT������Fi���h���[r��M�6�i�������KP`��sg%A����"�����3g2��@��E�n����n�bT�T��}���U+U��_��vR��W���SHH
���������c�mF)��^)�z�h�"��`�P+((�����Iw��T�|�[*���^ �:	n���y��������T�i)!!�����~��2�Ox��qJ?�������lN-���6��3Fz5L�+M����T��5j]qfee������Q�&&&?��#��K�.Q�Tu�>|8]����^�x�jhV���o(��_��������O��iCCC�^Z���w�JW�4�/�PW�{����QE�wU��H��r�!�\��oJ��}�6���;_����o�������}���o��v����r���4so��������(�Q�2e�_�)���t�RvB=|�pqq1=��E��U{�����7���S~rpp`�O����"��g_�)O���-��P���������_�{����L���~=�_�i��}�]�����N�<�%�3s����c�u���dggS%��j�/�cK����A
h��4}�������N�l%�v]����3#�4�����U��&M�l�{o�r�.�������G9�_cee�H_�y��)WI)����t^���+�Y]:�s��ILL�4F9l���t�}1��O?e��Z�p�_�E��t��ty���n��\��D�����)]�~���+�Ht���S'�-��R��\���)m�}��f,���%��l�&x�z��d�����A?=A4�+vl��-��?
:�7�O�<��k��4w� ��Q\�Z1b�������]�v����"��AP�~oQ��os���7n�������v*jG��/�������A��Bq�F������
�U�F���(��,,,������<5N���J�_O{)��U�V��
tS.T�y���-��.��W��PE�@kh����E���I�H��e���+N�T��X(�z�())�n*N!�h���'U����G�z���}����>s�]m�E����������_G�dFW�<]��Y�����VNRR��O���b�&�J;vtuue����Z(��3Mc�����i�\����j�I�&��.]����C��"#�&��[���*.zT���g������GQ��M���������{)PJ3f��Z����������W��)��My��A���E��^DD�\UQ�v�^�z�z�����Z�`�?n�����s����WNLLL�
�~Y�h�>�l�2z����[`���m���XL��R�	w~�U=_�������T ����d��s�	&��������4{�*����f��{��Z6
\�v����+o��5d��;C'h:��%/��i�U�����d&7�Pi
_�b���l��1]���8�����(]�}��4�����{h��2�%��}��]�N�o�>e�vy��OKK��M���_��a^9r�E4��������6i��B������]���5_zz�b�Q��t��kW???
����49m�4�S���J��3���=#��v���===i�Q�L����T��jbe�����\���Q�S�y�9��>�����g��Ee?����S�j�U��I��q��g�


i'OIIQ�Qt�R���{N��iC�|����u��A�g�T=_�����g���x�^ �:}��}���eo���Ot�����:E����N�5j�g��#F���?�{h��5k�����~������;��+����w��\%�:��ujfffxx����w�}G	�������Wh�t����C�����N������C���			t9�jyZ���#CCC��������G	m##
4G��I�:t(��O�-����O�(��ja<xP���,��V�7;;;Um._���
5�ib����������'77��(��o��9s��V�Z������%?����m���W��?�LNN����k��I�����������I�o��F�{LB%����>�~uK����4"����T�Tj�}N�:u��J�Ki�~���/�����	ccc5��-p�E�����Z��b?�-�e��j^\����S333���Xaaa�~�)%����+}���K��M�^�|�2�?h]+��{��a�5F�"����}||z��1h� �Z�:u*�C)C4k�l��M���
�'Ovuu�y�N�tf����zH�UR�4!9rd��t9K-��|��	����={���[�Iq��O��c)P�HKK�3���DO�S�<�+�Kh��I���C��Qf������G`+��@�%�?��)���h����mVi�t�N�Q�)�����D���O���1�R��KU���������9g������=z��
?���}���� F��f�KU�j�2(���E���=P�O���,���v*5�>����Rz�!�CO�)��?��}K���������B��R&�5N�^�
�L���\}`` �.''G�K���/5cKC1z�hU
��fS���Y4p����d�C�ttt�{������&����j�Dqj�����M�D�gh��-U��i�Z%�x�@����p��b%�a�J�M}�����T-�~0�/I�0����h�������GR�M�QR3k���������2����<��g����Q�S�y�9�|#�
�V��a�1����N�����H�U�?��t���/UG7����D����x�E���~��(��%K�����hU
@�(y�<y����C���/,,,���:!������������j� B@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :�#EGGO�>=>>���j����'O�J333�D�-s���f��]�x144������������
�kJ���c��522�UDDD����b			���111T��V
Pzzz@@��U�F�����v����TnnnRR����$�������=;88�b�����������5j�X����d�����<x�w�����T^�|9�@uW
Paa!�J?T���tww�y�f��M����5���hcc���*w���o����m�3g����X������B5���7(Q���������F5@c��a�����~|}}������G�}��I++��'���^�~���@77��W���R�����b���Wqq1�,**255���\�2"""  �jf���$P}U��y��Q�>}���7n|����#GR������?���������cll�-O��j�-(]@ie�v���]K�*::z��y��/^<w��i��5m��V�6�B�	@.\2d��9s�W�4h�a���:�5*22���+##�{Hzz����sss��V���9r���������]�v��=���:u�dbb������G�Q���g_1�
�p�����=�e���]��5III>l��-{�������y��.,--�������������Q���J*S%�LNN�����'�,�H���������F�����U�'D�oe�(77w���������s�N��=8��s�����[����������`��eaaa��;z����Ki�]�v���R�Q������G��r��666�4?���5h���777��h���������/W3a��~�a������KJJ�S���=z�]�������f��X�y���
R��y����(�PpQ���J�{�n�w��������I�&���,^��5�������*��������<w��\�����/�����nz{{���@�V
���@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�@t�G����>}z||������S'O�L�/^

�y����}xx��a�TU�U�Qc��522�H$zzz�XBBB```LL���1�T�����j��#F����]�ti��}��m���?{����`J$���^^^�5R�tss���XS�G���:99-Y�d������wii)��/_��P�U�TXXH����===���o�����cllB��;w�����m���X9g������J>JWW����j��7nP����A�K+�����a��1l911�����oTT%!n77��W����(V���~�z%���U\\L7���LMMi�+W��������g#	T_� q=z��O��������qwQF��R���P�G�k�n���'N����7o^hh�������;m���M�������U��@�6���C��3g�j���yFFwozz�����J~#������#G�___������k���3((�S�N&&&���yyyT���~�#���(���T=���g�l���kW��y��.,--�����������WZ�o����2U�����n���8q�����:���.��-�������O@@@��(W�W�A���:t��u���C|||�-[v����G�.]����Y����k���+��z�*,X`cc�H�S\\\�
hyss��= �j����{����}�r5&L���"##���g��E	f���
6���V��7/((����?������8p {3<<|��I:::�/~}�B�h���������������L����_�Qd�w����}/��j�������Pm��`��#+��c�ji�7�@�QR�������D�]���@t����>��x[>�'Y�}�~��������4m���B�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�88p`���>�H$\%�v-�8M�4���������-E�T�N��C�
�&��@]�t��������H��p�B333���7��h���zzz��	 ,����'�������R�vm��@o���k���{��ySS���\__�����

�M�BBB���������)�Y�f���v-�8%''S�a�����'O^�b��������� !!�����ohh(H��W��6m�������333��M_�r�Y�f/^

�y����}xx��a���Q��beAA���c���h�'�i�cbb�^���8��3�}��o�����]JJ����7l��y�&L���l��WSTT����������URj����������)����{yy����_�Q�F�����NNNK�,a�����wii)��/_��P�	�;t�p�����d�5k�8;;k�����O������IOO��������=
		�r�������m�6�d���b���.�:�{��
@�V�����������%�_��_��| l��~�j������G�}��I++��'���^�~����[��������G)]���F�����������djj����r���������={6�@�%Xrqq��������]			B��cdd4r�H
@�������������rrr����e(�P
�QJPZ��]��k�R�����7o������;w��iM�6�����	�Q�z�~��wkk�E���W�_��9�V���A��E:t5jTdd���WFF�Lzz��/1���+.��������#����o|||���{����S'������<*p���?��_TT����i���x�����s��q^�`�]�v�������:QP�����~(�Z8III>l��-{�������y��.,--�������X����.����T�H����[�'NPY"��_�����(��W��p��t�N��lgg��c��T2
�"""f��Iq��vRQQQ����Z��;wz��y�����;���l��u���>>>��-;v����G�.]J��������������>�E�,���a��)..�A�����yUl����c��3f��Ak���*)(XYYi��D"133c�q������O^.5n�����:u�P|���-I���5�b�������1o���� �/��(�$�w�����4i�������5�(%$YL�	Y���1j����dB~����]��*)UPn��Y==���|���Rr������:�|����V�R�Mooo��0�*Q��I�HV��)c?A�����|bb"��;w����0����_�P����dH?�\��q�vg�A�4r�H77�q����3��/�\�~}dd����i�X�����J{Wf��;#��t��q*,[���������C�9"�Z4!p����w�^��
KKK333k�����CaW�!���Y�����������t���A[[[aW�!���1c���kaa�`�����:T�UhH�$�H�w�~��1F�[����q���������m����@
@�  ���z���]���gcc��i-��A�E��~�z.���@m���A�	�����j$I||��k���(""�+gee����E���@C��;�o����W�^�&Mv-�8�IKK�w�^���eU�g�JKK=z*�*4T�����svvvrrv�����@...J�����1 x��v��I�����7o�����gkk����~�z�V �����;v��K�.q
������c��)B�@s����III����������LaW�!���	���}||lll������'N�(�*4$p����x�����T�@������v�����o@(U��0�@����+++�Z�:� ;;���b�Z�:xDG��� �(� �D2x�`�w=|�P��hN�������>�#X����PMT)�����O�<���.]���	��
��.|6�(� ��.�0�������>�P@���S�l����M�����Z���� �����t��������())a�a}3Smw�5,������9��O>j �!��y���
^-�Z��1mw�5,�X�B�&66v������P�D�tBBB�-�����[�+�����?~�����^YU����2��������� ��SV�U�������������+?������I�j_@��a&���As��S����
@_~����R���/���J�v/��JPFF��������!R���d���v@�@��];v����MMMsss}}}#""6l(�Z��K����r!�i���d����g���������������co�PHHHPPPtt���1�5k��?����������Ln���X����joj��KL�*Y�j�bJ-x�������������~��z�h�?UM����L��-���N�<Y��JH������+c�D��Q!"���NV����Yj�75Ka>s5FV�JU�(��S����-��x!A�'p200HHHpqqao���
�
P��1����\�S�~�V{#�'9���>cm���T���O����1����7��h��9���������RRRN�>�a�AZ^�z��i�.\��\�x144������������
SU�W�G�;���H"�DDD���1�������zA6
�XwMV��c4�jW��8Q>�����C����}||��Y����y�&L���l��WC����g��D��������Q#�J77�WxTll�����%K��0����������/G�F�c�0���k��!���S36��������i������OG���
�F#O�vw������'eCzh�O=��������������jW^��_��_��| l����~��������s�������s��}�m�F��9s����tuu�7���7nPZ�j���G�.]��4�z��d�,�1
��Y0=���c;�r@�Q5*�f����f=5�>zr�-����Z;����i9e�j`���M�C_���/�����#>	052�m��g��#[�`nfUA��3I������e����0��r�<�e���Z��jE�L^��;Q��d�eSC|qDP���?���������6K�G���������M77��W����(V����������fQQ���ibb���+#""�f����IB�n>�|[�;�c{�4�W7�]X��-��4l��S���\;��K?,c���y��%%Yy�l���T����&?����l�#����5�����
s���>�wj��*��Dj����r��Li�w$��0z�~;���fl�w���_�����<���*t�+=#\��x�#�[^3�]F�E���;e��W�H��A�����6h�&����O�����p������*�eRe��g-d�7RV0�����^������E����wi'��4w\���QS����XC��l�E��<��bJ��x�-X[�ru�|m�}���y22A��S�\�wT�#p�4i ���UTsrr������Qr�+_�Q���[�v����������x���s�N�6�i�����qqqvr��[��JC}�Pb���<YB�+d[h5��K��'3w�=i�����d�<��b���u7�7�LKG����^��v���x6�[�f&�����z_�6�G=C��-]�4s�q�i�����Z�Y�.wrr%�E����,I��A���������!�cyk��~Y��U}J�x������mF��U��)a�%]����E�;y�a~aY�vH�������=��o���3(�8�
�����
b+m�5��~��q�<����SA?W�9%���iKi�V%[�MJ,� :11c�eoV����Rb��cVlQwG>[iZ������lr/��4c��g��=Y���Y���,��/�d���������7������q�[����{�(;���;M��u�U
I6#){���2���(jo^����Pk�-o���N�6+c�t�������������l��1F�:
But3����d_?������+{�#p�S����]V���yFFw3==���Bi��=������#����o|||���{����S'������<*p���?��_BB3#�t2s����l������������J��oV����?<�����ik��@�p3=��m��l���/^.��u�n��'�l�X���D���o���&�}��\LC{��������\��<����i���!����'/G��I?��z�[68w�-���������xV�3�)YE�o��D����������i���:/�[��\[���_�n2}��U��
]�����5�S7���7:�](�v�����2In~qf����V����'��R����:c?7 �S�����{�%eI����/���������m+�IN����|nz~������%�����Z�v�l��V�3mdo(��?055�k�V��f�Q����Gn�/��}�09C�^���n�����u�>��J�B&s��j#Y�7�Xl��F�
44r��G��L����'U:o��l�8tD���>[��"���-�/������`���d��3���%e���l+z4��if-�@r�m�|f���w�`����������j+�����~����{�����m���ze�Ln|&�(�1��k9e���od�e_�uQk�G�
�����s���C�/C�����IL-((.;���sW*7n�HP;z-[>3��6�����Rn���������d�x����o�&�����
��-tb����u���~���r:���P_Gn��������B�G����y��}}��Qz2���iJbO��������?�4�����w��-�M���+;�����_�8�� �yq���o�R�J;C'���d�9}$5�H���P�.]h�����YE��7_�p!]#�����t��o�^i��=��T�H�n���8Qv�#�H���������#��L�b���.�pX����p���{���U:;;Tv v�<+���2������)���wg_5M�f��g���q��9������'y>��}fCcf�gl��i�N��S���La��@�������);����2�o����3��N����|6[��U�lll����7]�Q�����dK������CI�����r��-2~z�
[~��]�S�r����e�l������|����g�O�#��;��mn��+�D}8�-pb;��G~A��3���wsi���M~��HPY�OYvvt:��
H���k+����1�>$����gY�=d���o3������=�f�f���
�����rp����83K6�\�[��an��w��
@����q�v>��QO��!���A�W�u--����b@��B�@_���g.o�rC6\��u�D��m2��U+�Z�����f���n��e1"9�Y]��crd���l9t����e��D�/I�����l�����W����J�5�������={g������r9B�s;C�����{#����ee�GO����������7Is��.��=�6�]�����L�t��6��e�l���0��ix����?"���b����~���5a������6�|��C�Y�w�PR"�t�����C-��8�B��PPa�s1��<���]~���ct������_����A�{������8_���z/6���V���"�|��i���lVl����b���~nz*4������*��cO���8{{7[v=)��u��SD\��t��,X����r'��t�N<�b�r/q�����i��w��m9��?F���q�,�h��A��?�7��o�O��+�S�u\����QV��R*�?�Xw�Y^�o7�#��O��[���=��YP�Dk��@����?�������`��eaaa��;z����K�D�XI���������K=�E�,`�`j!..��������Nx�v��(?)�
�0��T�Qu�fnH_�7���H4�3�����3?�Z�a�o�3����R&��e������g<�1o8[7����+{��T������{M(���=�R��E�[ui���5^c$��:e�k���/�+�3v�������:3�G9������e���v���������7�
@���g��5��������aN�{������G2���=~�u�p��eE�����i�����G���#B�������Q���a������V{D��1�d�_X\�g9eQ��y��oe~c���}e���@Ai���J�6~���������cly�c���H�`^Qj���y�AL������y�)��l\�Ue�WP|1^����J^e���|�I�N�!������]��nYy�}&�,OgJ��"��63�T@�L��q�F�5I$i".�<�����O��|����H*��5�������8��r��yAAA_(�T�Qd��������]-<<|��I:::�/v�N�����$*={�_�a��)����5X��t����r�D�����v
s���|��\^���������#�S�M��v��^g���C�)R������{��^���2�����u��++���!��gb��y=�vLGuK^����������6q��[ �(��<���Gg�����E�	�������������*����y�i��wE�lk��L�_X|���U��GMz��@���_vP���}����s��U�������(2@��������]K�<?��S�O,���W������#�]<�gn��K5I{F��]��)�ZN�<��^�f�&f�e�iT��*��L�Nd$������]�CJ��'��������e���_���R���vhU�I��J~��9��������o"��3$����)�p�V�g�?^�_�����~	[�v�$�y�W&��AU����-K������7��|}���lmw�FKM}��p����j�R3����Wv���A�>&W���]��jYm���z��[,�fS���~(,EFF���?**��?���3Y�Y��h���N������gT���uM+�[P��F�}������{yy��U����n
@e�?���_d_��oW���$��^�����3oe�����l��{e��W��+#`1b���ozz�����#�R���)(��xS����[y&Y�o��e�b���R��k�PmTwu�J?������@e�!h6�ddd�����][���j��z�������V�(�@��];v����MMMsss}}}#""���
�>w`��/��'a�{�|K���a�Z�H�FM����mwGS��y��o���b{�!Ym�}�u�M"p
			

���666��f�����<x��GB��{���lc�_|���NC�v�f��J���QVN����e]�v6�N�y((�	?c�����\����Z2s�g�<��[�Prr2%�ljj:y��+V�
xc%>J8{�[�������?������`nf���@@			eT*>>���P�U�PB����G%����uJ��'�N|	������}���z���.%%����6lv"���q���+��]�j"����+�r��~�z8v�����C���>>>k��qv����P���[��'+�/@u!���_��| x��f*56���?���?���*��N�������x�D���bccS�xe������K�������&$$4���>|-��1��^��K����R#cnn^�<s�w������V�����$X:�|��e?.�s���/�����~~~@��Jrlz���,m����|�o�<tl'[�:�[����	����S�^�o�����=((�m������n����j�,�����?����GHH������W�f�^��Z� ����A�(����o������o�����E�T\\���>e��1c�L�:�^�z_������������ft�J�v�KKmw@�@��/������.**���X�pa~~~��=CCC����ZK�e��h&7�����]��5���S�.^������
t��A�1�V �PAA�����Q��������M�R����W_}%�*!X��q��m���9�����S��2��@������B�Pu��P@t��8����/EVnf��h�75�'�v���de{w �!�v��LR����dh�+"�����3)�de��6{ V@ :@ :@ :@ :@ :@ :@ :@o�?�\���@c#��a�k�;5������_;Es3+ � �� �� �� �� �� �� �� �� �� �� ��T�dff&�H��W�\i�����CCCo��ioo>l�0�G)]@����`���FFF����===Z,!!!000&&��_�����k***���MJJrpp�*)����������S����������/��Q#����X''�%K��?�����{�.--������~��������_kkk~ett���qHH�;w���o�m����3G�TP����uqq������V�Z�����K����P5�kJKK���=z���'���&N�z��uwwwn77��W���t�J//���bF�R���ibb���+#""�f���HB�Wu
@FFF#G����o��?������)''����[�����t�����[�v-�����y��Q�Z�x���s�M���iSZ]\\�k�L�
�55h�`��
l�C��F������������IOO����?���\q��~~~G��}}}���k����g����N�:���dgg���Q�{�����W���rqq��~F�uyeZZ������r������GEE��7R���[y�������������23ep����b�����U��~�N���E�2�[�/�W�����o\�G�k�s_,����"}]��x���[�E%o���;����
)YE\e*�Qe� }Zrr���
u��l��k��u�|�/��>�������=�ebm�����������E����Y2r���v�T�v��r���#����d�P���'��~��d�V���c�[�iP> ������Up�q�n� �W��A���n�n��
W��fff��A���Xo��'��W/�����/�mo{�qp�����Cx�.��Fe{��HKMk�����t\�������L��@cv��}��"�Ct��PzD���3-�#��#��������>z���e;���������b�="����:V�	�y<�zn�Tn�t(��=�y�my������wDp����?����������f/�L�*5?��TheQ���g�}SO��.]���g�W��������m���YXXhhh��y��������0�c�}���G)]@i%����N��u;q�Sv���_��������������O]�����La�hmeM�8[icc�d�o���m^y�������l�j���S�lff����^bgg���f���EL�Niai��8e����9���u�-[[[1�5�K��ekg��V�XZZ�0egc#c���7K����GYSW2;o���e2�1%�uYY��v[�'�=���]����k�w�� 9��pC�1j6�y1 %e����)�(;[������"�z-,�i�i��%7��n1�����<H�pO~@lmS�;�����5�v�Y���3��������
)s���B���o�����C����3����;�<mD�-?	H��Sifn�<��`jJ{H*��,u83K�9\�[��a�����+�4P��;�n��G��bn@�f�]�������t�J{1 �[�o��c�#���GDb��1�d+k��l�&���ZL�-n{�#����;[�w]:�����I�ack����;c�b�����Y���������b��]���dH7����?"��J�3����)`~��V��ikO�#��.�����'�Iy�������m6��C���/;�������Z�H'��v�A�.�mB)�$�4;����/����xD���Xo���|D���)eO�t����������0r���{��"���O�t~.?+?�g��1d�����{���eWT��u���y���{w���z�5��s�g�����sLL���[w�����c``�l�����c��=zt������]�\]])�(]����bQ�����Z���k��-onn��MMU���S�����7.))�N�:_z��A��������f��X�y���
R��y����(�PpQ���J�{�n�w��������I�&���,^���o2�� 2VJ�������sr��/_V���J2@��������Z5@�DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD����/�����y���><<|��a�Y@����`���FFF�$""BOO�KHH����z-l�F J-����={vpp0�///777�4j�H�266���i��%���?x�`���KKK��|�r����F���hcc���*w���o����m�3g����X������B5���7(�Z�����K�.Z�8L�
@��_www�n���]�z��lll+�������fQQ���ibb���+#""�f���HB�W�
@999����M
.TS�J+��k�v���'FGG��7/44t���s���6mZ��M������*��o�����lY�S�/),+5�a����v6�l�~�[0iY�aY
������
F�/z���y���l����8?���`��������JM��r������5kV\�lj�
�,�z����kVbj�x�++0�leC3�~z��r���o�M}{���f3��8������[�ko�5k`��4o,[����������_�Nl�c�uw����7����j�'l��S�`ij�5�d��������e�����k%{��m\���e#��b���.2�kV��[S/n�j�_X�}]�2��fk3��6�T�_�B������k��M,�\,�
������������&=��cM�
��)�Z��L��l��������8[����kS���lY��f]]<�fwu�hX6���������l�.5J/���Y���Y��j��+���B�r�����!�l��.��-�2o����we+;����/�3
$��3dO���C}�]����kV��[���/b+[Z�X��ul�QIA�����g���������h�R�E�����t��L{����U?C/Y��G�A�z%��C�{��#B��6��\���)���~:��N��K������:8���5����2��55o��9����f�������_+_��D�*)�~Q�ad����0���������ma�j��GD+�l�s����� �Z��<v��3d����F6�R����#��^�O���#��6c/��9�e��e����<���N��u�#�a��s��s����Yg{�^v�y�1iV�l@��,f�������2�2�="z�mD��������[c�'��
jix2���f������{2o���8������322�����.��������#����o|||���{����S'������<*p���?��_q��.��`�'-:���X��s�_Q*`���Ql�����Iv~�����5{�qy����+[[�j����f���N��4{�qf,��5[�-����D�Y���f������-�����^�2���������c\�W���r�f2FQf�����Y*q�wH���wR���������"F/����x%�����}J����"nx=��.?������+�O�X����k��e���o�E�/��Z�q�b��}"�O��\�	���\��9c]�By���f_����%)���J��cy�[�?"L3����c�@v�����+6�8��;(kV&�z]O�Y������n����Y�Q��[�%����\�y&�rDP��PwD��X����������C���u�#���?)=��X�5���o�LqEG�3�
VzD��5��d-D�8��I'���>��w���N*6�����o$�L�����y��������]�����o����VR�*�frrr�n�N�8Ae�D�~LWW��������:C�b@@����f�l�6[u-�Y4[�����l�6[��jT���100X�lYXX��c��=�t�R���k���+�8;;+}�*,X`cSvD-���5h���777W�x���D�$22288x��Yk6o���aC��7o^PP�U(�$�w�����4i���������y �������s��*/_��~��d�w����}/����*�TU���xh�Vi�U�2�E�����k�j�Y     -[�z��i�.\&T������O�������:u����i����3g��{����-�?a�A�eeddxxx���g��U�4hff����+W�4k�L�f��������744��;w��m���k�������bjy�����|��az����uuu'M�D=��M��c�h�s�������K{���Ik�G�����7o�������
&H��*5oY��N�YA:U���A��� �b��tr�
u�)�V��N�Y��8��� ���_�cMi���n@�D�\fff�-l3===  ��h#F�����t���}���;W�H�?~��{�m����.���P������d��)FFFB�VTT���������P��/#$$������'���A����Y����F����raaa�6m�����LVV���������eK�j�N�4o999������<x��}��|T�N�����QPPP@���=;888&&���������MM#�iVU����SlV��N�&kr�)6+�A����t��
r�)6+�A����G��]�m���h�v~
�5��6o�\��
H���}z����l�f��af:����)�k�JKK#""��:����7�
@��7ur���t��A:x�_kkkAZ�<{�,22�������
4��'a�'�~�-����{����@'b*��W���������|����u������Kx{{�����_T<
�"�F��=*����o�m����3G�fUUj�aA:�f9�Tm���b��t��
r���_��SlV��N�Y��8��hNN�����_�cMi�...��n@�$��ZA�_c��a�t	B�{4j����.F�u�:�j��w���Y���6i���{����C��6�����~��I++��'
��]s899�\���_���?~���S5o����#:����i�N�t�H�J��4q&$$����2M�%%%�M33�[�n�rk�G���������KR�E4oVU��-r�)6+�A�t�5?����SlV��N����A��� �b��qJw���(�4U;�����f���j,:������qc����u���#mmm��YCggA���G}D'AZcQ?�\��o��?�����������Y:�?x�����<���~�m�"��&A�L-ZD�M�����fhh�n���������~���B
2].���e���C�:t�&<�v{a��455���:8�p�U�A'���E�=��b�W��P�B��.\�0d��9s�pyY���+��������J�����wS��k;:���A�
6��:�5*22R�s1MBt�`_yn����a����'��877w���W�\�5r��m�����;w�L���={�IS�O�l�k��O?�t�����hd4o�cnn�����LOO�����*��]tBqr���Z��J�p]@5���g�\I�]�v��k����u�N���������������=>>�M�t(��#G�h�lRR�����m��,,,�+3
�$t����GIfff��ui��e�V�"�����G5j��ANga:<xP�D�w��}�U�V���B����ixutt�flllU�Y,,t8���<�4?�wQ�����U5+���j��:t��u����D9r�H�������{��@�"�7K�b���W_�	T�����s�N=�3QLL���[w���y����������d���w�n��]���S�N�i�F���Y����4��i�����g��q�����E��sG�Kz����O�>�������In��eaaa���Ie����/8t:�*:�4?�����hU��+mV�u!i�D"a�i����?N����`��e��������D<a��~�A�f;u���O?Q�<ybiiI�e��o&�-�$�z���N�:t����C����

�U������Y�z��%H���]mGGG�Z#�����C�a��;h���'
�������
�������������ZS�����H*��e����6l�y�tr���S��������q��������f5<�T5��A�f49�T5��A��Y
�8U������/^��������zK��
Hk���������KKKo������Y_|����UQo���K��7K6m�$x��K	�,)�y;��OO�s��	���G���5<�T5��n\�I�����[
:5���A��Y
:U�jx���4<��������Yag7                        X~a���������Nv���{��5j����H__�N�������,���7]z
�������11{��ys�0��T��3N������ZNafNA�b���������t��1,,l���J�
���o'L�@�
�O�WS��X����v��I���G����n��W���'���d#o��?c��PR��Z�{���*))����*!�an�*����zJ���G���M�6uttd�d�������B����f�o��+4�u����YU<�T����x�B�����^7����Y��+Wn������m����iS%S/�@��_O�FFF}���p����������~111S�NMMM566�9s������Y�|���/l�������t���G�Z�h�h��]�v�h���-]��������A���uvv���I��Y�lYhh(�����
��v��-�j'T�����j�P�h��������T��������gqqq�|������O�������G�>y���w�rO���{�y�z��m�v���3f���Q����.\8t�P�n2�@�e4W���'%%>|8++�I�&G�m���K-��^����z�������^����q������Hzzz�>}h^4h��;w��m��U������w/Y�$((���?����h��Y��� 77������n��eW)�����?�a���ydw�n��U�����I��jFE(_�Qv��i�����+V0*�
�nnn�/�`��
7��>|H��B�{Rhi0uuu�Y����v~���c�����s��Y@  x#�U��������]�)��,&w���O]]])�P%M�t�Y��!�#G����������}����c�k��������		i���<�����9�+4[�����5,�0������Geo���M�����������W*��)���2iiiJ�)��h����)�Q��2e'���i�zv�G��\P�n���(�xxx0��]H�����e
L�{#��B�7����3�t�'�H^m1�{�:������Sj��
���k@.11��9]<�
u���������#""��s�kee���4����6��{RT�BCC���T��2{��2��Yc�QFY��Y�V-F���IJJ����?��g����+�����/�9?� �������������MF��M�6�������={�M�:u��-\}rrr������NE�4����6�edT������IMM�nR�a*���������)))�\�r��]���5V�N���Z�h�~����bm���u��-88x������nNN��)S>��C�Q�F-Z�h���Z���s'wy�v�������o���~�I���R�ed���u����U�K�.�n�:w����7%�g��1�������s��~�2������?�� R@ 0s��M�]��������,\����������-[�|�..0����[�pE+++��N�:i�����
���������6�X�f
U�$�.OW��]�2�������cC������TR�o��U#C�I��Q�O��RE�M�R�\P=Wn����?�HASWW�_�~4���������������'O�������_w���}���A�y5�}aE�_���&��YGGG�������l����b���KO:���M�6�?��}��.��";v<s��&<<�+����s��{��g�CCC�{���z�5e�����U=2����<��}��WL%vQ�~V�M��
�PJ�R�V��q�+����?�/�e��������2��X��������e������G=z�~W��~q�u��� ��LMM��_?u������[����C�+@������{�:��&>�(����������}�v���_=1�e���N���c���0�/V*
���o'L�@�
����w�^�F���������>T��Ky��d(�w2g��?D���=�Xoll�����%��y��(@��#�����C���wi��	�H��[�������7NII��Te�<q�D��Me?Z]�^�'O�T8gTr��8��\}��~@c���~4�5��P��!� w��������nS����#��]�f�AZ�a��������rLL���SSSS���g��9|��������gqqq�|������O�������:y���w�zxx��?�.������;�,]�t��m�n��1cF^^U�����C����l�2z87�$&&���4y4k�l����7o~��q�6m6m��=J�b4o)��&���U�Y�f���/^400��~��w�.]z��Q�--Z�k�.+???Z���>���:;;cd����]��
��v?
��^�.
PM!�v�4@'���O�m�622r��T�����O�6
t����U�V4O���-^�8  �������������9��Tnnnvv����������uuu������(j��_~9v����;g�����T���Z�v>�����I��G�6n��2�Q�O��1��t�����w�^�dIPP�����_��J������H����l����
�.��GFq����[��T�.
P}!�v��8����MAs����9bkkK�f*S������;�ggZ����f/*��[��4�����n�9��9����uww�����@�L�����>����X4�����}[�{�F��-,,\\\��_1)],--M}���(�Z���k������CBB��k���}�����:C1���G�����.�(�~J��wQ�����t���V�Z����O6l�V����������Y{{{��hy���34���t��/K$*�'Ej944���Oi�,--����.���,Va�_��6J�V]�N�~���^�:""��;;�������Z�?HR�G���(S����wQ������&55��I�e�����6m��Q���4�q7SRRh�a������
�����QR�j���gOPP���S�l���'''��_���6�h�FF�~�hG�.]n��u��9ooo��={F���u��w�������3e��?��u�����w�N���������9**��?���F����/�M%�����5j��E���U��;wr/*�]�v�����}�����O��������������M�@%_W�����a��?��#���������L"�XYY��D���&M*))	�i��(���������'O�������_w�����Y4�������|�f�D����2zQ~�FI���������6�X�f
UR?�����h����!C����?99��5���x[��2���m1���wQ��
FAg��J]�~(%W��c�3g�G���\��������{�oA���?��������3������'�[Y�bJ��T��e�U��%��������\~��=�788844TiT162�v�V����62��(�����+F�]�fC��R��.Z�C�A����>��DD���+�qB
j�IEND�B`�
bench2-dbt3-50gb-duration.pngimage/png; name=bench2-dbt3-50gb-duration.pngDownload
�PNG


IHDR��8�r	pHYs���o�dvIDATx���	\����F�C�����D��0A,o�����iQ����2���+�P�
S<��D�������q�KdgY`?�z����<���3�|fwY����u����7 P;@�v�@� ��A��j�� P;@�v�@� ��A��j�� P;@�v�@� ��A��PG~~~�6mb�:::���=z��:u��q�444$�!���...T���O7�O���o��j���Z������~��ukRR��������_~��cG�5�6���mffF�?����o�MHH055��������zVdd���k��;���3�v����


�������e��A�:uZ�f��u�+W�t������F�R�]�o���GzN��>H�Pw����N��Byyyrr��C�&N�H���?����[�Mzz��-[f��E9f���}���	��(DDD>|X�=��3�ZX�l���;��g�}���o^�~]4�����\]]��G�J###�I�9�s���?��35���&&&�>}�]'88x������[�dI�V�rrrN�<��'����;**������Kj���9C�U��m�h�CBB.]����kcc��.�! �����x�����3f���w/e����/R�=z������)(tb��������swEEE����,�����5�����������[������]s(��1��F�����
��3x����pJ?���������N�:Z����E/}\R;Oi�6y��7�<@e�l�����������7)�*�G ����q��/���E��+hkk��haaQ��
���Ek������$W��������OMM����7oWC��������TX�b���+Wr��������M����K�?`��$Q��>���C�UUU
4�^�����������l��B!�'�flll�~��)6)RJ�������K�����-��m�v����������u~����������v����:q�=d���5k�HNg��q�������/�vh�iX(�}��wl$e_l��/\�P�-0�����~��M<044������M�NNNtG������'OZ�n���_�7N���|@<��y����h*�5���"�������(reee���l������!C$����}�K�����g������kw������s�������g}DI��Wz\���`!uQ@@�_�E��KLL���3�RWWWVS�����K�._�|���)))���>����/�
EFFRV�;���#�=������mw��I����������9s�L-�)�{�z�aaa��m�������gS����RKZZ���')����d����������={6�����y�������F�q���f��Q���M�8E��6=1@<stt��4��7+++E�����k���{+r�/�i��9��O?I}�%777))����&~Z�W�^_����kNN#|�Kte����M3nyy�����"v}�����+=.JW<���s��}_��C��QD�p#������o��v��1�}���4C��"���I�hkk?z��8�
��Q����7m�����bJ!5$���LPP��ICA����/���%v��0��;C��m���)�R*��q���7o.�HQQ�����L���>G���~srr��]�h#|}�V`����|��5���6�xF�+���)F��Tll,[�0Ae??��g��}<YREEEAA[���411��=|�pJ?������~��)�@�_��)����?����W_}��_�s��I����jJ��*��g���\������+=��G��l��s�����Q�#uss�j }DD���������E��!&&�
R��w��J(2R��!���_��f��!�3={��j<<<^���=2����v��i����"++K�ys��
�@���\M��)']�|����[7.t�{����e�@��g�6m��^�zqe�^�������i����9�}d�E�O�>�9
4h��������-[&�9���l�����k�M����uF��G�V����h
g�#�DFF���[����OtQ�WDD���w���1��Y�eY����m�9s�p�eee�(�}i��Y!!!{���>}���;G�%��#��H�z�,��XUUEO��{�~��%===���>��6J����W�Y�fb�H���
 �m�����T��_��w�N?�^�*?�j111l��@������coo��Sj����q��K{E���JMMuvvf�)�"��������P444�~���q�*�%�.d=����������K���Laa!W������������Q����#F�� �cO�F��������)�P�eg�={���H�u�Vll����G�������Z�#�E�)����O����������K�wC�����Y(E���R\\<m��e��}���l��'O(��l�Rl�G�}�������D���>|���MI�w��{���~��M����T���O:��{����K[������4..N~�e=���H�X�>�B�LSS���K�/4�8q�[JA�}]����K�.������<�JHH�3������o��z�j.�����'O��3���,--�����l��^����
=(
p4\��Ogk(�fee)��1�
��hc_���JII��XX���c����OrRPPp���~�������w�������~���ZZZHOO����tuu��l�����w'M���5������;�~��������C�%%%-X�`��Q����E}��]�v--������_������h���m[ff&-�������f%?������X���?w���6�6�=�-e?�L��c���O��X�����}�������m;b��g������_(�t��M�
8�S�N��i�d}�Z�3t����$��������dgg/]���mkmmM���?�P^�2�)i��?���2�k�����ogg��!�@�Q��>���ys�;v���!k� .�y�n���i�&�\)��4iff��W������El5���?L����Omll<<<:Dq��RF����/���a52q����n������{S�Y�rejj*E�v��M�6��>�����2��O�>���gQ����j�*�g�"�+�����i������W����K�,177����(	5k������S����)=�Zv�����o�Q�)//��1��(��899Q�Y�x��q�._�<k����I�y�
�����I166���m�0h��={���CQ����h������	�t5�#�'��5---�
I]�+$k�=zl��YN��\�����W���w�^���+W�2E���0��E�<z_H�A��<�P���{�����q�XgD�QNg$��-!�����+�~D]t|(�.����]8;;���@�&.33����!!!�����.�	��}����;������#���
���+�o��� 4@�v�@� ��A��j�� P;@�v�@� ��A��j�� P;@�v�@� ��A����=|��}��YYY�������(u�������1c����
UVV:�O�>_�����������;vLKKKU}���'==���u��I��=W��g��_����+vvv��S���G�>;;������.\���q��-�V~����E�>�������l����z�]�y�����G��i����1c������>�������k�����w���8q��U+V�X�p��R�?���+9�K���6�>}J�9r�6���stt?~<-����L###jv��i��d�����������;v��jEEE������)))���b��:u��7�]�:|Bh����??�������J�����I�(gIg��0`�Xe@@��u�d�T�y����~���m��%%%�������9����244|�Rn�544h�i����������h���|�������z����0a�z�7n�8d�F����@��:<_���www��_|!u�A��cmm�k���B^^^T�������+)��F�-�X4C����,�?h��iR�l��w�)))9t�����O?����o��q�}��{������6l���w�����h��G�����^||<��h���M�o�����E9�a��?�NQ�d�MV�w���i�j�,Y��KF����t����G�����Fs�?�@�;���������3%{����&M������z���:��o���{��-�C��io���N�>�(c``P�A�
�Y^5��R��n���8����v��<���/_�v����J�@[[���K���<�������1��D};w���_�s�����[r�IMM��������������V

�}���;:t�*i�����~���E�E�/�g��a��&���^�$A��47\�z�Y�fS�L�Iz��a��������>|���4��������B-]_�/��U#{������i����o��E�1]�.^�X�N�*���Ajh�j����K>�������Zvuu����h��]
44!}����;#����O�����###i�����������i������7of�����m��<yr��Al

M����R�WYYI���+CR���l�f ���\���X={��������yi��9[IK��rrr���_hR��1�5���w�EGG����������iM�p1����P<����k
I�����~DI�[(��P9rd��uIII��@I������g�}FM�9���SQ����S7DW�7Z��9|�p�*!!����G�R�1o��u���'M���{wz������
�f�y�R������V���M�6�D/$�&����7����K���:�Z����Jj%A�����111S�N�������kenU�y����t���fh:���8]��&����z�N�xA��t�Kj�oh������s����	Mt�~��1����������I]=�����������2JT7n����N�T�����e�O}�G��_?�^SS�o������@SM'�;Mh>x��7��N�8A�����kf�.^�H���M�RV�d�I��K�����{�����G����e�������P�(
���}����[r��:�4I��}e�fM�%(0������ F��B��������E��{���E������o�fd�T��}���k���R\�������RIvvv4hk��
���C��f��R�;B�+�\oW�XA��j���[�n��I��u^�|�[*GDD A=C��F'�m��u��)77���;���T�i����666����	�|���o�>}��{i;o�<:�S��+&L���^
��J�d��)U��L�2��8�����������f���^��b�����o�:O+O�8��zG54+|��7Y6o�<x���W��N���
�������R���?���i&f_��R��y�}��f��ZmH��b�!�\"�oR��w����;_�����}�������o�����_�V4_���o4s�����\�v-%0
�T�,B�KtJ������\���PO�<YQQA�r�A���E��t�R��~��G������S&u��H*��k���2"=zv(�xxx�5�u���Y*U�n�����A�������4�o��]l���{g����
���/��b����������

�Rts9�����NRY� �T�fb�>
�=J�B��};�.�E��3#�4�����U��&M�l�{o�r�.�����9�r�h���)#|i����\%���g��yy���gu���������)�Q��k�d_����O���BCC���/���K��������L4O����PBB��k����
�_�~�[R��<&�J9}��&���X\
�K�#�2M�4�r���RRRB�&~z�h�����;��
th5n`SSS8�=R�;ih�(�q-L�4��:&&����7N�>]V��:���-��@�mFDD��u����go�������Xk�gn���bmE)��&�=�!!!/]*�<��(&ZYVV���G	Lr}j�.(����h=����[� *�M�P%���?����^�DeC��F3�(W�XAgO:E�U,{�^q�����B��D����*���"��
��$u�VKII:t(�������st�M���/g��}E�uJf�������������o���������.�i����o_'''Fx
M�����>�4v���m��������6��kG������9�](�0�hRYY��)��*.������O?e_�EQ��M��������������	(�M�6�{�^�R�-Qccc�e��_OS2u���+
�$�{��=P��[�R���un�6l��g_=�aB_~�%�?c���'r���_*&66�M�6R?�,u4h�Y�j=�����0g���={R,�XC)����h�e=_�������(�+���d���>{�l�y��a:c��EW��/���}0���4��i������'�\y���q��)�:A�I�.y����\E�2f������!M�?�����l��-]���8����~ F��nnn4�����{h��2�K�>>>�����={�����O�����\t��3!!a��-����S�(�QO�����i�fq�+�H,,,��uY�D-*''G2��r�P:0`����)�����?���Tn��B����o�3��o4�[�n��H>L����d��rbe����_~�����S�y�9��>����K�����~(�����,���I����$?���K;yFF��EG(qy���G���7o�LOP�>}�~�H��%l�={fff����!A�����{��^���\�v-�+i"�)�N�����5�GG�C�M�4������C��%K��ljj�z��'O�L�>��wZPP���$VI����t���������w��D�&3Q%%%�+4���l����������4��d@3���w�r\��t��'O��v��^�lM$�a��9�&N������M(?�X�����#���{��u��q������[j�,--e��f��~B4����i�����/^�(�M?EEE���)<11q��E�����OM��YZ�������g�V�������t�z�ox��;�����������{�k���o���=��B-�>�����=P��4"����d�Tr�}���-�S��R���o������SP�<���/g)���P$=}�4�_����t��U���t<�sjhh�}�+((��O>���|�r��z�������+���������2��'O�d_c`�/l�����s��!���]�.X�����!:v��m�6��H�y��999��N'n:�����|���*�M��N�:������,�LssLL�����?�����	q��W����(@dgg����ct����Z���%���4Q��u��	���(3
8�b�������������~�@#Jj��f��immM��u�rXuu5MT^^^�D?f�W��R�[f�}�Ym�����w�����lG� �~��>���?� F��fZ$�e9�PJhR�gM�(��'��g�bY;��g�E����hH)��S@q�F���>b�����yv(��o���+�L�W�8��
�<(8�2�42b�c����+,,�����K���PL�:UV�J���fS���f�L�}����)Inhcc#��C���97Yg����%�SG���m�%�>�@�R�Z�O�:!�E�����K�����k�7�m���|)$k}��)M�����������z�� ���%9��q�F�,koy_�-��\�����:t�dd�Tr�}=��ai��FS�
���J�6@H�RWWW�#�R�Z��%�������c�_(�@j�.*>���K�T�w�(YRF�����P?��%�3g��O�1��>����_�*������N�<��>��������@� ��A��j�� P;@�v�@� ��A��j�� P;�#���v��e�������qqq������VVV!!!&L�U)�n[@��8��������rii������K���ccc���\]]%+������4I� >|811q���O�<��������Tvww�����{7$+����F��4I
=egg��;���#{��ek\\\�����_�nnn.Y)�N���&���9s�|��NNN\Maa���>w����PH�R���mMR�@|������.Zidd��������166�Z��V�(&&����������U�������w��i��-#�#ts���������T�����S'�J���� +SSSooo�F����j���i��+7����������u���������Z�*(((***22r��������������(�xzz�~+h�t��"KXX�����%K(�l��������V.[������+mM[�	@�}�W������V�Zy���:lM[�	@|A��j�� P;@�v�@� ��A��j����`[���[��Z��3�$@�w�)[((.WmO@y�@� ��A��j�� P;@�v�@� ��A��j�� P;
=?~|��E<���X�p������������[���k;v���LLL���
		�0a�XSRWx�V��4�������G���g����.]���tss���[QQQZZ���5�fii������K���ccc���\]]��������(+��K�{u��Yly���U���A�����[�R��r�^�:v�x���6m��M333�5��������������{����`�+PA�V�D-_���F�����H���������_P+
:����=�
����NMM}��7�������N�z��SS�9s�&$$���p:;;_�~]�)�+�����
@������'R�����i���k����'[XXl���"����&��;w^�x���������P__������jD�����rsscbb�:���������9I�������8�6g.�S��N6��E�����������O�9j��-[������3e����0WWW�+�&999�����I� ���ijj���-���b5���g�uww���R�Z��T$,���)������9��E�{�������7o��M�G[[�w���3>|�_�~���={�d�)++������Shhhuu���U�������6%u��nMR�@����'O������HJJ�������?t��c��Q0�����k��}�<==uttV�Z�r�Jj���NNNt��`oo/u+h�t������k���SSSMLL(hjj�Y�f��iii���_�B+�����K�,�X�}�v�\�l��� 
:RW�Z	M[�@d�Pm*�u�v����+W��_Aj%4m
=��q�r�x�*������7U����q+()�.(�BQi����h ��A��j��t��LR����+��S��>!H��������1���L������e4*��\A�*_�]~ �VzI���Il��
_���!�VIee�������j;�@���DX�1�
Jz�������\��z�&�m��F���5,@M�K�Uf�FA��%�������bB�Q��G/  �Reh��USv2g45T�AP/-����)����RioT�� P;@�v�@� �/�v/����JKC�v$!�/�(�-��F P;@�v�@� ��A�������-Z�������=�*������BBB&L� �RT�����A�'O��=z��=���t�������[��]}}}�.]������������(Y����5UZZZ���Ij����z����~���W��;��u+;;[__?  �*���}||v��M����`�����:lMR�@����G��Byy����SSS�x��������p�8;;_�~���\�R�����:lMR�@�]�vM�<���b��
�
������B�����a�������������������7233-[
�EE�Rn���LA!?/O��.h�T+�����l!++�-�������e��������Pj��F�&N�8v�����~�M###�&����ccc�����a+SSSooo�F(���@�:������y&(XZZ2�C*pk�2�R6��H6��wo�J����{��Lcaa�<�4k�Lr�:���T�$�����^^^zZJ�]�y�)t�y�����G����M;=���0aBhhhuu���������S'�J��������Ij�(77w���IIITX�p��������U�������"##W�\ioo/YI-8p������+mM[�@���[�v���jj���	����MM���0�\�d	%����;88��R+�-[���G��N�����A 2]H��[�n.\�M��+W��4m
=��� P;@�v�@� ��A��j�� P;@�v�@� ��Ahr�U3O����2:6*�MC����2L�����4 I@�v�@� ��A��j�� P;@�v���#��s�5��Y�T�}i@����{�rPa`QU��i�(::z���w��155]�`��y���������[���k;v���LLL���
		�0a�XSRWx�V��4��������n��I�&]�z����M���(--����[������w���������^^^�������Wptt��4I<�������|��guh���l��5�~���[7����:�M333�5��������������{����`�+PA�V�$��V�\9}�t9+l���n���z��il�����~������=u��3g������3'000!!����������E����������I�!u����������K������#F����m������'O��s���/zyy������s�P�hRWx�V�$������gqq����������u��UVV��=����[��(?�7.88�}5�M�6[�la���g��)aaa�������&999�����PO$W�Z���E111b�	W��@#���o",dffZ�
�����53-e�
�yy��\�pA��Z��LOOgYYYl������/,x���L� ������
�v�a��C�~~~vvv����RSSmllf���g��=����cw��1`��&---99�g������2]]�N�:���VWWkh�� >>���M��+��������[�J?b5���g�511f�	
�����
��Z����L���E�&&�������d�R����^�� �XXX0�5��7�k�id��#(XZX>e����|�������R{W^�E
����g���W\\���&%%Qzh����m�?~��M\�!���:t��c����cccw���o�>OOO�U�VQ�������\�r%�|��'''
:RW�����4m� ---

�'N���������Z��z����#>����jf�����?�Y�f��iii���_�B��������,YB�f���T�l�2???
@t�� ��6�P�~��
v�����W�����n��)���1c(HI�O����p��X��+W�� ��6���M�:dkk�������7o�}T�A�-����3��9w�\�Z��}��R�+**���o�_<�}������'&&����iii�7o���T�q���\]]��/_��~�#�^�.]���?_�����g�233���lll��y��@�x@�g�vqq���477�������3g_�����x����~����YYY���-[���(o���� �2���;�|����d���A7�jx�����f������;���4w�\
@...���|�	J55�gAa.B>�}�����N��-����?�������������W�J�[


544466�*� h�x@������_�@}�0�v��gT�5���GUwG�x@������fdd�h�B�u h��5�
��S��"]�}����7oN�>����EEE��u���_����������Oh��
�f�:~�8_�������N��-��7���~��q��ttt�����}{���;wtuu�j�G����`77����[ZZfdd�={v��-|5�#����c���s�����tOO�
6�����8�x@���;w�\�`��������m����j�/���3g�����;��FFFqqq~~~��j�/�����G��_mnn�k��V�Z��8�x@���)))�[�fo��}_

o($$����o��fff�����q#_����4z��~����fmmM�������x�["�x&O����acc�c���-=y�$((����222����;w��q�<<<l6::z���w��155]�`��y��2...00011���*$$d��	�*E�m+hz��5�!C�����]�t��S�L	���i3''���{��u�&M�z�*�)77��={���.]����?66���������Q�����k����[@��[JJJ�������T���l���l��5�~���[7������B}}}JWT�������{�n*HVsM���U��&�����{��u��BI���@�6����M���?~Lm80<<������3�����d�hS			u�
�$���_=`���}�>{�������s<�1����#F����m��}�[D1�PH�R���mMo���;!!�����
j�������'/-_�ti��q�����AFFF�������ccc�����a+Z#����p^4|yy�&�Bff����~�����53-e�
��>�q����j��3==�-dee���������y?�2��h?�+*�Bvv���w�SRR��7����T\\|����S��[�����={6%�=����cw��1`���S�N������t3>>���Mj�h;u�����R�h#�~�j�	Z��kbb�<,--�!E>�ahhX�d�K�Xdlb"�X���mLF(�����e2����XP#|����F��9�����S�������hk��

����{{�^��r�{�)x@~~~vvv���

JMM����9s��={i������7m����������j�*���������+W��%YI+8p������+mMo�������+..���?���LMM��m�`�G�y�����W3{���1,,�����%�`�o����@��V.[��� 
:��
�6���������'z��affV]]]YY�`�c���v$��u�v����T^�r�[@��[�����a�n���z�j�L����x�C�|�r���7m�t��![[����Se����_�gWP����]\�#')�
���i�5P���
h��)��_���3fW9w�\��#�g�v�=:s�
�Z�-������n(��t��m��~�����*��C��/
���i./[���!��yS�F�
�}���7Pox�-0�R1���w���T� ud���l��%���tT��Ud0e�����@�!�����P^���4F��c��-_�<99Y���&_����4w�\
@...���|�	�� [[����������<<<"""����j@Ix@������������\%>��u
���� (��������k������~��7--�� �F�0�1s����o���VU1�-�W��_��[����������h�����@��TV1�Ob��GuW��y�W���-N�\WW�^;�����7�O�~��E�����n��U�I�F� 'y��ly���"@#�[
�����������a��Y�f?~�����I���S"x�����X�����
x@����x������y�~��'���V����<*����������w����]]]��o(88���������g����e_����4v��>}��8q"==���s��
���|5�#>�|����{�=PP���ccc���+��������/��aff�b��V�Z��_�pA����8�����]�`i`���'T�Pk<�^�z���K�^�~��,((>|�����x��4�WU��R�0� X�-[���3���T�/PG<��[�.Z�(==]_��w����4H����
�ZSp*Qe7��!M�>}��i�����
�JSSS�o�>��)�\���RiW���~��%���n������_�o�o���H����4448 V�d����^�o����)��;}/���;���D���Q�����vs����~
����w���_UU�?���C^����?�������� ��������[���k;v���LLL������0a�X;RWx�V��+O&�6�_�p���N
��������g������o��9,,L�fg�������sg�������(--�����,--���]�t���ll������+�G�
������&��W�N�>M�U�VQ�01~��S�N)����3���������O333����B@ewww���wS���o�&�LX���Tph�<�k���MoH[[;))������://�y������7K�G�&;;��k���g��155�3gN```BB������������+�����
^����+����`��J��tbo��T��- P6���%K(L���<����M�6|5.JOOo����v��y��E///;;���B�_�700����� �������{����.\HV��C�99��{�Y�Y�[!�;��a�������5�5+*MA!>>�F����� o�_���/�"��R�HfM#%%/~1���S�V�Tx��fC:��h*���o",dffZ�
������AK�6�����9B��Z��Gt�����,�@G7�<�gV&[�g9�B��Y&6�BJJ��xE��G)	\�;W��P�oh��i>>>���_~�e�.]ho?~<_���h����>}�L�2%,,�����
��p�'�[I� ���ijj���-����S�c���{�f�S��������ff��SA�����c*hk���u��	,�7g���&&�Rmm�
��<0]�vul.844��e� ��
kA�������T^x�K
�~b���W5���b�@}{~���3��niI)^�opk�2�R6� �#����u��2�F����hc����~f�
��O�{l?3�o���]Z*(��[�W?�����=���o�����+�=�t��O�����XTT�555'N��K�R���%''�����YVV�����S������j


Fx=*����^�/��ba��7dZ�lmP>~���V��-w��=v�X
@��)�����z��1ww����]�v������SGGg��UAAA��"##W�\I+8p�������(�J�J����~8������1)L�0����A��-����S��1c���9��
Q�s���������,//?}���������������R|2d�FK�,YB�f���T�l�2???
@t�� �R������9�<(P9�����)dp��ZZZ���L���������r����V*./����
g�&'bF����:�-���������������W�4������#�/10��W������$�����w����}P��0&�����!�N��w�Y�����F:�S�������[�r~~��}�D�~4U�v�}$���Nj����+zs��!��
�;w._����$&;;;))II��j�0�
��AwU��������������@�����4YP�wb�G��7u���iii��������8��� �����}{���@�TTQu�A��f�W������G?>�������ZXX���m�����S���zVZ���l�����j;S< WWWF��)._���)//�.]���?_�����g�233���lll��yyy|5�#�����]\\<==���srr�������W�<�--^�����>}�tVVe�e��u�����x��7A��� �2(�Oa4X@�v�@� ��A��j��72	�

������
�4J��\A��X�]h�,l2��-��W�$m-���$ P��r,J����
����l�\M�(�Rf�N�0�TT��+�N�@� ��A������?�������� �&...00011���*$$d��	�*E�m+E�����Q��}���w(��@���f�������sg�������w���������^^^�����������
n��������R���LIw�n2�����5��I5}hz�9s�����������h}}���*����������
�����
n����d\|�
t25������9�WP4�Y�Qla�����o����4�0���@�R]����e���9��]C@�~�j\\\�������_777��T|�W���u��a*X���+��*�?���KT�(p�7���;�byE������:Y��7|k�HRaa���>w����PH�R��rsscbb������]���1��2�������f������������������{J������rY�YY5��{�n�*�*������h�e�}����[����2�=c��kkVT0��B||��B�>s����"wQs�df�4"z����0:���B]��FDDhT���(&//��&r�?-[
�EE�Rn���m��C�f�r��3==�-pgr:������y?��OC"�,�Y(;;��FP�9�i���.,}q6��R��;��l�&�A�$pK�sE=E�5�dddD���I�Vccc��
nejj���-�����{3=�����<�����TP#�U�RCC�R��mii������\O�dn	��'���dm:��]hdb���}���U�=�O�����L��V��
wcm--n-��	,�7g���&/�0���6���]�vul.�g4���s�XZ6g2n3�=@������p��K�yyy�h�2���2%��D������S� &&��0��O��mh`��%8�3�R6� �8lLF��+�����/?,,,�G{���u&C#��A����)s��g��mu��K�_Fjnn���"z�����R����j��B�P���3��T���+V��!��B�C�J/.4���S������j

���6����V*�U�����2��7���&���3�����('�A���Q�UN#W��/��,����*�����vf����uKf�
U����<==uttV�Z�r�J����������(���VM��_N
R<�u)�	@V�����BUm��M�;\T�H�����KWP��aq�o����6��WP��*++

o�����>}z������k��	���%K(�l��������Z�l�2???
@tj���i�T���d�VF�kh4�g!����$A�X�`����q����w��F�����J&���<�3�M����5��W������%9��u��0���+W��a+e32-������5��}�����-����u3 h:2���5��{0zZr����A ��<-x*�cn3��U�@������cB�Q�f�d&h���
� P;@�v�@�|����R����|�S��o��;�@�:�`B�A������@��1L�����8F�B���^=]P(��
#�O���AC�������)_X�M��I��-fiu�������R9[T�G\H:@�f=:�XT}�d�~�����l���uU��&��3��\Phc����7MQh��G9�00����������C���"9�A��2UWU��g?�Q���q�)�.�;�o�DP P;@���TUURAG[OWK_���p�`M�K_��F�=��������[i�0LcL�t'*����~W��zn���(	�����m:��
VZv���`V
�g�%F��l=S�$(
dL���7�l��.|���:�T�1d��T�G5�
������T��0��`%k����?�Q���]
@�sL�A�$���(�>��;��b������;�����^��{�kjW�c��#�2cPUeUqv��k�~�nx�'>t�d@���>x�����B��F��s��f����*��������J�T�P������9T(7PuW@ h�LKs��Q���	S���Je�1o��x�
���������4!Ac��0�F���:�-�j����5�g��f<�K�6]=xa��vnE�6ym%?�����QQ��PR�o�P hR=���t�
�9�T�h��(��Oj�8Cg�P�v��A��I������OR�6���y���P��o���e+ ~!A���w/)�4lLF4�t.j����T�����I��J+��54pl(N��������ST04O���Ol�w�-S����C��j�� Pk{�o��.-m-�T��7@2W0%����c�����r���[�r��>�e�v�pdyQ1Ztuj����:W��K+��r�-<�o{;����� ����
&�]�ulx��e244����n^�v�c��qqq������VVV!!!&L�J�
/�
�����y����dn�8v�������TA��3�K}������k5�M�:����O��c�c#A2�ezZ��{�*��\�
[^�����'(
�d
��
f����R�������p���z�`������w���)���B�6;Z�O��GP{�/������Y[�8�������.]����?66���������Y�
������&�����/s���4h,�x�*�
�vY1��#(��1z������C�~f��bZ��s�xa,ne����f���W�������oI����'���Y�n&Q�����m�SA##�������
T�c�W��PNN�433�����������������������@�[�zJ<t2�i
{a�������,b�8#(�;���-(�V�Y���"/?�-�ihh(�������������N�z��SS�9s�&$$���p�8;;_�~]t+�+�����
�>�L��H��R��E�)l��o7����.p��6���~�g�7�t��(+K;����i�&�\U�^�y����A�����gF���n���� ==���'S��s���������
����u�Ft+�+�t+h�t����oi������:���bkUU���>`����^�TR�H���
z�����U2�F���6m�l���-���g��)aaa�������:999����[I� ���I�bbb������]�
�,���,�����[*UzT���|Q�\DD�F����**j&���l���m.����<�����d?KJK����0\�~������5�YQY��|_}����YR���f�feZ	����������
�����.���Yr��)Sc+��.>��|��W���h��
�~���rP?-��C�|���{�O���)(p{������iDt(O��!#2�%n�j��?�|^��
�������|�^+k�f�@*\N�aU�$fO����(**�.��Ex�r���R��=_�M�C��({>�'X�^q����E&J�3�l!+��Q��ga���[}���cv��MMk��
n(��Z�6[T�-�
������YR������;)))O�C!�Wp������,
���sE=E�5���������gO�fYY���n�N�BCC�������t���&����oejj���-���z�����P�K�$=����#�5F��R�����T�t[ZZr5��^^^������n3������Fss���<�g
�a�e�������c��]�:6�������c��La?-��C�����A-�gsO�7}��L}�|z����mkk�~}�wxu<���P��E�PXZ=o�[�{����`������>�q���{�������
n(��L��	�)����x�W������vE���������9�q���P��W.l�
A��S�P� T.gr��B�Pt�����`(�n0���|q�5l������Z53���;�.�������~3��&u({/������2%�By����3������l?�k�id��#(�����\AOY��mu��KK:�����s7�'E�o�����P���8lLF���e�w(���{��Bt���C� ��r���W�Nh|����C�=v����{ll��]�����������j������������+W��prr��#uz��n �������������g��;P�/���o��53f�HKK�����2d�����_�d	�����;88P��e����(Q�����Jh�_"���*�u�&��+W��_Aj%4m�2(�� P;@�v�@� ��Ah�
K��*�M���e��#������J�TG[OWK_��
\uS����1�?s59���*X��v���{Fh�f�<��o��_���rk���o����.��f����ac:�;QA����Mv�Q�?��?�fa]�c �>z�6��#U�0�k��7>�-�
�M���\ZS�*���!����wP�MI�g~�K����I�Qm�.�<��hQ���o�,L�����S�z��0*4>,��&�Y15=�>��C�2�
��@����O���u���g�$
�-�]SQV�$�:[���Y���-��CGg��e���[���}@�:*��*()c��F�z����aw��q�._=M;�1#g)�������<wfF����?�V"A�9w�{�^�\m�GM�'o0&�������/?���T�.,�vsf���,g��ZA��o�f��[v���W�5���1��B>�&���3��oV�[��sT�.�5?��]���Jl;-�����5�V�/�&����?�nR�X�rI�_5�c�e�m-F���-����y��x��r-]*t�d�/�*��J*��K
u����&
����g����B+fI����!�L���ay�w�:K�6ym�=fZ��^��u\����wzvP�f�������@� ��Aj(�'e<�*����F'��U�n�K�%�n�ZVT�,,��),�����c��i3*�4���?��{W�i����:�JPeo�|�6�t���g��Tp��/;#X��gO��3��{��zf�*z;�|����kK�	*x���P|��9�+����u�������	�y�V=�r9�
�%�����{t/Y��]�wtj~^:����K{*�h�����G�v�F���w�0�%���TU2������z�#��L�����|W�M3����Ja��=f��T�������he>	�PSp��?�Im�o�?�'5KC�1��@�j�� h�;y��*|��1��������)5_2�I�	��_�;o��|���#s�W����,�������I>L�;�����a@���@zN���+,sk���Q9SY�|�	�OU~Y�}A�r�,��Y�c�w�o	|��Oe�?��W���� P;@�v�@� ��i:(...00011���*$$d���n#u��nMO	@������K�.���������ruuuvv���������Ij"(::Z__?  �����>>>�w����oMR	@			...�Mgg�����tsss�[��iV���*�hT
�~TS����)����%d=��I�Y��6�B����u����?iO�����ly�]��.��C�DPaa���>w����j^��K��������}knT��)Z1���_C��Z���_�g�i���������Q!����a5�[t�.`�jj�����[YS��a�EW��c��.��e����
V��V/*h[YU������E9T�773�t�@�����w�J���0l�t�$�j���@�6���Z�w��N4�x�u��ie�R�r�Is���K[��jj�P��Yw����qG�abC1����������4�h���Q�;�
{���OE��X��{�\�%�B�Z{�ke�C��Y+����Br(tZ����+ZY��[�a��Wp�4�`\{	�����'s(���-
������FE������H]W���������B��K�:�q4mo�����3�b\���2V�����rJ�_:6&����M]k3�H����RFd��:&����Nm��-iU1�����9��
��0,lf�iYm��3f�S����^!m(l���[	�B�c�
��
n(�t���(�7az{�
�����%�CQ���X�C!��:������WH=W����Uo���l6��BYC!�Wt��b�����������C1�<���,h(������RA3�������h��Bx�ge={��>��L-[���C!u�xq�H���������[�-��T2��k�R������V�!��W�^	@FFF�������cc��� +Z#vGw���hQSg�jJ�^�`��b�55�����u[;w��������5=d��rF+��y�E[�F�[�hW��E�f�3A�Y���
�fi/���x�:��Z��^�l���B�-�{fi�c��c������\��1�[�a(���v��������2lK��
�5��v(r�2W��p(j�WH
n��I���!��8��1���	��5�����u���Cq�[�g�jZ.�7y�^�a�"�������Pw{�ai{��P�X'�
���_y(���p���E&�=WH�9�
c�F�P=������B�P����{�����P�
�����i���5�iC��������
�����0`�E�5���S������j

A����wss{�
��255���m$<<\��/Jj��uXy-7�+��F�a����:���]���r����Zntf[���M$yzz����Z�*(((***22r���T��'''
:RW�����4mM$Q�	���_�d	�����;88P��e����(�ZAj%4mM$�n��]�pA����+�W�Z	M[�	@���
���-����:���]���r����ZntV^�����k��uXy-7��j�@�v�@� ��A�������������AAA<6�p��;w����.X�`��y|�|���E�=x������b���|����H�.]F��n�:��444����n^�v�c����L�
�������q���/o���'N�nVTTP�k��Q�er��Iz�


455���K���YE;�������V�\9|�p�<.��������t!!!&L��eY�
6��1(�2_���G��a(�,_��d�|�b-�uJv��cP�e^�A�;�����cA��Nj�J���xFU^^^����m6''����N^�&M�z������������-?y�d���{�������K����r�^�o�5�|===�Z#���EEEiii���<6�
000HMM���y����~�[�n/�L.j����-��������D�{*���O����8����]�v�����O�����}}}7m�4f���G��;�N=���/�R�������b���������^^^������r�e��*l��cP�e��A9�Z��P�Y��A����l���P�Y��A��y9���={�T���u,(~�Im�S�NJ���x6s�Lzn�o�t���
{�����B���=���z������s�2���[|���S?�N�J�x^d�G�433��A��g������������iCI�����~KG//�$%%��Ag^*�j���������4~����-[�����o���������4(y\�%�3�vT�=���g��������,�R�f�:%[�����<%����l��cP�P��P�Y��A��y9������
z����;�-�o�^I����+_�Jk��il��3��g9������'#���%]x��������=w��#G�������f����l~��SS�9s����][������/��������Y�,X�K����:�o���W�t��+B^�:�)���������LSrUUw��������4(y\$$$����I�4s����J����l��cP��V�0�l��cP�e��A9;�"��d�|��-�rJ�i���<�d�wR[V�������;b������m�����]�&O�laa�a�:��&�?��:A��GOO��J'��;w^�x������#G�T�e:�?z�����0��_�u����#�[f�X��������jPWWw��Mo��vPPPVV��_��h��1�i;v�?~��'h��k������M���.����r��{2|����iy<��t,�j���CjL.]�4n����`.�e���t�����O�9j�(<x� Eu����s���M�-[���>}�L�2%,,���/�=t^`_d�����	�=������h�����]��5��{������tj:t(�"y��M���O.\8L�G�fE���r7srr�����ehD� ��������Fq���|z�;�����Cj4��?OgF� 0`����y����t��������������?����w��as:lt���S�w8---99�g������2�S�YB�����t1dhh�_������eB���
~��"##�����K'������	�A�q��x�����"������Pd


�����y���AFi�a#=%�
���iy9��t,�jYIw��8������7m����F����'����GRR��C�f�������+:]��k��������c����k��}����r������x�����<��g������O�=�j�E�����>��F����=c�^Z������I�3#=qt�8b�^Z�xzz���j�������(�HV�\��]�������Fz2J8�1(u�U��S�� �e���*++�������O�Y�����o|9r����E_
�={��?��x����[�v-�355����N��o4X�aR:��e���-�C���q:�����7onnn�d��a����rJJ���
_��z��M��q������;s����ecc�/��r��	���...�n��Y�[�u\���Q���.��o�����K�t6W�0�����?e
�����N>��U���������P�0��������?eM
zR����������%M@|�����j�_c�����VF�d���'�}��
*��-[���oe��m�6e4;SH-O��)Y�E�n�.\����<e5��1(�e�w���|�v��?��"���f?e���1(k�P�����������4�!��A��j�� P;@�v�@� ��A��j�� P;@�v�@� ��A��j�� P;@�v��7�����+%�[Z�jk)�����g��UUU��'����RM�^����}}}>L5��~jjj��w�}���~{I�e%L�S)��z��-w+))������\[[�!�-MNN��jR�6t��Le��z����A��������(H�����jnd_�=�eP+8�7o-�� C����~]�o���1c$�������'����]����������R���*����U�������W�e#
T�L�v)�-W2f����X
!~�U�����{�K�S�Y;.�������:�����x�E�
�W�?����/���}��'O����c��mtB?}����sss����������u��n��C���\M�R���7���������\�ti�����MS�������dee���/Z�h���6lX�fM\\�����-[������/���t��y����<x���+=z��K����� �������+(�����Z���.����N(�O����!A��s}IIIZZ���'�����k�������{��a��%''����:����RH���m_i5�Ki6�����qss[�~=Mo3f���������#F����;����g������������������-^��������bniiiQQ���]PP��k�BTC7333��?�W�#��.J��d?�`T������)S����q���>|H�ukkkJ?T��eKoo������Xb���]j�����O�:99Q��J�.\�����S�NYXX��Iez�>>>{����s����{����������������=�QQQ���leK?�#���>���*
I�����������������R���1P9 P����YYYI��VV/>$��y�����k�"����&��R���%[C�����}������z^RR�~`���v��������u�����555���-S���Gf�����@Y�	u�Ee��IB������������At�C������������t�Z�]T>333���nr�^#bgg��C���x�z��g���o��;v������[�nM
�z������xFFV?�$ P�A���>""����&����?��St�K�.���_��v����?�XU]U�~����������+**T��W���o���9r����*,,�?������K�)S��X�b��Q�����}��6n��|�rzN�=�
���5���������[���S��R�����Kv3ss�����>�h��y���_���DWX�x������������_����FLGW)��:�v���}���P��c�����k�z-D��i�UJ��W455���`���s�VUU���y���?o����	h�
6P�����������5n�8__�����x ����l�\���6��y�
L�?����^ ��KF�t���j���3g�������em���/����K�.��l�.��j�h�����K�rpp`�-��le-W���.�)�ez���^��(��l��/��o�s�������p���syRR#��w`` �TlX}��G�����vQ�~4U@
BQQQ�V�v����������gOUwJ�]��7�z�� l��y������v�j���@ 4�B��E}���1�z�j�� P;@��{�cJr�%��
�o*��W���7((�����BBB������g�O>;*���y�'���6�`"s+�w;))������\[[�!�-MNN���+�u������I�v�mc�Z�&*�zPU]��{P�^K���d����ad�xU���7�~��(Y�����]�����]�~��gY����JC�w�Y���2�3��� �������:����t�U�������\�6��7�W����~>Hz��F�/r�PYUt!i�d��nk�Nu�kn�tdT���*�vP��l����_���6�������dee���/Z�h���o����;w��������|�����.\������8o��t��e���t�|���7�xc����w��}����~Z\\L�>

?~|c���U�hsnvy��1{�L�G��������?y��G��_�-5��$���FI�]o��a��5qqq:::���������)))�;w^�b��h�Lw���#�������9#�XvQ�+:��Y����={������2''g��t�}��w���O�^{�5:�:;;������t������<M���tr�,TTTTPP������VRR���������S;���kTT��}��,Y�xj�����Z�vN�<�����]�����m��f5��d��{Mf����������������-^���������Eii)�#��i��]q}P������4�]@�+���S�G��nggG�S�NYXX�9��tf�����w��i�V����i��-[����N�t
J7'O�������~�������c�2������������E3��������{�o�M�2�~�o����%g��egg��c%Yw�q����{GGG�����	�����u�b����X02�#��vQQ@P���Q�o|6o��~>}�����l%]�3Ft+�.������g��/�N����YE����������@-<Xj�LLj>����)����������6J�����v��������u�hO,--����)���}��&<2�k�����<++��I'8�I�:t��������
M����:S�e���k��v[����U5�Q�u�Ts��!??������OOOo�Z��n�+lFQ�,�����+���o_�p�w��t�}��U�������G�y���
�������w����j��At������������?���V�K����(I��.]�L�2e���F�z����������q�����Sg�=�v�Z^������OEvQQ@��vC4wn'Y/�%@�W��������#ib���455��;]t��;���j���t�m�.����>���y��ikk���`/�d���XH�o����*�6�Fu�J���_�s�C^�������5�Q�z���y���'L�@+l���*����vvv�BVV��q�|}}���_z��:�fc%�u����T��Q�.
����7��_\���������s��*o����===/^�(������ub�����vvv.))��K}f��������,�9s�[`+_����K������KWkP�$��CBB������<))�~���J��,Z����_��n#S��(��Bx����02�$!��Au'�����@�j���������1IEND�B`�
bench2-dbt3-50gb-pct.pngimage/png; name=bench2-dbt3-50gb-pct.pngDownload
�PNG


IHDR��8�r	pHYs���o�d��IDATx���	\����o�P�HI��5,��
���F�FQaiV�W��i�Rx���f��� �"xr���vgww�e�k��|��w�y��y�}fwvW�����$������4 �8�@� ��4 �8�@� ��4 �8�@� ��4 �8�@� ��4 �8�@� ��4 h���7nd�zzz666x���&M�����X�������PfPP=�>}���__�����������yLL��7����
�|��'�xB�������,--)��O?}��'W�\����0a���~����9��W_����999���={���


500h�v�g����{�^�z��2-��������k����^M�ptt��H�TM�?t�C���u��.��mV����o���M;v���+W��;w.
gg���j���������)QUU�����o����Kt~���_


����1++�����1c�13g�|��w�L����`���{��Q��Y�fQ
����������.]��/���Bww�/����ijjJi:�v��3��o��J������r��Q���%K�-[6t����w��%??���C��������������]J[^RRr��qZW��
�����<s���B�:4o�J�m�������Q�Kc!**Ji���j�������O?�=|�����g:?����5k��y�����v��M�B_	6�r�������������/�,X������3f]��7N�0@����Us(�;v,YXX�=�����8�~�:�b#�u��^{����7�S�.���h�y��gTl�:Pl��������?��R0���i u�Y����[����
<��P7@�R�E��
�.]��}{����4!Y[[?F����YYY��u&�������w��ILL�={6�Cq�����}�(��g�Q�r�J.�aM�0!//������n�?|�p�$>���~���~����f����=��S?������;w�L�'[����C����Y������:--�F9���;R~�=������v�Z*����ggg_�t�����{�������3c��)��[����KJJ-ZD�P�S�P������!)�b�05x������h����7n�~����	���G�����D+rvv��o��������'M������Q�W|��f///
.^��U�k���'���{{{7p�����9*�����^���h��M			�`s����[E4�|�����s��m�**++����8��'�|��g��D���%������W�^\��={�LNN�������_y��^>�������?���B�S������;�-��{��7(S__���X��������-{���n����[oQ4s��9}�#G���H+}��'�h_���?T?���?�H�L���������9~�x���)�6666v��-�{���y����Q��I���{�:D��\=�/^�b~~~999s���0����:t���b��c��9s������6m��>�1*����c�y���#^�r�������m[�n�(0j�z�W�r��[^	@��Z�����_�?��"���]X�u���GcVA��tfg$oN�����8


n��A�4�S�A������;������0=����I����f/�S����[�����+�
W�f�s���45��VP�Q�F��KPr���?���_|�������P�I!����J������y�6�}����������q#�����K���*�������O�+�1��/W������d��`���GPPE��RR�Q�v���URZZ���_RH��>G����;99Q�.\�����A�n�
i�/^���"�\cT���h3E��f���c-H)������m��+W�C�A��n���|�JZ)@��������b$�O�<y�MS0A����'N���������6���mnn�=E3��1c(������b����r
#y�fA:����}���C�����������f,v
��$������s�I��]������s�>}����-<x0�3|�p�=����XTT���b/��c����k����]@3+��2R�h~��w��_���3p�@.��PC���H�����G�RXI�"{T���������$����NXO<�����c���qA'{���������Uc�L�7n������������� Gi���D��huA���B��A�qi�^�����4p��(u��q��������{�{�����#��O��EDD�-N�����w��]����i��1���H^�������-���{d�#G��	�t��s'���o������W����y0����C
f$o���5������zI�n�3fDFF������O�����y�w��6F��u�������v��k���YC�d``@+}��w�Qr-����"FFFr����k~%�������6a�
8(���m��={�l�z=��(���Y� hA�l�B��J?~���s�{����ke6��3Ag�P�coo��S���cG�{�*
nh�;w�8;;3�(��G�������F�����1c���K�wY�mH||��U��]t!���P�7���|���p9���\Z�]*��M�1��<v�X~��=�%���7S�C�X\\\������(JNN>y���M�^x�6�������/��C�+R���}�xm&t��k���K��<��7�<�z	�**QY�o����{���4F������� ����o���g��������a?��1��(J������i��EDD|��l��)�������7o������� ���������G����MW���(��)�.�)�������oo��&]����������g��np}�u����oUaQ@���}���M4�r��$�^���6������������+*z����1b��_~I����g��9t��C��}�����}XUU���6J_����������#y3(77��w�5������6���'����*�c���G�G\�����JG��+V�ZEMe�FA<����
_@sA��N���"555�n����_bcc�{�=�2�����O���t:j��G]]���_y���>�HGG��V���>��C��
�+��K�����_~���/���-[fbb�H�����g��E���qc����?����C��!C�|��W���i(--��~��-t�LO=�v�����U�K�emmMa�7�|��OZ����o�,{�,��O<����G),c�
,X@��G��c�R|�n��5k�P�����tE����{��m�N��k����E����9�C�������<y����������x����,
����G��V=n�8:������S'n
<
���k3k���_����k�@�^;|�}$W����:�.��t
�p�B,�H����A�* ��Aqw3A�v�(����(���� ��u�?>�����6n�H�#tf���4h�����O sh�?p���%Kh��{�n������~������&��K��_��*y���"##�eCBB�*�b��+W��s����={�|���o����E1��;��5s����P
�(L�kq����(^�8�����������o�m���/^leeE�.��FFF���/�aQlJ[���0������{�{���T7FE{Q�899�t�h��I�&�;w�&���r�I����.���h����Q����9r��;rS�j
���n3#	
{�������a���e��/H?4��d:J����
*@W4pi]�4�
�/�Z+��b��'���666_I(}v�D}�0`��M**o�v���4��;H���������������yKB�B�wr(���}����������_���(��9	~�_���������"���
�[���s}�I)��������k3K�����W�P��U�����J���c��H(�7p�� ��������###333_�h�@�v������w�^��Z/@m���{}o�<�`	+h!��Ah@�q��Ah@�q��Ah@�q��Ah@�q��Ah@�q�z���������fff���f��N�������^|�E�knF"�h��QO>��G}�\mX�`���g�����jh,@�t������_~����h.����_�n����;u����6����R�����������S����;w�+����p��={����DDD<��s�S�6m����y�����y���U�/,,�7o����KJJ
���_����![q��A��>������+>K���!C'~�mSQ���w����{i����O�<�����S�LSSS�v��i�����$�����NNNT2  �_������������[VVVr�>|x�������>>>
�����K�.�<yR�����mmmZ��2��?>|�p������k��wP5d����|��[�l�q�Feee����������<�Y�����������~���iW*�:,�%��/g��Gb��\�)S��^��a���>�H�h/P�B=������ImX�t����������m�|$|}})���c�|�I\\����/���X4C����\�?h��iRQ�a��������������_����������c��w�yg����������`�x�+���o&&&R~���)���������_)��h"g����)�����WgZZMc��x�bWWWF�whf:z���}�hNe�������S��N��������7�PlW����4mO�4�����c�2[�n��������������P���)�166nx'4��<jD�Ja
�0??����
s�;����-[��W_}�������9s&$$����6=�YF��'Q������>������?�;w��������B���N�Y�phh(�����z��2�����U?��b�����2s�L�%��Mt�Is������N�J������g���?g��={����`:}{yy1�Th���K��jd�����7n��}{rr2��t��h�"���Ul�n�������={*���G�:t������!El4	��.44!}���;#3$T��i��_~9r��^���7�����4?�������6mbWG�Y�=:4r�H6����������D4)�2��m�:i��������5p�@����7�~i���I�r�����f����6�_��~�iBB�O?���(:|��W�$����s�0��7��#����)H�C�:������h�(��z���k���q�F}G�"}}}�a����SU���g�9�(�P����b�� �>3f-u�����Z������k��O=���/����L:��O�
f�x���:\)�+L�����/��=�����qeT������t����C}����4���{���c���������=]+sOQ&��/_�lmmMgO�Qh��3/;��--�n�:���T
/���N�tIM�
�a4�N�0�O�>
l	Mt����������W��O|t��c�����w+++)����NJJ���N�����:��W��L[7t�P6_[[{��!���E4��t���D!��<�[�������.]b_3St��i�����3�k[}u��E�%��r��$�������7oR���e����*�!�6��
,X��%�=��W/�&)�b_�Y�	
�v����N���h��������2��������w_�z�����o��@����^�p��6g�DC�U��S���`����W��KF��!��I�HQ�D	��B��!!!�}�]{�o�UTT���P�IO�e��T�-������ hjt��eK���

RSS���)M�RZZZ�����������������g���9����2e�����0��4�*@T��
~���S������������*422���/)�8w�����S��^z��z�����=K94+|����l�����������_�
������s����_�>y�d�2���}i��J�c���*�E��jE� ]���CJqI}mSZ��k�h�f��R��d��(--�}��'�<���]�������f����s�_}�E`S�b
��S2�'((h�����z�����j��
�E��������p�����;?���1�]�����T�������bD��;�6�������kC�U���-W�.�����(H��s�����o�y��q.�a�1�t������uz��/�S&q�Ku�R#)�������4}����N�l&�v]��K���N��pvv�2�Z�&l6���Eq�.T�����Oq?�������s��].���'N�yy������t��>����A��a��m�������.�^UTT����N��t���<�H~3�w.hf�yb��]�r�����Ht�=t�P�-��R�&�LmSZ'���X\��4G�i��i��:�}������i�4���~�������*�u��;wv���m)���	�c�q5������c�����a�����q�v�"�GK}G��:��������[o��;���{_�6:27n�Ha-EQ����###��R����B1~feeeaa!E`���r�����4��t�R��v�Z6�=��T�/�}K-��!j?@P7@��h���g�}FgO:E�U,{�^q����m���
������{�8�(�i�?��@�n��5j�(����������m�h^�l�R���(������k_:�WTTp���w�{�'M�t1M�JC�qrrb$���P<���4��:uj��-r�����:{��I1��s���s(v����&"��+��������0a���r�(Tb�&�����|}}CCC�g)&�(m��i���P&�-Q333�e��[GS25���G�E�����@�bbb(���u��=zt}{_m�h����S�����K/���>��Y9'O�tppPz'����cf��U��i���5k���),�����w~���_���bA��P+@��h���������3���={��I�]��0�9��1����4���������'�\y���I�&5�1t���8]�����������/�d&7�Pi
������\f�=�������!55��!Fi�����B���{h��4�!�q���S����c��9ly������B7�>�\���w������S�F-�������N��)^�������]���!j���|��z�����������PP�n;M�����9�+�Ab��%������#G�tss�cFq3Uw����T6Ql���5k�p9�T*�>����������wQ������K���g�@�����{�{����� ���V�Q4B)�������|��M���|�I�����T�mNN���%^��&�����]�v����W_}E�J�i
�S��1c�dMA@�������_~��?����&����I�����/��}����������7n�eR|@�w�N-,,���������Oi"a#3���r��a��eff�����t���GEE��C���iiit9^_yZ����BW�t�A	m##	2h�����9y�dv��>��3�c����r�����nee��������W�����JPW�w���y����O��������(��SRR.\��_?wM��Z*���o8�K�.���kVV�z�7����h���/������g��������	
dllL�$���������� ���U�A�b�s:v������m�����|�
O�x����;�=z��B����[N��}U��H������	�}W����w�}�"�e��)]����bt�����o��g�BM���i�=t��#y�`���^^^�>�����ju���t���'���e{~��������h^�7���>���/r�T'MH�^�`]�R�47;vL�#?������W?��2����e)�"//��������y���y��???��h�:x� ��}3y{{S��G`-��@�%�r_SDs??��S�6�Z�u����:�F��8����&*___
�����,�H>T�~�����o��K�,���W^9r��v�	���m�|�
?b$��Q�LO�W��Nh
JhR�����V�X�O��g���T*�>����=P�RC���)��w�y�}K��o�P����H�+E��W�8�G�V�������Z]II���`��_*������^��B5AM�fS���Y4p���U2�C�v�����!Nqq��������h�S{��U�l�K��G�&�p����j���S�����3�����
l��:����K�W^ug�.I�0�����Kq��/���P��Tt��
�t}G�[l�������7j�(���wP����K<��
�;�$L�z(X��U���r�����[������U����5##���2���@��E�����~)W3�E��SK���4
@��"������f�1������_���&���9t�P��!**�y�h@�q��Ah@�q��Ah@�q��Ah@�q��i��u������:th���������aaa!!!�y��YJ������FFFN�2E��3+**�O�n`` �bbbttt�XZZZ@@���')�i������3g�����)**��������������������&L�Da���������3��5��w��������S�+V��1���c������������
-=z��7�������q�����Jw��������K�������������9n�����/Y��[*!!A�%3���)��&''S�v�ZWW�a��5����������x:v����?P������������pe���)*�/u���VVV���������������8##c��5111~~~��H��k��"}}��7���������~��G�������\
\JJJ�K�C�J3
�a��Y�f%$$DDD���DGG/]�t��y�z����MJJj���i}��k��L���~OO�[�n�5����������+���off�_Ji��>>>�������������U:�����������"7o��x����NWW��������u8r�H���)��4�>�8p`���QQQ���ZZZ����(��Y���(��4e�����#F;v��"���8���6��j�J�W�����N947�p�����w�����/S�RPP�������^^^zzz�V�


���� i���Tx��]NNNTRi���.������[YY1��)))��������6���0Zt$�LLL���G��?~PP����)d�4iRyy9=5q��Y�f���������/��f�����u�g#"")|��Ei��d��������}������k��5l�#�
	�L77�S�N�e�?^u���y	�����^�-:P@�q��Ah@�q��Ah@�q��Ah@�q��Ah@�q��Ah@�q��Ah�V�[�n��yQQQ���lNAAAHH�������g���t�R�<{�,e������FFFN�2E��3+**�O�n`` �bbbttt�XZZZ@@���')�I7���@������lll|���{��M�8������y��	���AAA�������S&��5��w��������S�+V��1���c������������
-=z��7�����������fff:88�={�2<H)0������q��o��d�n�����P����vtt�����L���k]]]�
���j�� �~�r.\���S�5k�l��YGGg��s���r����W������K������R�tww�����UUU�������???�	G$����HQ^^���7mllRRR(�y���KJJ

�2�P)��f4h��
�f�JHH���		���^�t��y�z���������-B-�x��\����fT�����)j�9s&�{��=e��}�����pe�������K���*P����s��a���������}�Q�F:�����������"]%�+�����O*<��/rtt��������������Q$Ei---�LLL�{�Li����Lz���5b��c��QZ$�����t�o4��@]�v9r��E�V�Xq���;vl��������U�V������9rd���Tx��]NNN�(-`oo�t)e._�������OIIIT�����6��� �H���SUUu�������^�z�����������d����G��2����,=��f�����u����*I�.J(�$�w�������������0--����&�X��ttt����;w���~�L77�S�N�e�?^u���y	�����^�-:P@ ��b&�L�vk��h5kk�A�t�9�%M��f$�nY��Ajt��]F�z�&]�{6ws���=odq��w�yn�����)@�q��Ah@�q��Ah@�q��Ah@�q��A@k��sk�����������i��&��y��m`���#z<�@���h��u������


������;v��������!!!)))������S�L��Gi���������D���*���p��I�o��ui����3�������9s�p���	&���Q�����������VZ�{��������:uZ�b��380f����ZJ�^��@����7�xc���>>>r�{��IIIy���n��M

���)���9n�����/Y��+��%3���)��&''S�v�ZWW�a��5�V�Z�������������{�����l��+W\\\�����.]�/������b���{uu5=���266���X�fMLL�������#h�Zz���Y��~�m'''.�������{H���QZ@i��A�6l�@�HHH���		���^�t��y�z���������-r����/�5/..N�-�s/;�K'''�{��p�N��rJX�����Ke��e��t��e����r������;##c����LSS����a~~����C(����9|�0����NMMm����Q��jddT\\\VVF	v��������p{������ltvvV�����[����DW;���k_:��%M���VT�vvvjm�#EW�/����(.���#� Xuu5=\�hQTTTmm����'&&��w��wo�J3)M��$P1b��c�(-����ikkS��7�����!�,�����u����i�Vq�?�033s���UUUzzz�V�


���?r����+���]����(����R,`oo�t)e._�������OIIIT������������f^2%��F$�Hdbb�H�G>z��������V�^�X�����Xzv����l���[�n�H�K}�f2�7�����?�0222,,LKK+::Z��
��� ���r��}.���v��)����W]@i&y^�{�����m@���h@�q���1"��y��v�����FCg+*ffzK.e^����i,@-@Y"#*'�
�A����@pgSzF����8����i���Ah@�q��A���s{�4][��MyL���cr��ti��<.@�q��Ah@�q��Ah@�q�����q"�����&��h��u������


es������jaa1w����gS���gCBBRRRlmm###�L�"W������O700�D111:::T,---  �������[��$�2�>�����q����hM��`���	���nJ�����3g�����������[�v��/�|���a��
<x���&L

�0����������[�����wW�LLL�����+f��q���1c����Rz����~+?��z^�./n���fk��o�A�����SYYI�E?�vsssqqIII)))144�LOO�q��m��}��%�R			�(��������H9�799� 
�\]])�j�m5i�E?r9vvv��Mc��x{{���Q$��qvv�t��+W�(���R�tww�����UUU�����5k�������QNxx8"!����@*��uk������=z�`_�����r���P�9h��
6��5+!!!"""$$$::z������������oRRRl�Ok
���93i��%K������p���������+-�4�����������;55�}���F�
:t���QqqqYY%�En��y��E�����	��m�Cb"w���'ro�o���$�r�%��4�V6��x3����������I'77�MT��s��������K�K��\c2��2Fl�J��
���j9Sd���������~�a���lN������jkk����abb��{gJ(��4e2��4b��c��QZ$�����4WmW	��h�����u�Z��{������'�:�Y[����=S��O��J����(6'LLL�LggguO:�����-�����!S(����a��l����~�8amm�7V��}�LN�����nE�8agg���>Rt��������'o����~��������U�BCC����9�r�J���k���:J���+]�E���/���b$�SRR����755m�mA��H$�qnUU���G���������>n�8����3������Xzv����l���[�n�TDDD`` �/�(-�4����������###�����������@-Zt���S�{��S[[�����v��)������.�4�</�=���`��6�E@� X��,[�,33��0=�~����Q������-T�� X��c���'U��
6l������BU�&�@qqqQQQ&&&��`�=@�	}����w%�p�@nnn���� ;;�}��r?���o3W�i��fm��,�|�����O�>mll\ZZ����}�2��{�j�4�
?�������

)Z�~��38 T�B,������M��=�����r	������9::�SSS�����@@�@K�,<x�SO=ecc���}������N��$X���O<x0++���k������BU  !
�k��o������������'���TZZZ��ou�E57�
�������Q������O����}�Y�.]���N�j|������=��a��������9-�Y&���]K�|L3�4���A��oxx��K������1c����[����8�v��C'@���bbb.\���ehh�eVUU�9���Cx%����J�v��"�����fI������4h��~o7o{@M�>}��i'N\�~=����gaa����	�����T^�_�� ������v��%��x����HA����x���4��b�����V���j�gqlz�N�S��	�>���A����WSS�H�JOOG�6D��M<���Y����1��TU������'�6ocX�@�����������d��>�`��M���BU-AN������S{������9�O�W��=J�U�VQ0���;y����U?4�����-d�oz~�Z/� ]]�7nt���������]�v���BU���L�i�������l�f���������I;�j��@Qv���.M�f���*�������dee���6������Z����[7o�������P6����!!!)))������S�L�/���KUTTL�>���@$������0���8y�$��QP��j�B$M[0Z�^CRVbQ�]J�h�
v-d��������O7w+��E5Ee�l��PO_W�y��PgS����E��3ea�h���K���yB~:k�*n0���i���#�6m��q�����/_���z�����'7���3g������e��	���AAA�������w��]1����1�JLL�����+f��q���1c����Rz�����PN�x�;z�9�%M�oc������%g_�����`����N��A��������Q�*@��kAVQ%���=�I���U�]P��������l'��>o��a���G�Q]��
z�;6��5G1�����>{��]�&l�f&�D#G���������K/�$H���7�<x��O���%$$S���������SB1s��%����������Yrr2@k����n��aBm�n_gRe����F
g�����+�2��J����S��mI�v�S.y9�B�h����v2���	-�n�z��8���������0��`��Y���\���SY^��gd�k���+j��k~��M�x��M�[��']�n������0G���N���)z�B�:Y���\�r����{���|��%+++���[�����Z�}�UUU���k������������pa#�k��9�����yC�@�A����Y5O�������jjk��Mg�&�f����1����b
$okt1}Xt�o�k�����6sN��1���������i��>�l�����b����>���VFU�u6��������[�����4-�.��)J�y�M��l��B�oE�^�*�`�Q��mo�q������J�?��{eq�����{�{�	���z
v������ST��%�sC�A����s�b�	���[j��A6l�5kVBBBDDDHHHtt���K�����W/__���$n��7o^�xQ��������������5;��g�9�ltM�����}e�S�Ne�T5d���������w�m�~���KzGs���n������,�(���W��������Gm@I��k���i���f�Q����uj����&���f��B�7�P ������)���`�����6(�W�!�E[����6]\��^�����U��������UwB	wW����ri�S��c�����LNN��)����HF��]*.���U��w�CR��w��'����m�t��Og���M��g��n������H�+��~&��2��,����"6QZZ����C
Tvoz�m.��]�J}m�@���,�����u�?9�c���K�"G�5�.j��5������K��8����2<I��Jo�w��g�B%/��;���;g^z]��6�#�����O"weG��7�k�Hf4�!�>q���5��6��nIq	W�kL&`F�;x���g���,��?���L��<�x|n����.�fv|������l�`��M������G}LMM

�����fffJ3o)�`����wjjj���G�8t�P##���b
(�.�U��"���A�N��o���~~O������d1���+C3�'}(����:V\���3D|�����~���b�onj`��*>����"q�aX2�����(�)7{{{?o?������d�rpp���8r!=�@ZY���]En?s�n�t�\�H��{��EL��l����v�x\���r�y��6���o6�����v�����0ik�C�
�1W�J�����&��s.����o������?6��
J*�o�7c�?�!�7���0�������~���]��TVJ��{J�*�FI��K����eZZZ2�uT1:;r�wh
5�-����uX3|N��?�������z%�6��kU^�8allBS	�I2\e����sQ�����"#���p=�s�&��^?I7�4�mFv�����AW^���?���I����������@t�����R���}^�]S�&Fl\Cgf�����Lf�56������ZB���_��\�L�!==�U&��a����+ 2j>���HBLj���L�@c�M�����'�Cu��1����
�z���L;;;���.�����i��[w2��8��#�����#7�����{),0`�PU���w������Z6�JLL<x����[����H�#F;&�M$�����t�l�"�_��s�)�K��������/�l�������9�7��|�p���%@��F����z�3���n��_\)��0�O�q���v]Qb���V},}�����j�?g�����17d���1��fzK����
����;$}����I��U�U_��f�����]����jK��=�K?��@����o�A��Z����U��w�M���m���1�@��\�(PHMM�~��������U�BCC����9�r�J�W����v�rrr�@���bQ�������q'�������@�MMM�	9�������bUR�����L��b���.�����_K�~�Lh�;������+�F[z��_���)��~��j[+�o������W}]x���xq�����������h�����\I���
�M���^��*�l����q�'u�6Q����9����3���u~Y����������U�_�����:�!��sy���k��u���y�����'1bvKU1A	v������EEE;w��v��P���WUUu�������^�:66��/�f�����u�2J3#"")|����K���w�_�udddXX���Vtt�|+]iU�������*��W�dD7���\��{���u��������_����K�bx{��8)�6]����d�����?�l�F�av�.��U���g�����9jq�~�]55�2�
�M������N�k���cv�����2��h��������t�k&Yr�]gf[�CJ��^���?e�{�_�m
t.f��=���-�	���{�J$��0z
]�����3��0e��������=��������������v����d�?�1�"�Kp=<<���4\UZ����;W'@-�������{�������8Z����+���/�m���i��.���U��LD���u���/{�������^3~�n�?s_r���;3N
+��e.�n,�P|^�����/�,V��hnie+'>�&{����m�D]/������qCM��#����Jrw��>����[#��VJ=5�����������j���f������<i~����,N�v���JaX��}p��;r�3�&�Z���h���>
i��8���&/�>x]z^?�Jua�H-������u+$D������)2a?�(��G�����R���Z����O�i�9�=�I�������������{������Ao���
(���|3�Mw�{���������?�=%�EuU����l��W����������{Qk����t*��z���#����F����I�����1 �����coo��S����_
��}���������c|�w��Mgo�q-Q��<��������� l��m2z4�yL�M����k���U�=�q����U����K���v_��M�V6���Z��+%7�w�2?T��O�'��-{
��l�6��Q�=@m���4��y�~g_��;�a����E���*�Oa��>�^��^�mA�K����-j�/mizs���s��4������<m�����M[;:��
������������pp�����V%@��r����j������r��l��c� wo��5��_�=�Gx����T�,���������:2�U�m�jJ��W��T(}��Q���L����0���������B�p�8������S~%n�c��$K�WRZ���X\Z�����v����g�����W^y������{�6m���j|� �������53�DT�mK?��:TuTijuC�E�n6�V��9qG�p�A��<7���GZ�����L���/0��8Z2S��iK%@���N�O�~��9��0|}}]]]��������ys{�4]u�Y�M'3���J<}��v�i��Bv����#3����^"��4�Tu�-�`������{:H�<;;��MJ�������~�?S�T_���]>���9����~:�U�e����������>����������m��M�������,��f��������eee������0k�,�*h�*�D������������#Ur_/T]�f?km�`��E�����=���K1PDD����P��R��_xk�l���S��J~��V�T�~�F���Q�������\g�����,���0�6D�o�v��B����^�'������l��@�t��(_���!���ghuErG�����/F~#���q�<d��Q���uh�v4h�����%�V�n]�VG�����+3��%i�]���Z�����I��@���z��b��~����X�%@TPP`aa��z�FvN��;�)add��mane��.���Z|^�	��s�������yL����TWW?��f3���T��S��|h�����h�H��-0�&�cW����T/{&��[�[T����Gv4��@��]gF�g�'�.<y���|�@4��7�2q���}�����n�����������,}b[�8�VN�H$����J����T��=/��\: }����@��{����:^����CS ���A��W����#�M�8>�SU�EYL���q����4P��	 �����"�������L-��9�l��<��M��R���U�5*�e*$�\E�������&��h��cA� @4r���W����~���{)ajb�����������|��l@s7Z�������+}j��a��Z�}��{o����)�H�h��)�=�{���+�w$�{���/��F�Q�.j	�LLL����[8�����^�����~s�����m�	u��E1��'���e���G��Wt����kkk������P���g)���bkk���������O700�D111:::T,---  �������-���������tAQn�6��=@r�V^^N�C``���_����"���8oo�����}����
0`��	���AAA�������;;;sKQX�X�{��������:uZ�b��380f����ZJ�^��@� @,�chh�������k|��n��QYYI�#y�������K����R�%��������}��%K��PB1S[[����r�orr2@k��uuu�'������Z.'11q���<�L�+WDO�������
P�������������3EE���\��X���J1����}A������8##c��5111~~~��H��S�7ASP��O���_����o�����?44477���>����_544��P�RRR�_�*P�9h��
6��5+!!!"""$$$::z������������oRR�:������_~���oR�"x��k��M�2e�������n�5j������iAAW&??�������J3}||>L���SSS��oO�:t���QqqqYY%�En���x�-��)��+�+�W}�K���K�F��4��e(��7��F�(//WZ�846�&d�������4m�(,*�kd^�UG�����������W��,==���k$��0���ty�������������b�U������ji��7�m�,M��	���a�s����kOQQWmZ�]�@EE����"���+���:�KP�HP�p�&&���6�S\�-��$����:}���r�����te#:�w�p�u��z�=�|�%n�(/@Jv|>o���5&/�K�:u� �F�]".3����Kz������#S����l7��1b�rBqu�|Y�3�AR�zKS��!�t`HK�F6���;��C��K�n��ypD���8"*���()���%!�_e���������uD�;�;��T�x#��J�!�uG�`P:"���l�x��d����!��N�f���|��7"����f3y���|��"-Y&�CN�8��.n<D�(���k������<xd�;wNT�����3"�d�{]�\���M_�	��K�I��9
���%L��=tme
��j:�?�!;�7����e�&M�dbb"x��#G�t����JS�C����N�U[[��%>��_�w����fR�2�~1b��c��/��������]%�+�} �m��������~~O�m����=�>d�666w�����������x�����������m,--���YTm6s�M�����&����~~~l���tF�#V�f��=i���[���u1������tu��"��O���H�J����05���`h`X,�����[��pQOW��B�������v�7&%_�a�Z�4@����+j�t���k�UK���'(����++�9���
�b�*�y��[3u������B�#��U�Q�/�5����\��*���4!�S��
�����'��]��V�V���JQY�5#;�P�dKJP�sg����X���+%�g3?���c� S#��,-,^
�����������>�9J�T0�^f3�����dG�����R�#��t��_`*+�K�=��Cd#B<
�0ui�:�B5��ZK�e��?d�#b����������i�
���m���U��Y�Z:G)�Zo!Wm��015��/N�P��
ps;5�P��G���0��Q��w��p����ZnD�����]=]�t]\��?��*���noD�c��r
cG���1X�]:�v���-/e2;�g<nD0���a3�F����]�������#S����O1��v�F��9>0"���v-����3Rv+;�s#��O���2��
+sS�,�9o`���l�[7����dNC����nY�������U��\�!��T��)j}?���_�+W�\�|������?�����_������[�jUhhh||<I+W����v�rrr��J��I�R,�\�|9;�����$������i3m:h��+���&�>} 4��>�@��'aQ�J!��I����&N�8k�,���������SX�u��n��������P�����L�{�n��������H���af���h�;����h�����"��c�[�8K�����A[K�����<��s555�V+�
	�L77�S�N�e�?^u���y	�!E]�{a���,��*kC5~4Y�����e�	q9�&��@C]�|y����O�666.--�������^Ph9�������h����7)U?�P����(�a�����g�V��DhR&27b��-�`���^ZZ�#$55U___��@�����g�.O���G�6�U����k�F�D�@K�,<x�SO=%�����'N|��wBU�,�^��/����|0A���`P@@��O>y�����,//�������U9h���.}��T6]�������Z�1��]�����V���f��C�o����m��@&X��,[�,33��K�P���"XF�����6^��M��c���'O�6��:����<GKfJ��n
@�%X4l��������
U!�����EEE����	�@$X�������U[�T����%N����b@5� 777��j��v3%��	�Cs7@�	�=@��Pll��	������_��	���k��������������s��59g���eqB_������iB@/�����w~~�����S����@M�u�����A&�5����v�j|m��jkk���������q�6G��	��~


�����o��6 h��+
�o��&�7���m��	]�|y����O�666.--����������P�E�(888000!!����������1���B��QjDU�E�l���DOW�y���eeeQ������g�����_U���~���3'����7��R����,���KKKsttd������uh���,Y2x����z���&;;����}��P�H�(  ��'�<x�`VV������������\NAAAHH�������g���t�R�<{�,e������FFFN�2En)�3+**�O�n`` �bbb�_xMKK�
<y�$��i����[`]�v}��7��>������w���w����������'L�Da������;er�PX�X�{��������:uZ�b{��1cjkk)�z�jD?mC��1���������LCCC��g�R����!F����7n�����,Y�-�~<M�%3����;��orr2@k��uuu6lX�l0��@.\�����5k6o����3c���s�^�r����+���|��%�RJXYY)f���WWW����*cc���ZWLL�������#h�����RSSE"���#��V�����y����MJJ
�5O?�4��������+C����RZ@i��A�6l�0k���������������K���7�W�^���III�"���/������\:��}.]^Qn�'iLi)�y�W��/mq	�o��;wNT&������\�
[�H�//WZ��+�
�	������86]VV�&
�
���V�VK��z��2v���"+==���k$��0���4u�t�����R�m{��*Y�YYY\��n��o�ZY�jc"Q]����pi�=t�r�����
TT��J�*2�ky]���[�Y �k�!\���u;����w���)�a�u;�_`����&�8}���r�����te#:�w�p�u�\�G�M�|�7r�����������O�:U�S#��
���`��%=����}`���x{����h�'�^���FuH}�e,M��D��!-Y���6���;��C��U���uft�*����*7"J��@ii�G���Cd�GDz�mFDp����<:<�����uH~��?��*l'�.��*�%%���t��0�����u��H���6��;g���i�2�r����tq��#B�������x'snD<���;��t2�?tme
��j:�?�!;�7��PLL���+���������&N���{�	X?�������3gR�w��S�L��o���K��L�S��8LMM(�����AE���)�k����Q��jddT\\L�J��t��������#������ll��S��L�xu&�u?�B���?6���[!�/KKK�@�������>�2���ZIa�~0'�,s�M���T�J\ggg??i�F?�3EU�073g�IH���������tn�l���[w988p�~��FrV�W6��a����b��077����������'����j�]��I�Wh�V:
Pm����JG�&u6��q�R{���	��\�e�3g�����b�*:��d-�f�N)uR&K[��uWmF��L<�03F2r%{���Cd��xO1�6���s�<I�IQ�mjbA	������hem�n��N�/Z�";�P�dKJP�sg~�t�;���q��l����
�������;tyRw����1|�s�((�`���f�]s���#7"�m��]Zo�dD��s�.��o_�{�!w���d�����ZK�e��?d�#b����������iWV2l�T������T�,W������0��r���S������1
�\�7�S�%�D���sQ>��q�H7������F��oD���������&���tDPa��t�x#��}�k;"LL��35����m;���R&�Sz�p#�a�E
�Y7",-,��G��#��LOOO��O1��'ss�����97"�d���*#��P��\������U��\�!�/V}2�0H����������;��=�#;�P������B���#���VOO�"���(Jki�z�Fd��QZ@i&�)���#F�8v�#�r��E���wY	����%K�t�������8����W���tu�����E��X�����;v���y����A�V�


���?r����+�O�:99Q���]�)]�E���/g/b����$�������:������{���g�}688������K����p�����\��7R���];�N/^��(666((�RX�u�V�wX#""�$�/�(-�4����������###�����������Q�d��h����P�@1���>h� A��O������/����v��)������.�4�</�=���`��6@����:??��9��M�;wn�.]>��#�=e-�����cbb,--���


������G�����%@��_�_�L���'N�x�����W 8�����?��{�����'O���K��GFFF~�a�+�����}�����[WWw����{�Z  ss�������4Z���4 �8�@� ��4 �8�@� ��4 �8�@� ��4 �8�@� ��4 �8�8*((puu;v���k����gCBBRRRlmm###�L�"W^i���������D���*���p��I�o�-a��h��9\8BQ��	������(L���uwwwvv�
+-��{w�����N�:�X�b��3fLmm-�W�^���mh���={RRR^{����o����CC���`J{zz�7n���K�,��+-@	�LmmmGGG�������]����u��a��� �V������������fs�\�����pvv�t�����3�������aUU���qFF��5kbbb���('<<�@k�*�Y�f����NNN\NII���!����/�����A�m���V����t��y��������7))I�j�����wgddl����ijjZPP�=���733{h��>>>������������5jT``���C���������(�.r����/�����9��s���rC=q�������+PU]�h��-�2��;'*{`[Hnn.���6�����V+��
�	������86M[�&
�
�yyyV�VK��z��2v��/������j�F��K
��*MS�H�[X�ma.�����������U{��-�f�����66!�5�~N���STT�U��v�+PQQ�+������u}�[o]f�l�Q�p�&&���6�S\�-������~�����P��u�������W$����<��u��r�=z4��
J��Q^�;t�y��_��1yy\���S95���q��6�\�#����������!���F:qr��nDP���^���yp��G��E��k#;�c�:��[m�Yg��A�����xp�r#��Xz���<p�8�:D� D���f�G�9������S�����*Y���!��A����v���m���ZR���I'[3[J\�]W��d_�j���sfA��Y��,��!'N��L7�?"������w2�F�c���cOM's�C�V�0���������y������~���G����`�����E����jkk����3�"�_�w����fR�2�~1b��c���C�~L[[[�;�v��������#������ll��S��L���`bl�����������tu+��cii�������~�_&��[[[s�J
��_��j��kl�����V��
8;;��I�5�)�)�����9sOZ����r�oee]��s�e�&]����������?�0���x��!L
cd5P�K���y�l��66��wH�8agg�U���oLJ�B����i�j��-W::�0���i�������-NP��U�WV<s&�M��*f����'k�5SwJ���2Y�B���C�j3j�e����1��+�Seu"�&�{������;�IzL�������Z��1�K������t]�!*��fd���lI	�p�,���b}���H�����ZW@�����`x5p�.�C�s���1|�s�((�`���f�]s���#7"�m��]Zo�dD��s�.��o_�{�!w���d�����ZK�e��?d�#b����������iWV2l�T������T�,W������0��r���S������1
�\�7�S�%�D���sQ>��q�H7������F]�=�����I�e��M��A�����]�v�FD;&�*�0vD��s�����m;���R&�Sz�p#�a�E
�Y7",-,��G��w6�2����}�bJO���#��'snD<��\w�UFr�������+�������C���Uy2�0�U@\��?���\�vmUU�����U�BCC����9�r�J*�k�.'''
t�����I�R,�\�|9;�����$: ����iSo3��@JQ\�x�b
k�n���[7��������J3�m�����}������j����������N�:%W�����(�$�Kp=<<����
h��c@h@�q��Ah@�q��Ah@�q��Ah@�q��Ah@�q��Ah@�q��i�PBB����SSS-,,���;{�l�<{�lHHHJJ���mdd��)S��RZ@1���b���"�(&&FGG������<y���~{@X�/������[�v��/�|���a��
<x���&L

�0����������[�����wW�LLL�����+f��q���1c����Rz����~���UVVR,B�����\\\RRRJJJ

���)���s��q��o_�d	�TBB�bJ(fjkk;::R�MNN���-WWW���g�@h�/����6m���������;..�"!������K��K]�rE�����b���{uu5=���266�U�Y�&&&����r���	�v�/���uk������=z�`_�����r���P�9h��
6��5+!!!"""$$$::z������������oRR����7/^�(����s�����tyE����1��\�}^�*
���%�����s������V������������r������@��INN���M�������B�@^^�UG��Rf�o���x�l��JOO����_/5���4M"]oa!����r�^l�JVsVVW-�w�f�����66!�5�~N���STT�U��v�+PQQ�+������u}�[o]f�l�Q�p�&&���6�S�a'������~�����P��u�������W$����<��u��r�=z4��
J��Q^�;t�
��kL^�>u�TAN�x�*D\f��
3���#"���2z���wHbb��N��z�C��!����4e2�A��dG�������1�VA�n��ypD���8"*���()���%!��-������uD�;�;��T�x#��J�!�uG�`P:"���l�x��d���(?g�������o��F#���l&��Y�/{V�%��w��'2������'��z��������'s��S��\����5Lv���d�@�<�d�p�5:s���I��,Y��djjZ�;5��43{�8SZ@i���
*���������}�Q�F:���������`�*�_���#G2�%����0��
���L����666w������n�x�`,--����3�O���D�kkk�ZIa�~0G�f3�����IE�4�pvv���Vk�S:STE	s3s������7�YYY3��z��IW��(rpp�����-���$^�lS�Y
�!��Aann^+[���
7��R!N���q�n������0j�t��ng����5L:�l������dg����j���g�d�i�S�lUt��Zn���R�:�L����5������x�af�d�J�TY]���	��b�m037��y��������Z��1�K������t]�
��LkFvn�������"�j�Pw��J�������u]K�Ww��:�;w1��<G���
���l&��5���0r#��������VIF��97�2}������Qp��KK���Zo����^��C�?"�����|�!>��l�vqe%�vH�l{���Je�r����+�Zo!Wm��015��/N�P��
ps;5�P��G���0��Q��w��p����ZnD����F����H�..n�JGf�J��7"�1�W���#����;S�]:�v���-/e2;��
7"v_���u#����.{���p1�������t�����Pz27���?�s#��O���2��
5��]���]5��%R,]����#�A�2���~�������9�{����������t�8x�`�"J(��4e2�@u����c�WN"��`���"�e%�F�/*--�<y������xyy����Z�*444>>���#+W���]�v999Q���]�)]�E���/g/b����$������iSo3��@{��MOO7n�3s��/��"666((h����l���[�n�TDDD`` �/�(-�4����������###����������rc@Z_���/���*�����:uJ.�����(�$�Kp=<<����
h}@#!��4 �8�@� ��4 �8�@� ��4 �8�@� ��4 �8�@� ��4 �8�@� ��4 �8m':{�lHHHJJ���mdd��)SR@1���b���"�(&&FGG������<y���a�@Pm$��e��	���AAA�������;;;�.��{w�����N�:�X�b��3fLmm-�W�^���mh#PBB���app0�===���}��%K��.@	�LmmmGGG�������]����u��a��q �6]�r����{���|�������R�tww�����UUU���k������������pDB�]	�JJJ

���P�C(�4h��
f������t��y��������7))Iuc���L���Lsgk���n����h|?i�:�X��:�M������rT��������=zs5s�v2�e\L��&���S����`|�26������6mhYUe(~���������������7 ��\�iT��#�5k�XJ���W�&l�,�H3��E��$�jSe��2���>�)����)�U�����`��:��TW�;���`���&6:]:J���VU%nX��u�f�����L��FVm�v��p6�c�D�g��)��\P+���EgY������D;�\��}���JW���V�S�-�*6������tO�.�aF}�v�U����~O����~�A���=����/q�����b3{Z�����MD���k����js?����M��I�������V��=�*9H�[=�6V�����;�dV���������U[��I;�^��l'�.c�ZcS�������m_i:��Pi��CWGVm�vo����SO6a�����5m���Dt0�r������z���2�l"����;��\�����9�\�������R�i�V���C���%GPm�����h��y���a��i7�M>�G�R$�L��7�] �"2�b��JR�����U���z"�BV-oD<]k�_!&%F��-7io�������J��G������#}�lD�1�b����G��
#�������FD��5�1rs�!�6�s�S�����#Bdl��Kv
oD�2���������K����^�Ld[a,�m���be�h��Qa�8X|�hk��-�q���5;[i��#B�����d|?oi��?��F�c���L\^)�j:�?p���gl�]��j:�V�-��V���y����������{���off��J3}||>L���SSS��o?j������C����Q�]����/^�k���C��K�Y�Q�������+c.K��0�����}\��<�Djr�c�\���A]��J�-3�U��X������86�J�O6��e��*�V|���M?���W[����I����Y��8KY�w$�$tx5Wp�f_f��D�D�T�Uk���8FV-���J\WmYs^���&=���Y���C��uA�\�]��e��������e�������A���j�g�R�j�Q��ZCF���)V���%��)�V�������j����'�(V{�1���C����U{�b*�����C��*-Wm�9�K:�Xm������UK�^���Q�����_���G��>��c���.�'a(��HW����{����zF�dD0J��4�|��h�����x#B��FDM6��?"�d������Zc����q��g���<"ty�{4��b�����j�J��]d����I���y���8�+�t2dUW��N��1vS�O���p2o�6���;**��W��������~h����Lz���5b��c��QZ$�����4WmW	��h���	���V�5�ZT��U_�����Z���HaP	�������V�Z����+WR��]����(�QZ���^�R,�\�|���8���������i=�����@����-^�����[�v����#"")|����L�{�n�����>���������n��A�������:uJ.�����(�$�Kp=<<����
h;@!���C�j�����X��jF��V�����G�h@�q��AP�X�n��y����BCC��3!!a������s���={� �8p`�����_�����g��)H����WW��c��]�V�:MLL���}���'�x���RSCBB������O��t�����k���^z�{X]]M5�^���5:t��Zqq���vXX���u���x:���?[[��+W�3��*��g�RkSRRh���S�L���2Y� �N�ZA]}���A�X� #N�Z�F�\�B
:�2��m��Sz�6~��w�7r�)�VM��f@�����O�>�������Gg��_~�����
<x���g#��}��/��c�ug������j
$H���9s���TUU�����w������Epp�����;w���'������=|1�����r6]YY9`��}�n)STTD5���y{{gdd�����:t��FV���5a���7���������Q���d=BEE�"<<<((�������������**iH��e6�ZA�b��:���A�X� #Nikq�52��d�)V��A��(8p`#Z}#��j{������A�,�x�
�>>>�I#�.b��L����B��"���111�5����.99Y�h��=���^{����T�H������BVNNNlllff������]<	[?���Oh`7>L!7n����N����������K�_��':w�L'bJ�!����{����"�8�:�z�f>J��;n�����/Y��������jt��
2����F:�jq��
5�T���t��
2��m��Sz����4r��w�7r�)����Q���Y��P� ��k��il��?��`�b#�����(#���S']�=��3����������������B�Z]]]:�?~���b��Y���C��:uZ�f����uttf��1w���W��u�����$Aj��/]#R���"��iii^^^���&����������WS��@�r�
����tIJ�H���/���
2��d�)���:�jq��
5�T���:�jt��6~�)=J���9��;�9��V����A����;vlddd�=��s��m������������,H�t�|�����!Hmj*�������O����it��������7o������G���O?M%t�$H��g�}FWN���������q�F��������>�H�~�ke:�~�����'<x�&<�{a�=466�aW��<�Z��c4o���R�:���|]���3g�L�4i��%\�,��^z�.k���_��H~(������y���qrpp�������O>9u��������i����s����L��o�>�N����6l�x�� ��k��Q������I��Q�F�I��w�T�k��w�}w����%�[i0�������{���off&�*����5�8F���Q*�@S����Zu�P���?������.T��/_�z�*�|uuu=<<��������s�O?�����F�4����������{��eff8�}XYYIWf����>����"������.�����jY��4�x�t����������Y�������#Grwc�����5A@4�EEEQ�jii����Du�_, ��8�
t�G� M}��i]�����<y����=>�D�����e��a�n��A	�i|�t.��~�!�@�����G��?����D'O���m���;_m��]�4�h��+V\�~}��^I���_�6Fr��r�
��t��=�������������j�}G�J�_t�8v���W����E���U�BCC���iRY�r����:G�I�N�Q������_i�jZ����D"���������tj

j�W����7==�����3����FV;t������Zx��sss:/�h�����t����;���g���_```�v����/^<z�hA�e$olw��A�����m��I����N�8q��Y�����l���S�L���sqq��g����c�V�@�����0]Fo���[�n���N��tJ����n����9��t����F����m��S��t�U��AW_��t�M
�hJ����n�������zJ�������p�B!�_|���V�j�t	u��z�����PM
���3]�^-��e��u�!!x��JRU}������S�W��AW_��t�U��c��'��tM����8���AW_��t�U��AW�����V_��h�U���
h@�q��Ah@�q��Ah@�q��Ah@�q��Ah@�q��Ah@�q��A���)��)�w�5���a�7n����{UU����c�{633�!��>��UW2�����06��5-I�}��DI��-�m�d��m�jkk��3����mM;����!CBCC_}�U��FFF~��'3g����5�q����f��������/~���-������;w:g�.��JZ��T&�SI��Pf�~��VSS�%!x�������U����1!����r���^�zu���}J�C�U+�*	��)�|c}�M�^~�:�m���7��qZ��
�_���edd���4y<��k����u�����e��S�,�=7m�DW����;s��k��6m��f���s����s����.\����^Z�~������=�����w�}�������u�V�>}>���]�vQ�����\����������-�~HLL���o������j����.���P����_�D��|�r}}���G��������������{�%%%}���G��?~AA���������_�����{�>��3���o�~������QfzzzTT�����w��-A�������{��:t����g��G�����#S�,�FtV�����n�:��^��&������;v,M�'N������_������w�X�"00p��E���;�14�TTT����������}��.A9�����m�z�)��1�(�A����Lm�(���v��	����������gQ������G���	(���)33�:���_�'�?���i����Q=�~�m||���;/^������S�������#]�)�.
)&����w���(��L��ZS���������?�i{�����?�<�a��������A�q��7LMMi^�������lK�#h����/o��6#��i����711�v�������S�Nu�Is9z�(E{�P�b�N�:1�� n)*`ggG����;w����WWW�����������TUU�i
��z#�MC�����M��H�����{�."mll�:�v��M�67
�222���5��/�H��;�?~��u111���&[XX���i�i�7
��	JP
!!!>>>J��x�h}�lKh�Q��=l��S����w������g����bV�����O������KKK���r�^�B���z�JLL�����~�-00p���?��������kWF2-�S#�����M��tK}�lK���rss���0
��:P�=������M���Z8@��:4I�O�>�6m���n�=�#F�������+))�3g�[o����:u���>�����������;���
6,[����}��}��W��x�i-�������o�4�a��]�z���St���0
���#G�������/]�������������`zwm�}���A�f���QQQtz������o����7b�pW��������
s��
����
����>�����)S�����)�&!�<]yS�"�4i��	�����!�����U��c�%��-0	�)J�)�Z�D[K�G;%;�P����[�n_~�%���������>�D�p++����w�yg������}������W�� �O��h:i�������Yr��q6�f6�X}��u'�a���-[�w*4?����
)8d�������������������v����Y��i��#��0���Q�v��z&�����oI�e*����d.���u��i���>���N&������
���CmMiii�.]~��__�#G���u���J�����&�n�� �����x��Ms��
633��m[��04 h�&H4w+��m��[@5@�q��Ah@ �k��)��5���L�"C�	

e�RQdd�'�|2s�L�+dCyn����{���*]]%c�{633SE�GR!b�+P�o��t3W��j��j����s��b~��O����tM���?D4�
����KLQ���>��N�Q��m�������7NMM��DC�<v�X�^�:t��>�����;w:g4�XCT2�����d�� �������
�~�j��m���>�^O�Z+��f?D4F4����n�������G��>�|����s����.\����^���OMM}������>����G���?���@GG'$$d�����_wuu]�l]������g�Y�r�����^��`����2�LOO����<y2��U�V��������^7����O�Y�f����o�0`��-[��T�yK��m����z����W�>{�������O?=w���[������g����������Vw��M�
������������� hR4
������������)3??���4mL�8���������G����stt�����'L�@��y���tN�#QZZZ\\|���{�����kkk����qqqT���~�s�����'���\E5P=�***�����#Gz����b���S��RG)]uPP����W�X�h�����&W�0***h��
Zi��}�Kpmh�O�ir���C��CM�.�����6�I�:u����������Li:��7�����������^����3Mi4K��3=|��W���.�����]�i��(��/������d��H__�����5����N�J�����_qvQZ,//Ou��@G���
6xxx$$$4�k	�����)5�"	///�6�[������ hRt���i�v�����w�fddt�������_|��]��������l��34��_����E"%^��������y����p����R���-���[u�����n����~Klll����M��mx<m�[Z�!
��!�&eee����=��2����^�z%&&��T�h�fgg������ �����:��US�o��8w��~���������+#	Y�0��m`�-B�@�!�&5l���W��:u����&����1bDPP���{�{�����9s����[�����9r$M������������_���6B�C��ZZG)]������S?������_�~;w��^W��a��e��1�������i�n���<DZ;@ �����s������n��}���4hkk�?��3�HdaaAs]+�������������ccc�y����g���~��G��g���F���jm?���b�$���[ZG)]�|��k�)S�P����S&��-��S'*���;i��	&dee=t���=�EU������kB�4�!
�!�`FG/jH��$�2�����e&''si//���O������)h~��3�������*���@�?�&���S�~�,���D�J���R����H.����N�7n���AAA!!!J�P��&��?�e����?D4 �C�u��nh9��AB���t@K�4 �8�������YIEND�B`�
bench-dbt3-10gb-duration.pngimage/png; name=bench-dbt3-10gb-duration.pngDownload
�PNG


IHDR��8�r	pHYs���o�d{IDATx���\U������/2\�	��TT����r�� �p������E�W�
����Es�p!bp�( 8�2.������x ���~���>�9���s�9�s�]UU�����@SC��j�� P;@�v�@� ��A��j�� P;@�v�@� ��A��j�� P;@���Y�~=����177�����i�&L�����8�9::R���/��1c����U����R�,//����6m����,����g�u��MU�?��c�������h~��;����k�����x{{���������������3>466~���N�����~������{���W�0���x�b�>}BBB���H����+=���6R}� CSS�����(++KKK��o����)����_"�Hn�����7�����cf����GM�4�F����C�y�s���
��/wuu�-.]���W_�����V^^�����������9������|���			��������+V4h��%:t���=v����s����}}�Z�����<y��U��|�����kee��SP@����x�����3g���{7e����/J����[���{�����S������Q��������O�"�|�	�#�G�u��	///������s����)�P��/��3z�������ibb2r�HJ9����C����>��i�����e-��~)�<�%Z��W^��6��:::-j�g�����0��3�j@�e�������������]�v������hffV�������}&---�����*E1��\������������P�122�������7�P�Y�r%�~X���9994L��j�_T����H|���|���}�*++���)�
<x��'Nl��=�B�������A�Q)6)RJ����ib�C������.]��3FSSs��54f���������������G���\�d(>r�j���g��QXX�x�b�C;�v%��������R#�f�a�������F�������'%%P�_|��d{{{����
�w�^��?���	&�����Q��aCTT5����rF�Q]����G�-X��!�(---((`s��F��8���F��7n��_|�E��.�/������%��3g�y���>|���������)X(]�����~
t_N�8����R�����R����e���X�b���w���={6��.�����SV��v��������g�R}v�m���]�|�t2aaa�dN�<Y�GJn��Cw644������;��Y�fQ����I�%==���cq��,Y����#OO����?��aW�^����|2z�����6m�P����S���Z��������_���7+**������k}��lb���t�ddN���O���q���	��n��������s����Y���t�(]%%%)��///o��=_��C����F�F�-(9%%%_}���q��.]J7)�P�����_��{��s�����cmmm��_����bJ!57�N&  ��
��]A�����j�	Kn��,��O�.]����RZ����H����m�V�HQQ�?�0u�T��9�S�7o�����h�"F��
`w;��|��e�7�@ �FD�W���S���)�'�(LP��������WpT)//������466��z��Q�*�����_~����r��YUUUQ`��r?}&�����7�g�_��w���_z�%�Et/��:;;s=C��u�qqq���({�N8q������=�6(.Pd���]��?���3g��L�~���!C��:���=!�h���+),�����l��(���+�������n��QN�p�{������w�����8=`�UBB���S'����\�^�[YY������'2J�<y���p�v�<x�-�,���>f�;;;�A��/�������}-://�C�t	g?#������M�6�����������C�������<��mUh���c�9s�p�����^��6�����{��3fl��m���J?9R��������bee%=4�n����_h/����F?�����)���d�Y�6m�����w%�*@����711�����>}����.]�9��'N�m�1tu?r��[[[��R�����+W�>=F���
�����'&&R@���5j�������Q�������+��_EEEQQQ[�nU��=���B�'33�k�}JE���Q������G�*�
��7�xc��-}(�����q2>�u2��_��a����z��)))Q5���M��G
��������������a
�1�P�������x�����/���O��{�����}��u�������������o��C�|oooj������{����o���	2�Dr����+��_�����T}U����fll,�MG���R�a�aqs������QJJ
��X��]�a���=��W_���hw)�����;v���(b�`377go������{�F�;7t�(����1c�C�6;;����0�2��/RYYy���?��344t��������G��;w������������n�����w����/�����������������)���c�K�+(m�����]�)��5j��9T-99y��c��4h
8p��?�H���������k���"������T���~:t�������������?���K/��T��������k�d��[���H�el����'�|�b��.]��=�����k���.NNNJ74l������}�����r��-�e2�huccc�C����Y�le/Z1::�����r��)���f�%��������K�����g����mll�<
� �=��t��m��g�?������V5����s��.��\�~;������Jq�.���������e�����H
a��+��a����6m��B�����[�n�<yrPP7�����������+���OQ��^�?�������~Q�P��c���5kV@@�*�)�V��|�.��B9����
>��_���?~�d��X��O?Qj��
������J?,��tO�8F������)�����<9��(�������x��	&\�p����/))�=I9�*�����=(FFF��i]j�������._���@�o2
�Z#S�0�#���u������eT-�����
jX����$&&�<��������/^��VVV�������f�(���C���;wN�2��_�#7�k���_����:u�k��s�k������B���m�����xV@�F���RRR���������r��A5�g���s����<x���0� h�z��-��;~2�V
�� P;@�v�@� ��A��j�� P;@�v�@� ��A��j�� P;@�v�������{��q��5�D�ikk���������t��5;;����i&��Z�����<W���_z�%j0 &&��(55�}��r�>|�h��8::._����_�a����?�p���������������CKU������(n������<yR"�t��m���o��&��������s����������.\����2d��S�����a�N��O�����Gq����������F�?�?�������fr��]�X,�����_}�U���^{�������rg��
�N�=����2s���v�>>>������5���������?k����������ONN.--���3f���n``@K�������.]���M���C������Y��!��>j�����T��*����J�Nh�S��@����/��6�����DW}n]��S�())��o����O?���o\�r�}B�����^\\�o���7�|C��7n��EU�}���#F�uR�F�U��n���.K������/��E��UK�,����<q��g�}����e�]����w���S<277��w���$999t��0aBXX�����1[�n�=@3��q#]���[ZZ�[���RRR�����_�;�k���>������:t�6A!�.�u�y��B��z�+V�������������vll���RR����2�T��K�����q�._�Lw��3W!77w��al�n�s����b)�w4�3g�|����m����9�8��Ou���+�G`�`^x���|����������{��M7���+����a6)�~���?��3<<��t�����?]*(E)������UUU�.^�HH��EEE]l(��;���(��|LLL����3�Z{��
@�f��lA�����_?777
IYYYm��e;i)7{{{�$�uK�~�����_�c�������)Sh$��p1�xyy���������r;r�H�	��RzgY����O������@��=��sg�II���K��7��D�����������������.���;x���5k���i���?���t��4I�~���
Rt{K��9j�(z��]�F.=����7c�J�������~K�2�Y�t�R���1c�\b5�QSZ�c���~������C���~r#UM[qz-<���D/�>LW�����-���G/pw����|��Aii)]_U�N���2h� v��������=K�
�����'�|B��O�8��Z���s�Eggg~'�ww�u��Q��6��6m��1�r������#��J_U{#,,���;���u���*�����4�+W�P�����;r��Q��sK_|�E�4C�=J����g���J�lff&��k0e)jt�����\�yhh����)�DDD�����#��}��Q���(��C���g��E4f��i��]�z�����M�+!!�S�NJ�����$EdJ	lOjP������N
C�V�255��P���{��
j7����3=j5�������Gp���r�I����5B��PAA���Eqq1��)7���������w��j<y�dOO�a���L��t�622������aIII����t9�W�'O����R�4]�_}�U---������5�����t5��tu��
������r���BQ�����>��D"��y3]�w���u���������A��)������\��
@��+//��+����R8�����/���C�6l>|��K��>[�f
��M�6})S����4i�F�n
�
�W�X7o��`����>.t����_)�-[�Li5���G]m���4d���c����CI(;;���)22R�SWJH������%��������-�������Z& x?x���I���O��m�����D�?,�����o�o��BF
��UA�1]��U������E��:u�\'e���G��;,,���d��=&L8~�8��-�F���;>>�m�%�.�l{��1�~�-5JJJ��O�^��S�S�����[C��.�4��Q���		��*��Ca��%���o�M�>q����~�m���y��;��o������S#88x���7n�������bL����(���;Wi}9�>���.���K���]��;�QVU�����S����YzL�^������1g��IOO�8B9)**�����?t�����g������s����Z
� �K��6�?d�>=������t�{�.�����p�+�����W�X��T��>r����<z����]���kgee���mS,���K�,y����U��������������s���c����@��.��i(]�p�{;�.Qq�E�����`hh�]�i��M��O>a������&�U����RJ~P�O����
u~����##�I�&�]��{���](o)���,��!�+D��c5���(����s�Naa!5�n���k3=�������^��#e>���M�6��9s����{r�d(�������5k�~I!�{�z���\�k��V����N�:����2��8=���Ct���������uee���W��G����zL��~���������L�z���+�0��-�MWAU�l����������'�����u�K�.J�����t�����	]G��G�6333�����[����U@t7�"�N��=|�p
��}�X�����3���L`` �+8� ������\]]U�Uw�z,,,h�q�������XJHH����/]�t���4�Z�o�(f���&�aKJJ���46Q ����l�2�s��<x���CJB����gF��O����:t��_~�z��\��QS�v�����/��2u�@���!�����????((��C_�5]�f��%7���d���>>>C�IKKc;


U�N�)S��������m�._���%o��6]�������D"E�����Kp???��9������o����Z���������.��h����d�&�mb�g[�l9w��7��w��R-Z��W�Z�7Cei�{����_�:���_�6����;������O�4�^x��/�T���Z�,;�Z����]��~PEE��i��}�]�S6JZ�����j�;J�����u��A�Q�F��~��]vvv����G�������gmm��2��}���'����?��S
L�(����������;v���%��yyy����\R����{�P>�������e�$.G�����Z x���?~��O>0`]\��p��	��9{���7���:�_R�juzO�jOOO�f�e������D��9���\>��Z��gO��2�7�|�x(�>|�������5z�O��G���~���h-�vrrrUU]�=<<�>���w��[�X-]��._�<t��;����O?�����M��7������.������-�~[�"Uw�������g���P����=���Au����sC�d�]�k�Gr��M�2,,����7/X�����n���NV�~YJ�gM�v#����i�~��G�O�;vl���������Tj���\�c?�c�����sI�z?j��b``@�4���T�QT���@@�\�>3��q����6������R�F����o+�+#7���[����{���P�����?�Q����'U-�u$]�bcc�vTT���v�����2�M�}[���d�LF���2��Od��?{��ws�������[��8�v�����2nHH��E�����>������R��*u�@��j�� P;@�v�@� ��A��j�� P;@�v�@� ��A��j�N+@yyy=z�=z��5k����AEE�������u��?����BB���EPP��I�Tu��heh���zzzl������(==���R�`�D����l�2__���h���{���)v:884���f�����M�v��=����K�����%������������s�Nj(v6�]���������s�<xp���\���6���'O�����3�������k������b�X��i���&Q��������==�)S�P��m��s�<<<lll���
(,,�D�M}}�B�����B���w�����-[��;;u��q�F�=`���S��������a^^w377���Hi'�lXXX��h������z�cZG��c���7�t���~����nn��---�_�~����R]]]�Z��w��������qqq���J;�kyzz�oR�����.�e����?��s�=k��9s��k��v��aWW�����������������S�qss���Y�jU@@@DDDxx���+mmm;���@shH�A��^�z����������iF�A���/����DA'44���w��%�{�n���sg���G�@K�.��3d�\�x�k;99����
P�	��� �B��j�� P;@�v�@� ��A��j@��V�� ��1�Y����������G��9
�&�j�(QZX�}��v����z7�t��^�������l���a�����b���_>�*m�`��l��hb�]��A
k�W/��^CcFC�9��AP/��7��Vy���~��a.j��D!�n�8C��v����{�_a,����>*z�p�m��i��������C����:�m�r���M���@�2��K�:1�,�{6P P;@�v�@� �W���{�'j�J��,�<C���\����[�w�$5�������������8�}��je(//�G��G�^�f
�<����BB���EPP��I���+P�ZjGC�T�IU�u\���El�X�Z�V���������%�����e�|}}���=<<z������
V:������@����W�7�m/����-Zk
@HHH�6m��{��fTT�H$�����"WWW//��;wr���F�k�s�������s�<xp���l��k������U���5���V���������s=���"��?M���O=�U��u���0�M+��^r;sssM�����l���������.��!�����h�T5�L�Sb���_��u?~����?����\�DR��P#..�~qJ�L��u��{����n����ihh������s���Q�j]�������\@����9�*�ijj�0�N��sW���E'�rni��!����X�n�	4�SLl&5������Nwww�?�z�4���m��De��F��=�Y�l������s�:��;n����KF��`���ts������UUU�,q;;;����������q�������?������5k��������Z�*   """<<|���4 $$����������[[[�k��hH)�1������K�,�X�u����;S����}||(�������b�7�t�m���
4H�@K�.��NNN111r.^�X���������~!h{�Kh�ij8duo�9A=���@@�v�@� ��A��j�� P;@�v�@� ��A����WoQ����s���y6���N��>������s�s����(�j�� �F!2�����mw1���e���> �F�oXr��"���t2P��j�P���br���"f�m3O� 5��b�Z������A��j��#G-Z���dff�p��Y�fQ���AEE7������u��u��y�������I�&���Af^��C���,�>��z�7hZ�#��w������k��Q�bcc���������������---��%�H����-[��������wo;;;�N��� �p��p�=���5��{��O{@
������p����TUU�i�&J?�����n��_���S'�ijj�j���(�H���GmWWW//��;wRC�300P�y����Q�����4�#������[�(++;p�����_y����mm�i���<y���d��9������]������tpp�������MvGZ�]7��Ji����i3O�������}��)S�����[G�(%%�nR��m��s�<<<lll����/,,�D�M}}�B��&��'����K���3��H*5�� n�95���&O�<~��������c����q#�h��S�N


� CC���<�fnn�����N�V��������?na��j����l#++��~@�dgg���~��	��.����it ��K9��lOEE9)c)]�����nLL�fIU#��9%&>`��\g��D$�HO����|#�RF�����u���Qa������sWn;�����M�]����_����jj�#]�z����x���]\\<==80h�����~���cJKKuuu�ku��=88���JCCo��uvvV��_���oR6l��&{s����������W�����6����
ann^$�133������W���r����I;�ff�]i������l����H�C��xt�M�Y���`b3�ald��Ww��DL��%4��e'{������bZ�~�$]*#]�1www}��M4{zS���mh���w�7�_�����D6��={����D�k|��e(j(//o��)�2dHrr25.\x����^{������������o��g
		������������j������������+W���*v�}&z�c��{�V�����K��3{N\��x��ON/��������*�:��A�~��G__����S��0�������z���3g���[[[S�1b
^�|��� 
:������%K(�l���s��4@i'@�v'3��M�'w�$�=�V�u 2C�.�/^��NNN111r�v��h5@(@�v�@� ��A��j�� P;@�v��_�LE�������m��� @��T����a�c6��g�� <�BoD���F����=�����8���8j��/��j�� P;@�v�@� ��A��j�&#��9V�v��0i�|&���'U?�&9rd��EIIIfff.�5ku�?���?!!���"((h��Irk)P�Z�Y���
�.Q��N��\���wuG�����#��u�6Y�:?��M~�����K;�E���tmZG�w��[o��k��Q�F������9;;������{��e�������{�vpp���H$����j^@�<��p65�F������--���<*�FIY���EY�_����:���/��TJ���w��TUU�i�&J?�����n��_����#�����������k�������ZQQQ��Q�Z�����G~�F���7����i
�#������[�(++;p�����_y��?����������_���k��bq�k�P����oqa������{+�{:O�����}��)S�����[G����P$qK�����?^��Z��<�w��������k��<�5���'�?��������a^^�477����?^��Z�
��ndd$��HJ�]v���D�����l#++��$mdgg���~��	��.$�*v��`j.m�dg�=�����tqNN���111�%U�0S������m��s�%����!=��K���xK�����=~��F�E��9%���v����5�9W��yym/-+/g4u�s�]���n\e��@�2wf��
�����Q�@W�^�q����c���]\\<==80i�������*


����_�{����v�������h
6��V��.==#�����3��G�m�K������H�cff�9X~@3����N��455ei�����+�����C9����b��o3�!ie<��&�,NeD0���062f����%�R��N���=cll\�x1--�}�W�TF��c�����u��3����L�M�zVf�,���H���������9K/[
W7���\q_���� �2���b���:b�Ul{��^-M�����$�������L�r���!C�$''Sc���nnn:::�V�
���_�r%
		������t�����������f�`��U�Z�;���
���?������&�!???MM���P�\�d	���[�v���/_�������v��h�����trr������x�b��v��h5@(@�v�@� ��A�#d����k�t�R���+����m[�����i��4!���+R�o��M@-��iQL����3WS��y��x�@=z����ok+���G���� ����;x�����5k�TTT��5��������������
�������[YY�����v�|C�#|:}���[����������d�.]���z>iiiihh=z�o�����UUU�o���@�
9r��+W~������$�V�M��~��}��Y[[<�n�m�v����o���@�������n��;W�M4���k��J��������@C����C�8p !!��w�133KOO��a�����[h !P�����3f\�pACC�������������@C�������t+++�ffff~~��[�7���Y�����bqnnnTT��9s�
@�	�/^��oDFFfggSZ�|9~@��o�g��>og����P� �(���K�E��FiEv��@M�>�b����4�_����o�~�@s���������)xq��>Y[[O�8Q��B>
2���C�3**j���7o�411Y�`��y�������A�����u��_�������			AAA�&MR�	 ��w�VE�f����o����(,,,88������������zzz�Y������t�e,g������tKKK�kI$oo�e�����FGGS&�������b���CC��TEeY�$��gJ�6o����%l������WS��������cBB��/�H7MMMU�%������������s�Nj(v
;aP�&>�q�m�Z�F
#7���6��;���A�>3������?yyy��������To�����Og�����~�
������=m���'O�����3�������k��?����/�;>CPO�����.����):'m������N��>3�7��@5����Wg��q��9}}���"J*�6m���� ����;z�����.]����L�2���m�hs666c����DO�@4�B�N�&����6��%�v�]�~=Qadqq1����b:I���aa��}��;�����p��>l
b����Qq�.�1V���O�^*2n���&�������kj.m�dW�"���r�R�R��^u(��YR�3hN���F~����DR"��6�'yvi~�o)�c��R�������h�9���S�nyy��&;���;7/����e������9:tH���_Yz6P����{C�rn���p����������������u����#G�4�rll��	�w�:u��q�Fv���N��@���yyOv7=lFFFJ;�[�������e8f�M�����y$m8��G�m�K������H�cff�9X~<74�&2�S���gN�1&W�LMLW���O/�gN��'K;��	���9�*�)�(Y�)63c�J{����P�-e��X,V,���be<��&�,NeD0���062f��;Et	��^A�$/;�3���U����J�z��t������u��(������,�9kkk3��2cd��NM��$���-Q=g-~e����|e��Ave��
����&����{��@�x������y�~�����={����������C��=���iii���co�������W���{pppUU����������v6|z���
�����~��t�������Z�ttt�v����y��\.������'�_��K?�����������]]]����o��g��		��������F�Y�jU@@@DDDxx���+mmm;8=��xW7�rgD*G�1���,k\_��4�s���<7x��(00���y����������O��>�������xyyq=�f�����W�^=s����tkkk�4#F��E��/����DA'44���w��%�{�n��~Ii'@�x��6M��:SU����Q���?`���G�fdd����[��rFk�7��J��,g��u^�x�k;99����
P�	�C�$�H�m��`�==�������m�!��>����s��ed?�u��y�A�o�~�@w��a�X,��}{��
@�	���������c�o;�q�� ���1���[,m�vf������g |


rvv8p���iff��3g~��7���������F ��E���[o
4��)0KKKJ?666�o���@���)S233����>@C������~CC�����s�N�0a��!�o�~���G��e��=z���S���������o�~�@���}�w���9??_�����HWW7>>�}��$$$�����z>}��C�8p��������9��?�
  ������k��9�����]��k����o���@����n��6mZQQ��5k�l�2k�,CCC�7P?� ����������w���k��������o��U\\��_%''���t��E�����HKKKCC����}��555������|+�&|4h���#�\���?����@'''���Z�g����W�=����M�u: %d�p�B�>}��_�o�>kk���Sg��m��g����Qn������	c��Z!���S���uuu���u��;Wn��[�!��7:w�\��{��	��"�Dr4�K�]UU�����2]�zU�j�E��t����v�}�N�B���kW�4�
��k5(**j���7o�411Y�`��y���������			AAA�&M�[K��Z���[�@������k��y���/]�4d�gg�~��y{{/[����7::����w���Z�Dq���]�k�sO�t���+V����4�lH������WS��������cBBBaa�H$����NWWW//��;wrkEEE)�F�k�sO�4w�\
@�Q455��iii9}�t����J�g��aaaa�n�����/�v����X\�Z��>Y[[O�8Q����w��=:((�K�.�;@�"}}}��V:�����'|2d��C�<<<�;a����@�� CC���<ninn�������&����H�-����,++��B���������0��2���������Y<���\R�bgNN��Z���=�8�99�Q{v���.\*2x�r�H�U����\����f{**��KK�b�s����,�j��4���l#��w����t�
�I�]��o�[��<����K�FE�^RR�)n���\[��s��M��6�����3�:��LWs�*~e��@�2wf��
����ON�\�f$|�l``�
�9{����������C��=��w�
UUUihh����8ggg�*J��������6l��&{SOO�<�6���z�D
c�'�+�HT���K�d=F�����V���E�8���O�����L
S�U����'��������S�_@��W���r����#���1w�=ZZtr(���J����be<��&�,NeD0���062f��;Et	��>�3��>]�/��e�? �@0��>F�}���L:�\������6S=+3F�m��$a�O:���s�����2�W��+��W��dWF��P�ljj�X��(���H��y�f---akM�8q���\�!nnn:::�V�
���_�r%�������S�Q:���V�Z�>�@NNN�o^^^fff�v��>`������xyyq=�f�����CCC}}}�,YB�f����_"[�|��� 
:J(��!|�z���3��;���_TT4l��M�650d�7��J��(l����u^�x��J;@}����|||���Ch��u�����#G�@��222(��m}}�y�����O�o���@:::����_��y������[�7�P``����������333O�>�q�F��Po�����0����nnn������|+�Qb��[��:�����b�	z�f�(
�c�����^cTn��K�I���L���������@]�v���8p�����D7�B�;v���~��7:t�����@�"d���?��l����x����G�F��={��h!��M�-Z���!�����2ww|�Z!��3�O����o�[������1Q�7����?���"��d���� a7Po��|jj*����oWVV2����� @�!|�2e������3?���
6���
��zk�w�"##��j�*
C'N<~��������vrrr�����������m���&�V�M��d�GG�������2�S�Nfff�o���@��O���222����z�����5q�D��Po���
ww���jkjjN�<Y���(:ilEe!5��������=�?����V���w��9~�x
@�h^E�U�Q������4�����������9S,khh���4���
6���p���>���W��M#��V��H��s��U���=���|&�������^����"W�f�wg�xT�E
7��]�NZ�����\OEE���7���zj�������iNmtd��21g��T�r.���+mX�a^��sl:�&>�q�mo���������_���{�K�Q�]/ ������k�.Pc�Y����W�n��X��+���]��m����D��������)�8��M�6q����={����K�oj�0�xw�u����\�(_���3�=���3�QF5t�~��/=e<'��Y����n�����Ur�)��6J�4���a�Jn���F�fys�Z�����7G�1r���s�6����k?����������������p���n���W9����BB���EPP��I�Tu�����yw�Q���bF��g�������J��gsO���HNNNNrrr����5+??��fRYYYQQQzz�����U$�����e�|}}���=<<z��mgg�����<��eJ��-kFK��t����
��q7����e����s�f�
��������w����7��������<|�p�'77��555U�JTT�H$�������������;�����B��u;���2��]#�W7t5Ezv�bf���v��������<�G��6V�uvLcHKK��������e)������hkkO�6����&&&s���KZ��]stt�nR2�������
�^�`|�I�����p���l_����+?�J���>�~QU�N���������T����u[��[�mY-��=d���m�������K�V���,4�F�P�����2e
�m���;w�������1c����"������_(���/&����H�-����,++��B���������0��2������l�����8'�a]�W�������z�*�b��D��Y���R���l#��l�����v�Q����%=y��AZl-m���=YZV�=����H��������Oz��.#�q�.\*2���QZ��U�a�K����BB�bgnn���������TT���2���J��Y"���	���>�����q����+�4�ja\LA�����l�r�w%b����U���������v�����z�SP����L~���b#s���d�)I��F��������|�q�������"=��K���xK��O����YiTX<��{f))��[^^������(�S�K���MUs>t��F��2���\e������ss�����H���kW�������N�:m���m0`�������dhh�����fdd���_��������a��m�?���'b�?%�����%�.?�\Q�*c���l1�/������������S[�i|������aJ�e�2�a�f��������sp�N�>�{�n���mM��?E�l"�?�ms{C,3L25LML���:������b���������\�>}:�=�*s�V�p�e��q�O���p�\��nJ;�ff�]i����������9���X��W��zrb�3(�����qE���+��<�������{��=Z�O�uuu57R��
j�TF+�qN��:��i����"{F��z\�&�]*���d:�Z�|���lld��3��Le�I��]��tZ�x1WYv�`��}���]_�q�������,�9������#�6tj�0�'mm��9{xx�h��+K���+K��+#o(V655Q��H��P$d��g�{������w�y��h���6lpssp+*�����_?�fii���.@����������_K������1��*>9s��cl�@���U�(��U�k/�j��u��K���U�H��e�H��^8��2�^l�Y@�S��'�������jT���:���]�>���&��B���{��3f��p���0(����c���n�u����^{�����21::z���l		�����C�KGGg��U���+W����U�|nP��$��Mf�:W~���r��L�yi����7�����B;�E��Y��Z�;��I�	(�P�iun��k7�e�o��Q\
�=��������neU�s����o��OEE���M���GFF.\����w����3is����iF�Ac�/_���C��Nhh(�\�d	���[�v���(�����G�U����Dmt��:�W����&��F��."���
K���~��[�E:Z�M19hn��Y�f9::������������9s�4������b�2r�/^��NNN111r�vB��t������?�\R^)�����l�V���,���F�Wl���l 5!|Z�x�o����Mh���8�
_eEY~�Jj���>�7A;�4Fe��k�?��� ��������mdh��@�s�=H:�r��l����mD�m��QO�q�)���zjV\�����T�vsou�[��v�a���.o��1|ti����5d:=��Y@x@P������*�z�{��7DPc�y�k+�{�O�@�������m�h���/v�Fht@�v�@� ��A��j��Te1�w�
-cp
�Y!4��O�)���|���OS���Z���PO@�v�@� 0L�=�wPu��=Lw�f�K����w��������#�N3������8+���TU2�������	��M�t0�7j����}���Nw������:/��
����w��s�]�?QXz.����{�a�'~�����[��Bi��%3����
�B�u5������,���������
��R���j����2�rj7��D� @rn3����p������}�m�WV1���^^V�_PL
MMMC���'�@}D�a��%����
X������7�6��sZP7@
��U�[t�m�W>j��@!��A������k?����������������			AAA�&M�[E��Z���[�	@�f���������D����l�2__���h���{;88�<�������S��;���Q�T����W�����k���A����v����Z"j�-����N
C�^���6:�55t�j�����w�}���y���\OTT�H$�������������;k@���PO�bo�8��~+�_�W���|��h��o����'�������������]%m���~d���V�w�:J�:���Z�V�(���\�v��������_��X\�Z�D�&3��5�e�u�o����E���h�V��DOC}}}��u@�k�s� CC���<�fnn���Q�j]+,,LnC���\[")awYVV��������--))a/e:I����l�����8'�a]�W�����t�g�mn�r��4g���\^^�������+��9�\��V^V�7�sr����q�a�������rNN�����/\�p��X�2GieW��).�*7�	���t7M�����l���������.V:�����*~����e+gge+�.[9��n��uO�>�!Q2[��e�
���� ��!+�!�S��R���as�����_�T�L/����2��4�R�{G�$1�A]�\TT(�-e���s���l�9��[")�0�Y��LK����'����5*,���K+��f�[Z���'%���v��������(�S���2�iMG��:�Qe��,wJd+sg��P�������UnF�8u��=88���JCC��]��>&S:���<==�7)
6��v����'bd�������I�06~r��DeL��������I*�
�n�����L���=�����SZ,��Y
s637/T����vy����gO���9gS�'j@[G[�#3�������5�Y�l"�?E��X,f���U���O�|e�����l�<�r�����N����Mi�����+�����C9��X�P:g+�����ZON,\e3z(���U6���hi?Y�����`H=�c��V��DH��z"���/;@�3��_[&�#;L���M���x�����aN?��l``�T>�_e:5��iNeD0����Y_��[��RI�Ss��o�9K�[}�������>3�K3������9=9������v�W�.MWY������X��L:�\���3����Y��+��$L�I@G[[�z�:Z&���#��|e��A�,��
����&����{�Zqrss���Y�jU@@@DDDxx���+�?$$����������J���:PEE�����,22r�������W�

���%K(�l���s��4f���>>>�(�(���G�@ZZZ���9NNN111r�/^�y��NP�#�� P;@�v�@� ��A��j�� P;@�v�@� ��A��j�� P;@��K9|3�_j��t��xa�#@�X����37��~��O�V�.��h���/'�u�N�.�����Vo����F?�BQ)5
�/��b�~�h7��<�ro�h/�d��w��@^Fn�����(1*bn\��-�f*I���������N�m�BMI��qz��3'�Sc���z=���Fz�H.������X3���=ht����9��vO��rK/������l{���a������~y:�m���\\�*m�vBz><*.�Fl���iuo�
�<��%����_�}��g�Z�%��m���;G#�����n��H�@����/w���?�������			AAA�&MR��=�O���mO���P���4�����7�m��e�M����'o���Q/��h�R��������;��=�.}�9OC���F�����<�m�����Np��U���_�3��Fq_nd�Y���x��}]s�����'@+��PYYYQQQzz������D"���^�l���ott���G������;�x�5�,f�����-L=��������\n���s"�m�5���B:U�!���A��(l�-v'���
[�*j�tp�/1��Fj����C��U������io�M����\����T����(�H���GmWWW//��;wRC�300��&����iC?��m��������
dc��2{n����
R���e�����qA+���+s=5k��p����&�������������e�<����8�X���SP����mm�i���<y���d��9������]stt�n:88�����b�����jEyLA��UYQ�P��x;>���+���]���N3������:/h�Zq����2e
�m���;w������f��1����B�H�����/�Q���
��Pdd$��HJ�]���en!m���sKKJJ��K�N�F�D�![����7�I�r�^��������w�P�ryy�N*gSe��4�������S��%=YZ������*�o���\��s���T��a���Z�?g�2h�u=+_�p�R��\e����2
S\�U������������T:UK��U�uM���\QQ^��111�%U���O��V���i���v���{��i
���
(..�mH��il,{�ee=d{J�^��2�������������lc�����D�Q�R�;Z'���2���Bo)����3����9���1�p3.�]\�����^�0����tI��Dj�7��,�]�{�l��5RB<j=5_����.�N_�Q��?g�vK$%"�?+��i)#��-�/xr ?~\���_��T�2=jF�X�����S�.���5�9Wetjj�xi�����j����2�W�;%���3o(V��}rJ�*��{���5���.���E\�V�:u��q�F�=`���S��������a�
D;���Hi'����'�&��a��1�n�7��D��w���Y;����R��U��.e/�F��zz�w����n�4>��sK��Y�+������|emm�����f���
�����+���q6���R�9k�h��eq���W*V�y��&&J*��Eu���3WY,3Lr�*�����X�2GieWY6LW9_�
s8UUe��sW~]�jq}+��f*������R�����x4�����W���*�lF����~��������-
(��_&Bzf���E�O������hs��L���m�WM���l:����K����s��\e��a�*���X�S�{/�TF�Y��������-�T=5g�x�9��xtB�KE���2��];�d*��OL�KV�j�v)T�B�XOTVY{en�����Y:%����&#�D��,R�ll����������_Y�4]eez��/�c��s0�0s9Kn�t�b�ge�>�tj�0�'mm��9{xx�h��+K������g����7+���(V�����vRZ��9sg$~e�"^���PzzzZZZ�~��%���TWW�?�{�����UUU�qqq���J;�~���Zq�}��k��v��az��}��={���$$$�������������U�"""���W�\ikk����w�T+@�
Z�z���3������)��1���/_���C��Nhh�����%K(�l���s��4@i'��V�����/rm''����J;Z���w�
��F[�{[��^#FS�{�K�e���*��H*`�u�V�#��@e���|�w�4tr�5��j�o��)-P�@�f�����A�7m����mu��>���+�����U�0�%���n���k���*��n9�k	5��t5����9X-k�{�" �~��<�$��4�TZ P;@�v�@� ��A��j�� P;@�v�@� ��A��j�� h�$eE�2jh2U&U��^�LF���_�a\�aJ


M}]#vaAS^)md�e�RC[[�s��RmM#

���N��m8ti����h^u&����U�&��Q����jX�X�?x�.�����iH�����m	��]m��������C��n@K�j�� P;�;�?���?!!���"((h��IuP�Z�|k�H"�x{{/[����7::����w��5����y-��)�NBzf5�,m��Ns�!Z��f�W���PTT�H$�������������;k@���hj��0����sy�7�s�aa�~��T�Q��Z�;�Wj�:��������S�u;6�d��8]�v��������_��X\�Z�������oRc���������f0���3�M:K
�����a���T��E�<���P�8�DO�������Z���"�O&d��������-�v�E������.m��_Y }z�k��Z�S���`���Lu5��������Z{#%�M�1m��W��M������W6�R�lg���Q�������s��W))�W.�}�Hu������pL�Ar���LG��+�����Q;�t@�*��+Vf*�W7�U��D�mp�K4��<�����mp��wj[Ce[�������+����l`�
�W���6���.�
t_��l�U���W�l`<F���9W�6�U����fY�.m���m�����l�S�HW6l��y�_Y$�3���C�6�e]���ll������*��o2F�����z
��RYy�����Ff�nI�*�jY�U~A��)�Se�iY�H�_���~7�Gr����XUUU��
��R*W9����A���5�����J_���Yy��V���9?U����.�{e��F�,G�Ku���*�lS��WY�8�P��b����#:���������V��T��wue����t���������N�Rv���a#VY��~v����s1���b[c�O��N��J-�s������K��$_������Eno(V�dg���e��^�v�0RU��9?tm���\��k����0//�����kddT��Z�
��P���!����������'c�xd�SuC���\Ld�]l\�F����I��[QR9I�_=+?T�|�q��T9�*C�=]9�BM�k��s�+�2g�����W��7��WNc��=U9�y�������vXi�������0��|�!��	�X����r<�����{�VI�[���
��^Ue�zT~|���r,�����u�|=��+�q��+k>�+G�_���n�+��O*�l�l�E�V
��k���|�������W�dQQ���*k�)���`
�%J*�^Y���%��������P������)�khh����8gg�Z�����'�&�!���2*�2*�2*�r#U�uL+@nnn:::�V�
���_�r%�������S�Q:���V�Z�>Zq�����d��5[�n���3�/_�������J;@}��D���bbb�:/^�X����>Zw��Z4���P�Q�Q�Q�+#��A��j��`��]���X6**j���7o�411Y�`��y���|���E�%%%����&f��%TeV^^^�=F��f��jTTTp7/_���[7A*�l���:���K������)2y�d�fyy9_�zu�+;v��G�ijj��;�&������z>��}���b����F�jxM������4����JPP��I���������:+u0���
?+u0*V�`��,���8g��G����J��������J+{ADH���/����esss===�����o_�ti��!������
�|�����zk��]t8������Q����7�2g���zzz,+++**JOO����,���O__����T��7�|��7���j_�6T����m����������-((��aaa��
KMM���'�v��A
��������~��q����������s���uCj*����l�2__���h���{;884�����W�`T�,��X�o���XY��Q��9+u0*V�xT�,�������_�������J+w��]�"�0�}�]z$�.lY:J�
{�����Hi]�TUU�i�&���j������@��N�6�N�B��C��555� �������iii"��S�N��H�M������XAbJrr2=7�lK�:������R���������-�������w���;�xt��8��t��6=����v������:^Y��Q��P��;���Q��P�be����
9+u<*V�xT��-,,l�1���h�1��r��]�� "	C�/�
�^]M�>�m�z��c��lmm�E'#{%G�Gz���+�R������;�����w��&[V[[���'O�411�3g�P����	�_~�e��-ZZZ��������{�.�W�\��a�U �^zEH���D777A*�������i``p����T<:�]�F'/�&���� �Uu6��P�be�F�w\��Q��P�be���
<+u<*V�xT��
k�1���h�1����D�������Gu��E����o�2e�����u��,,TY:~��tR� KOO�fK��m���;w����N�c��ixe:���s�����(�6�����R�^5�2��o��WE�T���]�~�o������_���e1=������'=z�.o>18��O����>���F��������r<������tP��,���Z����	&r�W(�'O��,���/�K7�����{���lN��^JN�N�6n���0u����PA��t��s��r���'M����x�-**����._�,T�[�n�$:���J���^{�N��|���
!!!����G���ixY9���yyy����\###���p0�p0����Q��+�1�x���n��;{�,�����C,{���7n�IV[[�����������sw��q��M6��V^^N7�?������iii���co�������%�����^0���utt����O_�������~���N�G���K����/^����������L�YCC�n���5�������������G���P�`#�*�9��^�L�8q����?��l8e�z�2d����dj�+A*�9�k���t����o��Mg�����&::z���{���r���,�x�����III�v��E��S����+`A:^�v�.�t������9s� �

�8=�t6��^�=Z��|nnntU[�jU@@@DD]?V�\)�V����#_?�>u9��PZY��!	����}�RVVI'/___A~����SRR�o���5����ox�A�����4��������q����L{��,�������#FU�*��m����%K��9R����k+++������0a�c�o����9s�ldd��g�M�4)''������m��iHAUGGhh(5hW�+��[�v��Y��to������a�~0��
?�,��r�FU�~0��7x0�����QU�����#
?�V���o�TTZy����^������z	a�7����1*�2�T��t�Ra6����oO���2���������e����::���bbb�r�FU�~0����'v�g�z�M?���5����*7�xTU������H��AU�~��,��� P;@�v�@� ��A��j�� P;@�v�@� ��A��j�� P;@�v�@� ��A���������\����P�+�Sn��
���~ee��L=������������>p���R�WSS��}��w6o�\K��R&���~m]�������lggWVV�����pK����2L����"���W��m�h6�lZ���;������r�>��7o�|��[��@x���&���OS�?���!=��+3n�8�E���lc��)���?��c]���d|\������v����C�����z��yX��P�2��(����1�"��(�j�[����=X�S_�h�����9n��8q������/�S@���#55�[�n������[�����o���������.����������7o^s��)4m��5]<�_�a5/���a���� ===//����i��M�>��u=DGG/X� ;;[$-Z�h������[�z����utt6n����__�p����/���7�|B{c���+W��s�N�=V�XA;!..���������g��HJJ��9�V��#�@������������I�t����4:�������;v�����^���������;G����F�b�����'����w�����)]JW#���:u���y���ty�9sf������=z4]��|����o����W�^���{����������x������e����������y��Q��=��P����j-o��Q���	hQ�wN]��J�����J�J�cc��&��i�������Q��]SRR��niiI��:��o����2Kn���.���>x������u��q����~7�v��q333�pR�������������o����DEE�������?e���3CCCz�#""������,�0
�3��}B����|��B�$]]]�[�n)n�.�R�15L��
@�@��dll�6455+**�e�����m������4�:�����-�hnn�����s�����	P����yII	��-kk�1c��]�v��M����511a����p�M���g��yK��T������	uy�*�Q5U��� VVV�������ta���o]�~�����^�6����)���n�/{������/�'�O=����,X���?���322:v�H
�z�����F�=�4��Q5U��� ���t�?t����]�������/���������v������?�5��3h��+2/����
����B���W_���=x�����^XX8����g���c����|����c{���g����~�m�����������{�P+�3J���O���@�B���7/�(�l���yE�X��G��7O[[��/�:t(����������������������MZ�
����~�_�i<]�v
�hff6~���={���B���6=���sM
�,�;wnee%������;v�4i
X�nu2�occC���'L��������$�D`]�*�-"m�������$�]Q9���@sA��������������n�<y�m����;wN�Z"��������X���[��i��.�/������3;mU�g;�8L�Rz�M)�m���$�l��Q�O��W���9s�����
�����dF�]on��ni-�s�.��g�:����8X��W��P�T�'@-KQQQ���������w������'��Zc�i�3��e�����a���������o��\�<@�Bhq�e�{M��y
�a�46 P;@�v�@� ��A�%��)z���o�� ��b��80  ������������Y�f��BN�GR���S����t1Q�V�O;99������L[[���-MKK�a�3I��t��b�c���U���f�KM�n�n�NM
k���VQ�=S�S�p���_|Q��(@����������������:���_�������������J
�zl"���S��f,�0��@5k�i�8q��VVV��:����kF������o���b���8����`/	��9�$OP���2���[����=��F�?E��6h67n����tuuG����ott�����E"��E�&O���o�������W�\���/###.\���������?o�����=z�X��^1<x��W^Y�r���;o����'�SgJJJpp���[��W�ZE�sW���T��5]<�u���/�l�����{}���������EKq���^R��u���^�����:::4�������w��}����������W������s��C\\���-��gh2�i�;G�S��
�U=Ki�������6��@��A�S:K�>}�_�~���?��u����=���o������iQ�^����������zzz��������t�HKK���K2EEE�=���JOO/))���������������g��%K�4<��i���*P�c��������]��&�t�Gq�4��f/)�������{�������,^�x���tY�+�D"�-�&h�={�*������9�3&L�Eu�9uy�*����*�jC��@�<�-���?�@'wj?~����Np������������8`iiI�j�o���
t���ts��)���^=�������r���l���w����|���Xt���500�uK�C��S���FFF]�v�W��H������������M���o...QQQ~~~��?�p�������&C1���Mn�3����n�������<E��=K���e/<+ h�z��7>��mK�>x� 55�s��l'�7n-z]haa�_���m����4�K�Y������;��d�A������tz���lCSS���+7���?����Tm���z��1k����i&����������������=�N��OQ�n�R�1�?K��y�����l�&���_zA���/����Z����.����L:S����:��V:���:�g�����MS��}�|||,X��p�;vddy��(
����3
�FC�
Po@�<�r�����:�>|��:_}�U__�������������={v�>}�������{��!z��_a�
T���UK�KJ7��G��S�~��7c�������={�w~���+V�d�����Q�9��g��jC��@ <�WY+����K�:w���?��USSs��1ta���011��;���;wnee��������@/�CCC?���y��ikk��C�e_F7���h���D����>m��c���:��]z�xY�G�m�|����%�����O;v�8i�$�n�:��y��mllh@vv��	���322��Q[����Z���������&��L�R��@���bA]�����8p��3g�:�_��������;�_jee��81���{�%%%5L���[/�e�-k��`~r��I��v�:L����>���uX��KJ7���
�����d�������_�j��yW�c��k�0u�9����,��)�t�
�������=� P;@�����<�@� �����U���SIEND�B`�
bench-dbt3-10gb-pct.pngimage/png; name=bench-dbt3-10gb-pct.pngDownload
bench-dbt3-50gb-duration.pngimage/png; name=bench-dbt3-50gb-duration.pngDownload
�PNG


IHDR��8�r	pHYs���o�dq�IDATx���X����#�R,�(�,��D�AL��0��K��!����Dc�=!(k@4J��bE��{{w��{��"��������fgg��|�p�VVV2�D�����@� ��A��
( P8@�p�@� ��A��
( P8@�p�@� ��A��
������n���������{��9m�����+))I�!���T���C7g���s���������,++����w��ohh8p��U�Vu��Y����333
�p�����W��{W__�����o�a�Y����|�rZZ���^��i�444��]�2d�����u�jh����u�G�����G�n�U�����H�i���x���|��9*���&&&=zt��I;~��7MMM�6hRRR�o�>{�l�1��������fN�<y�����8w�\�a�������e�����[��������������?�V����O���8,X���?S'}�Q\\�����6���+W�������K��k���u���O?��������ZZZ�n������_�x��U��m�h�����]����kff��CP@<PRRz��7��3g�<|�0e��n��Aj�1c���������	��TC-���kX]AA����JY���>ck

G�q��OOO���,--EW���3r�H.���>�R���C���)����Q6�^��6m��]�v�]�n���SZ�E�|��6�!P6USSkVk����EoRm�����q�N�<�e�����m���l���JWG##�zt������"Z������"�8;;���D�>)))&&f���\
�]]�?���
k��������Wff&5�nl�n�?h� �$Q��>����G�VTT2���80a���m�R(��d[FGG�����b�"���~�����40������S�����Q����7n�Hmv�����+:�w�y���3��5f����]5Fl�3f����_�d	�CN�B���o�a#)�b�0
x��E�o��J�����[�>y�D[[�����+6%�����������/��o�j�����W7� @C��m����(*�5eee���"����yyy.�e%%%���l������a�$����}�K�����g�N���lw�����{����/_~��������L?��]�N��`!�.__�c��Q��m�p���Y��R]]���XAAA��/_�r��I��?>g�J37o�T�����@+���3�=��7��.�o�>�d�7R�����u|���H5��aaa�w�vtt�����Oy�:�JJ-���g����#����K���;
Fiii,<x��;w���(_����9���k�Z����O�Nq�k]F, ��bmmM?����,//}C���������G�U,Y��.������~�I�.���������t���{�������������^���fff&]qKKK���D�b������_k�(]=y�D�|4�#G�P|a?E�G����KPb���V�^=v��e���MJ3:)����o�������Oi��W�F�mii�u�V6R
��!�
v0V�&M
f��U5��%�FF������������*�R�@�7j��uk�N


~����S�����F�������&v������!j�N;uH�|��m���@
�����7���S���l������/]�$��dIeeeyyylYYYYOO�����#F��T����������4��5	�$����/��4���_�������R�UYYIi���������!W������Z����m��K�.�w�V�����p5�
�>#"bbbrssE_���E�p��6H����{(mP\��Hc�M8v����3gV7�^�zq5�u0,�52����v��y����"##C�q����Rrss�j:w�L9�����M'''.t�{OOO������P����g�����{sez�nffF�c�Ns��Hu��E�#�m��y��%w����!CF�emmM1h��b�S��9x������_�~�����]�����];�����q"""���;�9"zW�������}�;''���1K�\0#|�i���\eII	7Kb�F�={vPP����g���o����GK}�Hr0��^W�5VTT�C����
6�,ihh�J?����l���i0��H�V����]	P ���{�n}}}��~��������j@����l��@]�O�>M��������bnn�����:*
7�TRR���=#Li������>|HEIIi��'N��+.�B�!���5����*((�����g���������s5���\Y�]*��-�����9r�h�{"4K�����]�(�P��`���j��{��EGGo��m��1lMQQQu�9R_�����H����/��r���U�V��"��-h.�T�R���/�����O_�b�_|���x��2M��m��}���'�|����}@$111!!�����P�>}>��~%��{yyQ��O?=z��|��~U��N�����_�y��mWDDe��>�B�LYY���k�/4�9s�������C��]uuui��<��{�n
�:g����z�������g��9{�l������fll��,--e�����Wnh�(��t��1���h���!�'�@�2��.RQQ����_�5,,l��q���d���w���������������:kk�������RQQ4hPJJ��_~������+��]�v>�<y2�K�V�\���=o�<F��{#F��;w.��p����G���������������={z{{�����~������tW=����������XFFF�~���.]���������~���M�����?O����������h�lllF�I�l��M6l�����$uE�vtt�m�I���b��5�e0�hq===������|�r�^�`tt���)�������He�S�,
�}�=d�jOOO��,X`aa��!�(�p�i��5E��{�R���
E++�E��u�~���u�V��R�����A���w����� ��.��O������/���x��Q�t/e�������y3u2i���� nY??�>}�P�			IJJ����c�������t1��vQ����c������PE1e�������(�P�suu�����/����_�_�t����O?�DI�U�V4����.��(����q0�����;wR�)--�y0b(�Q<�	������d�������ys���EEE4�����.�o�����K�O�Ra��!��������d�EH�6��B�6�8��P�-����I��K��e{���m��:��v�������������n�������D��y4GH�C��<�P�9x���)Sj���������H��!������+�~D]t~(�.���*����	h�z@E���������(��r�P�@Q9rd��yvvv'N����8( h�����}s�W��@~!��A��
( P8@�p�@� ��A��
( P8@�p�@� ��A��
�JJJ�;vlS������jOBB���mFF���n��	��������-GDDD�.]���o�+W��������m���OKK[�x����sssV�X��;���xNN�G}����������������[]}�:u�_�~b�����~�������;w��d����{���������'N�x����������	-Z����68p�_���utt:t�0}��O>�Dr��-�������7n�h���KKK����


�?w��[o�%�����>#4t���l,��mmm����3g�6mRx{{���FGG��&**JYY�F���WTT����w����/))1775j��_~���M�>|��/��f���~��e^^^��
4H�__��7��/������=y�~�(�N>��C���N���:@��-�o��222��DW}�.�\I��HQTTt��Q��~���w������'�.�����P�6m��Y��.�����KKu�u�����
&VIQ�r]V���k�.�,]�z�g��TC-�V-]��k�������V�:���A�1vqj����S�.TTO����x��Y�k�Z���L���?><<|���\�={���H�o�N�?��MMM7o�,������U��=t���L���������

It1����6
14��@+W�\�~�/��������z��5??�'O�P(--��n�Q�Y��a���co��M�C���!++k���l��q_��Q����
����_}���}����O��$���4+@�rpo�Q������K>��������%K����������F���$�xRR����A�?����?;v�.������hn���J�S�n���������.6PD+���)��x�������3�Z{��M
@����-�+.a�������BRzzz����J�����]���%uD[R��o����:p��������)S�%m�����E<==�B������.����I�\���e����/�`�r�-$��VA3keeE7)����?���$ijjn����������H=�t�>{���'6n�O3�`���������$]�i&�����!���#�q�{�.=��/��?���2�.J��~�- �p�{��e�h�F��e_b���I��}���<yr�=h�h�kY��%� ����=�>u�]RRR����S�(z�{��!����/KJJ��Z�����.!���g�+++�����������z���g�}F��/\� �\�����F�J�=C���y3%*S�i����a�(g�;w�.<b����n6����>}���U�	�TQZZ���a�����444hC��9CWq��N�:Qt���1P��D��#G�H�,ucSSS��S�����
�!� B����9s�Pv����+==5�F�9
4G��,KKQ2��C���{����f��i����s�����M���C�v���f�"2����(�|���l%���k��m�������T�e_��k=j5�������Gp��ub���a#��B��&77����������~���7�|��������-B�'M����1x�`��I]����������R����'��s7�rH��/^�hff&�j�$���[***b����1b���)��jJ7��H
�;_5�5���~��������kP\\�s�N��<x��\�~������%�)CP����x|||BBB�t�����2����n,�3��f������]�v��m:t�?��#����i�w����P
�&g����~��5�(�c=x��������������%����K����}��u����8z�hzPD�P���prr:�������(u�h��%��������!��������- hi���^�|�����K���6h� �S���,����w�}�m��2jX��
bO�����TW���Pa���t����S��UR�9r$]��������92~��s����y��\Kgg���X�L�X�H��Q�F}���T(**�?]z�JOaNr{���^���G�Lj�MTRRRhh(�Re
4c�T�&O�L��p����-[f��!��j�X�u�O?�t��!T>v���������ft1��===)���7Oj�b�9���.��E������������(W�=[�n��G��YzLi�i�AAA\���/'''S��eoo���<y���{s���Z�c_%��V��~R��U�2u�\@�NYY��C��?�g���`�'�t�����g�^�r��S9����������6�2t�k�������z�L���/]���w���TiNN��+Wv��-VO���W�=z�}q�B��S��t��M���DQ�a����r���O���h�}����(�Jll�\��������K����������P��_~������8q��M�)�P����6����"F��M�d��h��>}���O�kU���YF�y���/m�p�U�V���c����&M�^��,DA�W�^�6n���SK
��P�>S��$J�G����:t���;d(��qxrZ����t�a�������;c�������Gt=���O?�D��Zwqq��	=���7��T��`u�lo?��%�>}�P@}��u��9�����H�zz���:Gl}}}������mFFF���������,�D��uB��.�C��P�n���>�h���\�-B������9d�'''WW��6�����4.�=x�@�Kqqq�#����e��-X���P����b��4��
��'O(5J�M�>��������1�~�����iii���]���g��������'On�������$��GM*���;w�T;d�><��-
]��;���D��o���.Q���b�����N����=p����D�RGG����"=e�???z6��u�+V��d���t)�Z�v������I��w������Wt�O����
Lm�����O��]K�������.�t��u���M�����v��u��U�o�)((`7��R/^��{�Z?7C�R�>��W�^�������RRR(m��u2o�<��_�U45��;v����_K��P�K�������t��Y����������|��i�f�b�e��E	�������JKK���G�/��1�������>z�(=j��'�!_Q���l,�m���'�������/(0Q��SRRB�m�����%����l��
Y����S�G���*����?O+��e?$.��a�i�� hi��;��g�����.�tU�p�������������F��d������I<]�=<<��A��3g���UW�qpp���������u��)�Y�Fr(��:u���?�����F���Y���������y���a���WVV��������@.��#F�R�V��-���5O�<����GDD���O�Qb����{?��������g�����5J�nc�o�QP�3gNff&� �v������OF��

��6?�$��Eb��M�2<<���;w.\���Mr���i���F��h���4R\�i��L�������w���%K�2�������?�������?s��/IU�G��U���iO�M�����7<��	Z�=#
'N�������E�cU��t��(T�z�O+�k���������&�.==�UB�-{�������%]��]�������.u����?�nJ�m
K�l�Pu
�	q7?�l&��X^^��]��9Bl�.�{����G��������&u��qCCC��EIHr6^w_%��&:Ku�U�><y�
( P8@�p�@� ��A��
( P8@�p�@� ��A��
�<�����]��9r���t����~~~qqq&&&AAA'N��RT����D���444�rqq�������}||������������%+�������0r��?7m��/^����(MMM___*���zzz<x�
�����\'�[
Z�@������;q��������w�:88p
���ccc


%+E���R���G�;w��~hgg�����kjjr7�����$+E���R���A�����={�k�.�J���l�fVV�����J��
�k[�A)))�9��fr�8���F��`eeets��%��������T������(Y)����.���!z���X
4u|�B>W���/7n�XZZ����v�������������KKK�JZ*44��������[����J�TY���|||�.]J	f��=VVVT/�r������^k)h��,-[��+;99]�rE����[�n�c)h��,�( P8@�p�@� ��A��
( P8@�p�@� ��A��
( P8@�p�@� ��A��
( P8@
��������-O?��i���#�>}z���O�<122Z�h���?Ujkk���smn����s�������������M�8Q�+�
j]
�e�}����_M=��'���c��9t���#�]����������TPP���ljj��,..���Z�|���Ott���������}�
���k^
Z9@���;v���C���{w�����{:t���-���455}}}�������y�������P�������dii9f�*���?~<))��7����TUU�6m������������w��]nA{{���X���6044�y)ha� ����?e�##���7S$JHH������w��Uwww���|MMMn---��Dj�Z�
�d
�\H�y�++��Ln��I���w��
�I7G��}�v���}�N�:5,,���9;;�[$++KWWW��R+E�����I��X
����S�����[�����N��;w���O�GUU�O�>�h?~�������z�b�������;::WVV*))QeLL����hWR���0r�����L�r�������Sa��E�?~���O�:������#G��������]�6   222"""$$�z

�����#��������������������$%%���Q���UVV^�n���3������)�6����Q��K�R���g���U�X������
�V@K%���K�����+W�*o��Us���R�G��z��9���<�sF]���

�eI{��*O�H* ������N��AS���!��o�9M�)mrW4�`�? �� +��qR�4��z,r( P8@�p�@� ��A��
( P8@�p�@� ��A��
( P8@�p�@� ��A��
G>����/^���##�E����S����������LLL���&N�X]���--��/^�3���C#F��v�������K�n�����/_���������lmm-Yioo�uU\\\������TYY�c�J?T���w���������������K���������de`` �UTTT=��F�����1c�PZZz������7�|��_upp��������JV�vu���z,-� �����L�bdd�y�f�D��������ZZZ�B�����o���p��H�4�{�R�BNnWy���2
-�f�7oJ.{���{%)
:��Fn��I���w��
�I7utt����{���tuu�V�vR��<<<DoR��hr�y��K/�����$WU���3�z��n�T<fv�-��O[��d#���r����s�����G����#D�����'N���TRR�6111...������]ImP�R���A����2e���'O�E��������]�6   222"""$$���R��z

������ZK@K%���������IJJ����0������F�K�.��g�+++j,�r������(��})h�� �Bb�NNNW�\�K��[����T��x��r��1��k��+����G�� �\�0y�B� Q@�p�@� ��A��
( ���zR�����P����ci�Z�K���zv�
�R�4�X� P8@�p�@� ��A�O����TAAg0��O��ooV��al�w`�������=�������V�fb�����2��
*���%�������$�p��_��S��u���1*�*���l�Mhn��������"*���2��j�����=�;��T�Ow���[�v�*E�����TxZ?��w��! �aX����1�GS@�!��A��
( P8@�p�@��G���Z�h�����.\8�|����.//����}�s����_������311	

�8q�XWR���$r����<<<6n�8y����g���.B������\���b//�������DGG���;;;��������������-}�����Y�lY=z.))Y�n�*;99988���u���n���������������������kn@������2c������~���t���l���g�~������:m���/�����;������������cccE������������-u����o�����k�d\����G�dcc���0e�
@����z�������E~~���&�^KK�jD{��������-EFF�����7n0���`���������:::\�z��4~����@���:l�����o��S�N
svv������������F"�@j��R���b���h8�����hNe�V�Bzz:[����+�lvV[���������H��"'7���C^UYP���dk233�$��r������c3�������-,,($%%�����5���C2v����7n����
bk���{����,))QWWwtt���TRR�����~�6�u)��t��hP�y��K/�o>2UiGX�H����1#<����U2�b��������![PUU��"q�
=]=�d@�<S!(2yl�(�I[�O�>��7�U��x<�K�.=z�������~���������������	&l���K?����o����S�\]]��������77755��k�R�������		�����vvvt�6������T< %%�3g����������R��z����			���\����?��n���3g&''���S|6l�����t�R�5{�������+Vx{{S��#���Jh�x@���>|�������?����@'''�;v,)��Bb���+W��U��u��R+���9m������������[��>��L����������7o�����dkk+����,>>������t���y�����������(99y��mnnn|��� gggF����7o�_�C����v��`��� ;�?������lff��LMM����y�F�s���wpppss344�������;w.����h��%�������322(�X�B�����8��-_x@�N�Z�rebb��_�����@<�y��QrppPVV��g������'L��o���9
8��������v
��Y��1A����0_��?�����0*��<�`�[��c���W<������`mmm]]]��h�}��b���<����[�U{1��W�m�%�bH��ed>~J�����M5Xh@���M���Txc��C&5�p�h���***��	�G���>QU6[� h������u���������i< �[���SSS��i#�:@3�s�s���3�^����UPP0x��;vXYY��h=9UT�N������x@������QQQ����6o�<{����O��h�o�����
o�6�Xx�sJII������������O?��
�����>|hkk��|�����:�������-l���hv�E*X��j�m�
��x@���...066NMM�t������]4_~��V}��T9�
eM:"��N�+�1FT��tt�t�����x@��������3gRRR���6o�lii��*��()��������4�X����x��}.���x�������2�k��h��Y�����������������)��Y��"##�>}�~���������k��*d�s���}��y����������A@s�s


rqq������Ajj�����l���*d�s3fL�����355��caa��*d�s"�x�L����jff�{���9�x�"  ���c:::������?~���e�6**j��E<���_�p���������~~~qqq&&&AAA'N��RT������_�6l��]��v�J7�N����{��
Y���������q��������S...�z����Z�|���Ott����������d���=�Uqqq=�������s7)�����U�%%%�����Ce'''������|MMMJWT������y��A*HVr]���u����������C(�hii������������g��������S������z


%+E��{�n=������W_
4�_�~iii^^^�/_����>�|���AAA666�+@�]���$+E{��R����<<<���{���!C��i�f��M�����]�6~����@�� ���l����,]]]�����o���p��H�4�{�R��h4��v+A!==�����������,����i#,���q;pFF[H���\�W��nYY�):d�:�IHHH��C��p�����>|B����������dff�I,��+�����

���-�b�s*,,|����i�


6n��k�.J2v����7n����
bk���+++����fLL�����J�~���:���C��4�������T���f����\�FcccFxZ����d����70`FF�lAUU���W���yQ@����3�
QUgIM
��2�]E��
�/%�g``P",t���y
�&��+�t����L��`hh����<&AlY�\a���-���q��#��������maa1`�������$33�Y�f:tH�>)KM�0a���\�!nnnjjjk���EFFFDD���XZZJVR���P;;;
:���T<�K�.=z�������~������������'N$$$xzzr5���?��CXX������K)����������Z�b�
Jf�(��})h�x@***JJJg��������Aeeeyy��}�;����wrr�r�J]*o��U�����9�����������?�H7)[��
��n����G��[�=z���|��T��uk����|���x@S�N���UWW;v,W9o�<�|���x@�������/^��k]��-��s���o����������!5��B&�TP�QcLZ5�hP#�+�������hY�d�s:u����+E��n��Y�����G���AYY�����s277�0a�}���4p���'O�����-�x@������������\�"����
���\�����<��;w�����'�x@NNN�3;;;55�M�6��4<�;w���1����ZZZ���cG�$����|}}������455)m��y����O��w-��9���P�a�ZZZ��������]��x@jjj>��2������]��x@���...066NMM�t������]��x@��������3gRRR���6o�lii��*d��_�o���|�{�|�-���FGG���O����������L~����c���G��-8p���`��5�����r�
_�h>�
K�E�a�Y��pWP����F�����{��������r�yyy#F��3g_ki&2r�|C�`���*��?�oh���/NII����*KKK���*x�[�1c�����{����7s�jjj���|��|����Rhh�X���K���x\@#HL�-)-��������UF���;b��S�K���P��S�kDe%��Vc�^�����3�;�?���`��JHH�%m�����>
`k��������o��������������LLLh�'N�Gj�Z�E����1OR�p���~�	����@'����(:�X�b�T*h�0��l�����9M�2���~������_|���m����d����?''�K��~������� 99�����,..���Z�|���Ott������3������5/-���?�
k���0Dab��	������Y�f���:�����������B���KeWWWOO��R��j^
Z����j||���UeeeNNN���e����XMff&�k��i/^����;w������w�6������O�6044�y)hax@K�.�0���2t���v�������U�444�L�Bh��}W�^uww�������%|---�]Jj�Z�
[��kZ�������hYXX�223��Tx��y����������Ke�{&��[	
���l
=���X6[�Z)��������]:##�-���I���e��������l��eeei	������[�������e�!@��%��<���Bff�%<�N6���\����U�`T��L�1l!CMbY�\����/�X	6_�������O��������j���]��N3a�~W��h�����}�N�:5,,���9;��4��i$�K���H6�Z)������M�!_n��{S[[��l��oI��
.a����a������c�@,����������U�����4*w1FOO��I[V����FF�lAUU���W���y!�1[S'��Nh��:Kjjh��1�*�����Mg���300(��t ~��%��0i����zJ�!q��u��t�:
�����GYc��z�z����~+��g����<&AlY�\a���-��p��\�u�m|���rJ���TVVV�4i���INNNLL���{���D]]���188���RII�*cbb��;��������3����m����������c��?~���o�:u���5::z���G�qssSSS[�vm@@�������jjggGAGjKKK�K�?ZeL�~���6�-�W�5����x~,66�����3


�T����.//��/������/Z����g��(99�������a��MXX��t�R�5{�������+Vx{{S��#���J4p��;	�wWWNt	�UP���h��5�����^���[��>�o�a6�R���8�JU�y��o�
����m�6
\�����JQQ�d�!�J'''��?����H�P@9��y�Sn��w2��������M��{|�/*��7�x�s��_~	��H�����<x��Z���0�>�*[~�(�������xAAU�y�}c
��x@;v������G����+H�|y�[�z����J����,g�OT�-���,�7�!��
 �'<�~����6l���������Z@<z�y����,tT+G�.���`�h��g������[����X�u�m���X@���[��������Lx@b233���t�R���d��ST�g\9"euU���}�k<��M����TJ�k�1(��'��:�����Pee��������](���L��L���:��o*t������?���biiiaa��*�*/-����������Yvl��4O�6��S���m���z8����(��������e���(r*-���fk���cs[PRRBjVx@���R�����1 hd�O���X�m��Lz/����p�*O�O�H#�~�u7�p��-9r�~?~<..����722JNN��m���_���G��\�(�!M�'���K5}�nYM<,��[�{�����,F���������<���7�?������k������������d333�fjjjNN����������������0+++**j�����@F<�%K�������������b�
'''~W�|Y�0�����c+����������x��/
��0�! P8@�p�@� ��A��
Pc�����j���[|a44ws��J�.����&�6:�*��L���G
'�TTR�S��V�&
m����Q�M4�� 5����_?������?|�"���e�`nT
uf<��{O��YP�G�7��&�A��k�[QAC�n4��k�
������]l����f�
*�j��ivk�q	 @�(/-��;���cs�
��,�b�u��KHQ�%���R��P���nS�)!)
��O\�M�Bh�l�g��ub�>"�,������T�3����z��}�F*@C���i���>�(888  ���~����_\\���IPP�����U��^KAY��'�l���������$�I��4�%���q��
{��n�����7��������y (�tJ���V�c��#��G���������WS\\����|�r���hwwwgggkkk�J{{{�z]i�%!�����]����@��+�9wXP0m��})v��}a"Y�E��4k�,��C�r5QQQ������Tvuu���<x� $+e\
Z�����
�]ji	-�| J?b5w��upp�n������JV��T��W��Oa���g�2T(.-h�15�����������vl�f����n/FY����C>����|MMM����V��d��K�����������P������n�^XS�_�(**b�������L*T�s����`i��l!�4O;�/����������i������d�����q��CF8�����������n�����2FY�����La��������<��B����{��V)W����sW�
�����P�����{�R����)2U���#��}�YYlA�TH�99�z��-*��yn�S�����2h�o5���rss�B��������j�����K�Hn��pw|�������W�<��3���V�U�`T���er�T�X�;W����?�A���+
����^��[��^!�HGG';��s1��uuu�V�������M�!��l������f�ccc�j��{���U)#������E�������V���^�[�8��9S��454��{)mE��
�/�b��g�7��T��x��X��"M8N#��@_����QSU-|���ldTUPUU�����p���B�5��/�k�|*b�.3�^V����#:�������W�$�-�o`��8zz��W�%k�+8%�B��4�������	����������mhd���
�F����:���c����msy�+j�
N��
�\A+�N��p'�<�`��$�-��+�[��q�p�	L���T��Wpk������T�59::WVV*))1�Wb\\\�V��(����M��A��qm��@C���������v�������������KKK�JjjggGA�����<�	[06j����
�+9@����w(�������/Z����g��uaaaTX�t)%�={�XYYQ��+V�����DA��KH����-��:lP�w�v0Por�TTT�D>�qrr�r�J]*o��U��AV�u���a�����PLr�Z���U_���&�Lod��=����������O��
~a�N-ot������3��5-
^C�Rai��c��J*��hN^{|�2�X�~RU;�c��$�r���lY�X$[��b��L����5����K����mn�����b�P�{����FS��E+-(�|��-���F���&49 ���S�q�*X����f1���t��{oV���������������<�8Wp6�~�i+3*�0;5��@}T(�`?�n��G�^���q�RF���Y��E��o�5��ThL@
I3��>!(�2���z4
��S)|_Y�#�fV]��?�NL��
���OxwN��� ��d�<�K��`�Jm����	G���3����k��Pg�K��%�������A�~��6���!4�����'U��;cXsc���{g�<��
�_�����Z>�������f�F4) Pt��o�_����~���
�	@�K{��Q���kj�Z�}S��Chz�O�Bm} �F�
�Q�������:]0����h�������{.���?x�H�Uu-/����<��8��48 �YV^Q���l�3�BC�A���i�Y�e����S�|��tmS*t6`\�4�hTFn��������gr�e�Rf�x��g����,����i�H�P@@�����������B��,�����9���Pm��k���!�E�����~{rb���H�)F�(T����R~n
���U��#���!!@��~�������v1/�e�$�����<%h�o�l�u?[�bu�P�w#�Z> hF^$�:�
:�ZL������,j�A�M+�I^M���(^}y3[g�������������i��]�<F��qi=fR
�5������_?G3���3.������W�OY��;��P5i���@���f��/�e3�w�x�
( P8@�p�@��q���.//�n��}�s����_������311	

�8q��RR���$��JKK

���MMM����b//�������DGG���;;;�������������KL�-)<�2V*�g����cl.�,?%�$/�
����}*�*1n��=Z������,�i`` Z������KeWWWOO�����
5/-�;K�<I���n���:$���y_��w�s���R*������/*tX�����T�PA�K��233UUU�M�v��E}}��s������{����kcoo+������5/�H��)�a�W�>((���e}�tL�y
@S�L��o���W����[XX���kjjrm����Ft)�
j]
�:�E�=�l���~p,bnS�s��]��n�q@-�5u��a���l�o��S�N
svv�����dee����.���#�@j��R���bk?w�W�'a!==�X�7��
�{����BFf&����v%�9W�\Q.��m�e���������\�gq�8�_�����H���2o�O�bb�FR�jv���qVmNVvv�W����1�j��$gdd�eee���@S��[*:���
�n�����-+-�����}K����q�.]��T,��w/��V�TT��V��v\��W=�q*rrr��t*�!�<��T4���\��8���T��z\2_
/33C�.�"�9�������O��">���(..R�ZE�����l)�)y������+�&�o������<|��[)WI�QU��+8��IOK��:SXX� 5O��Lw��:�E�T�X�;WpSA��MMK��u�+�����.�5%'''&&�����YRR������\YY������1...�KImP�R�7i�2d��{S[[������ ����kjj�2�s���!�

%7�O�>fz#�?u������Z�8��9S��454����"�y�>_��R��a�����������
����cY0��4�8��J}�bv{FMU��BP�&��������=�
4OSr��+�PAO������*����^�}�ME��C����X{ b�.3�^Vu�.9����F��d�������:N����2�p*�����.��,7
g��-�0�K�
���F%1����Q����N�t���bkk��\0���{�������F������Wr$��
��<x��f7>��Z
4
���H�Z*�R�Fx6�z����V������B�V���:@j�
N��
�\!u*{T[0�c�c4w���BWWw�K��[H`�Ol��W��\����F�
��-���������~���Stf�������#G��������]B�CCC���(�Hm`ii)u)h��5�����u3g�LNN677��2l�0����Y�t)��={�XYYQ��+���)Q���@j%�T���!�J''�+W��U��u��R+����P?@�g����~�>:i�{����_MM�,U����c����Ef��l��mS�_�P0@�'&>�p��W���,c~���v�S!���=�#�	�����C���T��0/�X�n������o���}D
U���6�f4 �����$�X�%�����?���u���9���{�
Z��y�Md��W|�2[^l�jP!����J���b^��:��{o���^
�����3;8R��yiZ�/�U�;��4U-T�5�W�+ �INA����l�f���8Ai��L�5�?���\��������}&xq��R-I���/F�n�F#c��U}m�[�
��w@��+*s
������P�=�F�M�NBZw�-l9�#{�V��!�i%��D��u��p���!�����w�M�
����d������%L��3���1z�_]�]�m�?���-������K�q�vewu���B+-��]��
l�Y�&u\#��'����
�BG[��>e+���A�4��������e��&��T%�V��Fu�$0e���:c�/��!@�{��3��P�\j����Kg1�������82���7�e3[h�j��1�R�<���
��j����������V�F�hY��������R*(W���W}��1m�������2�oV�����W�k��QV����u��4@�h>c2wM.�v��M���Qk����L�F��a��V}gXEeQ#Z ��e����;E�~���SVW�n�`�s��_�������>������:�W
�O�g>�}��N����������F���H�>b��!S���Vwb"._|SB+�~��/RAME�Q� g�@� ��A��
�F����o���{�e�>������Le:����c���Tpx����:{����l�>��r�3*�k���R�-*�:�'7�&@3�r�"�������
�����b�V'��|��	*�����<���#(, P8@�p�@� ��A��
NK@��_������311	

�8qb]���$-*{yy-_����'::��������������5/-L�
@QQQ������Tvuu���<x�````�
�P�R������4�-kk�W�������)[n��VYI�1����t��]����}lll�


k^
�/q���,=��������"(�sft���ouZ}3���_PG��f��mS*d�����*t����aUb[O�[�nC���P~~���&wSKK�jjmP�R����?���-����,����2&}�������6�Z��?K�e��7�);�O�����i[�V���{��a{6S+g�T�O��Q-��5�+����������S�uE��
�\G��kK�N6��MPAY���z�����5�Ic��U�:�I������	�i�b��}/*�r��1���l���������4�m����K�Gu,6��*����Thh�v6-a��S���B��Q/����������RO���r6�5*�����D��n�S�������F	S(>R�
�W�<�{�.�1m���&���
g#a�z��M�4��^j����cPt�����m
,L���pS1k����<�Ht:0�bS�N��r�8�*::V��[{+��2
n*�t�4GP��v���kqSQ���Z�'p���`�KtFu�_��3� y��
u�0�[������B�Q��R����+�6��B��ME�VEL�WSa��(�K�
Fd��0dr_'W*X��6��ZS1�{�I�u�B_Ks�[��,*T�f���n�9����US1��T�0m���w��~���S� ������
n���BC���
��Y�E�M��^�mk����
�SQ-*���dggs7���tuukmP�R���b+�yv`���y����$�'���e�SU���-��	�X���'7��}�<d���������V��T��_��[�b����s���S5xZ�����U�����V���j���4a�L)s+\l�/������T<��n*R�0�����e��j����h'�X�'wS�j������@�T��������^k*��p*��R���OEq�$�����l����a���Tb*4��H]��������;���$��,����N��T�wD�2����m*�����+LS�TH�+�^M��:M�������r��R�����p3�
i{�������
����j�]u�
Z�TH�+*R�|*j�����cpp0=PRR��111...�6�u)�����j�"w=����g�p��,wn���n�
���
��z��7\�
:��4kQ���MMMm������!!!TjggGAGjKKK�K@K������0��K�R���g�����X�����Pu
�V@K��qrr�r��X��[�jn �Z���j����C[����
��z��7\�r7���Y��p=����g�p����F��
(��i���>�(888  ��>���-Z���}}����?���O�>�x��'O��*�����������k��#Gn�������������o����3/=�P���N�<���N�������nCCC'M���,++����['{�g����.//OYYy��y4x��dEFF�����c����#F����Aq��up\\�"((h���|�\]����uJ���1X�V�xJv��1(�3_��X�|��������cP�N+��W�� �q'�g�/@
������.]���gVV�����&O���?�8������U��_�x1f��C���u��5777��w�����Y�`���_����$''�����'���WKK+))������}�]''���
�STT��KJJz��I�������R�����~��Y�n�h���������//��[��;��?�7n�z���k_��Eqq1�b���>>>��������������\]����uJ���1X�V�rJv��1(u����=�rJv��1(�3/�����W�^2z��wR{vtt�����Pf��E���Cy���Xz���t�988Px�%UVV����}nA�\zw��=����i���M��</�B?
x�MTZZZXXXbb���f��I�� �W�����O;�y���];;;���X^z�t�R��m��Ke�7������������AAO�h��jGe��===<({��U��-_��d�|��m����d�|��=�u��������cP�g^�A�;m~~���^u�������mmmy��!5����z�5}�t�L�3��g9�YZZ��OF���N�����7���g���9o��'N>|��>UUU�l~��E}}��s����=������a��]�TTTf���p�B^z�<����������lK�in��!]2>|����K�tI����njkk��_�%��w�����IO@���K��U��-_��d�|�R�Z�cP�[��A���:k�d9%�������cP�N.��W�� �q'�����!�%:zG�dcc�c�����2e��������t�W�tf�����W�DCC��J'�}��]�z�������F���g:�?}�����0�<���������3g��5�$����������n�����ddd|��W|M5=?�=m���&L8s�]�x�+X��P���������c� G^�A����C�����z�qu@����k�����0_&M�D�`n��A?�����e������N��d�JT��o������;u����0^N�t����"���������O�[�l�}�6_>z��y��IWWW:5����t����Ety

���O-Z4\�&G�nE���dggs7���tuu�]EC�1��!���N����p�����]��������HO
�c�w����>�mUUU������q��q^N�x����x+++��������������^�z�7KJJ�I��c�������dH[[������K�,�v�r��T)""����}/�N�t�=}�4/'_2d����wg?��#���$+))������x��_8Y89����iy9��X��g�W�$O����	�n����F��)S��3�����S��p��3�|���_~IgL^~
����t�9u��t����������%����3��%K����'O�:t������W��=y����w����'���q���?g���K�����9=�tf�G��#�9���9nnntm[�vm@@@dd$]HBBB�]�prpr��1(u����k�cAj�
�:�Q^^�>w)--=�<��|||d���'N$$$�������?��-�������i�IIIzzzt"f;����|�Y�������a<l�0�:�c����u�����K�.>|8_=3�7����x��O�>�����g������;w./=����Z�j��������o��U�{�����3=u��g���/=��\�cPj�����n*d?��S]�����,�1X�T�rV����`u=�~Vw���������~+�(���~�Cj***��M�h�������w��!�@���-[�co
7��m������������>g	��-�"�KW�NNNW�\i��e<��V�c���e��k=���l��~�0���u+�1X]����]8d<���V�k_u=�~�C��
( P8@�p�@� ��A��
( P8@�p�@� ��A��
( P8@�p�@� ���s
�%�M
�tZ�����m�f��]QQ������������������:~�8�^����L?����;w��oR��J%e��=w+>>������TUU�������X�fR�m�*���)�*z��Ac�9I�{^QY.Yo�m���x4/�(����<�bW��c7$��.5��.��?Kh����w�����)S��_��5���$�R[�9�����]����Z�57�c'�T�����R�M��6���*J�JB�v�@�wbe �����[�X��.���p�B�N������x�Eh��=�����
��������={����N����_�hQvv�����������z��
�}�L����Y���$l��-((HCC������k��M�>}znu=DGG/\�0##CSSs����&M��y��u��_�����}��o��������?�����5kBCCi6������]��\��&!&&�������x���k���� ^vQ�	%��4�����	�����(99�������;v���pvv���:x������\L�:�7�`��:~��j&�^�������rqq��i]�f�����'�����#G�u����{��q�^��w����������w���K�,9v�]Y)�����yyy��u$D5t3==]^^�����YvQ:�$�Ic�M@�@�&3u�T����kkk���@�uSSSJ?T��m[������Xb���������/_������C�ti\�hQ�o���;gddD�N*��zzz>|�.�[�l���OTT���o�����S�L��:::��GFF�����-,�0���������2�PE!I]]][[���Gbk��.���)u�
1'M����[PVV.//���&&&���[�~��Y5�6b��_3�{)�5t�����w���2=p������l����5j��M;v�m�m���>]}�2E�Fp��qf�Q�z�����yB�v���	�� AsaffF�����J�G��K���\XXHOX{�
������s7���������SLL�X=��#����p���{�r�)))��~����^���������T7N���!C����������t�����D\�v���c���]�x��O>i��6�����+��K�m�����5��^�[o����s���w�y'??��s��������S��Y3z�����9r�{Qa��-+W�����?�x�_��7�23R���G�F@�@��7����L��H�U����}������WUU����
$�`��%O�<�����������x�
��tv�R�J��U����mpp0E@##�q��u���y��j���&���G\__��������WQQA[A��/���}��'N��7o�����-,,�AFF�������RRReKx���^O�H�^U����j�������H'�khr@�����������UVVr7/^������^�Z�R��������v��d�={��u��
�kmbee������ulV�����R [���$����p�F���_�~�/_�	

���f�����������X���E^|6lG]�5�����J���AhF


��k�w�^ww���������������1�4�@�BhF����m��p�B___]]��������hr@���PS��1po���@#@��
( �Y����GO%���u�oo!u�~����QLPP��������'����fH�TVb��]��a3�2���xkk���RUU)2wobbb
�^K���w�����nook�U�"M>K��e�����z3��*�ZRQ��i�]������o9xu�^��1{C�O�����������"����Pz��9���!m
���P�b�.\�����Y��.�k�.))��kF�����g�	���9���6A���j�Y�K�c�'qNA���?�1AK�}=V'�3���(@�a����}��U�V���>��������fddhjj.^����C<�������������?~��E���***~~~�F�������+��rLL��;w�r��������g���'N�HHH�0aB�{��I��������=��'O�p#�����u���kiq�����3�y3]<h�7l��g��/^���S�+�knF�-����Y�����7�[�����jjj4�o��������?�����5kBCCi��J�{����>fii���af�e`��I������.]���WXX�O?�D�YYY#G����{�����c�����w�����o=<<�������,O���D:9�������Y����EEE�����gxx8���/�DFF9rd�����:�{��t����gG.9�.B�����e6]����������;v�������K3���ix-f�����������������,Yr��1��R�(..�5�*h���u$$���{Z|f��.
�B�&@�h�����:�[X>t��9
4t��2�===>,�5055�����mK�����Sy��)��_z�L?�	��q��2]9s��gg�a�U��:����a����~�!#�b�H]]][[��#�7��N�J?uuummm�����Ej������/��T���l���O���(__���{s#a�u�����P�pssc$�1������.
�B�&@OE��g�������/�={fee�V���c��.E�MLLD�b�r����4����������3lj��EG^���Q�z���:t�������ee��W�Y��]�m��[�����Q�6m��c����}}}��J���Z����.
�B�&`hh�����]�	�~��N�:����������ffft1�n������
�?5���[Tu�fq�5�u�����Ru����G�z{{/\�p���>��������c��W��"�X�~�	 # h����+W���Cg���4�|���|||N�8��;����/X�`��9�K
2���'O�tww�'����?���������{��Q�����Fs�j��jn�$u�]�v�:u��5kF���{�#G�p/*l��e���4�?��c���������q����, ��y��]��#Yo �%@VVV?��#�X���G�E���r}}}:����y��UTT�7����=������?�x������_}���A������J5��w��a���_]���T�j����6��������5�Y���/���}��'N��7o�J'�����ddd�?���+%%�.+m�7��,M�^U�K�af�|�; �Y/�	���fs��*���w��e��{����tssc?�����fff�M���moo_TTT�x�t�u��1l��K[t��6�X�r��E��V��L�����{���Y��%��
��[��^�������������1�������aof�; ���%�(&��0@�p�D�?Q�h��@� ���?�Zuc����IEND�B`�
bench-dbt3-50gb-pct.pngimage/png; name=bench-dbt3-50gb-pct.pngDownload
�PNG


IHDR��8�r	pHYs���o�d�BIDATx���	\�����K�c9��@EE��JI1Q���K-,�,�i�h��f����=K1�6�+-@A(<�Oa���}v�����}a?�W/����g�yf��>��.�eee�.1��<m�@� ��t �9�@� ��t �9�@� ��t �9�@� ��t �9�@� ��t �9�@� �z/00p��u|�������[�no����1c�����KKK777�

��'N����*����L=�����/�����~��D"�����%K:t��^Rc�666���y�g�}v��kk�#F|���|>�����|���S���������kG;5u�Tcc���WE��c��+WVR�\�t�k��;v�x���+/Yc����u���T�[��������Uu���������c���>Rb����f������Z�i�,C
�����C�(Q\\|���]�v�?�N��������J:S��������'O�8f��)�����q��b�����?��|���M�������K[���'_x������_}��0���������9s������*�={vbb���G�2.\�xq�>},X��e�����~��[�l9r����Y�����yyy���mU�o�E�~��y�!E�M�6���T_m�Y���2}�t�ti�EDDh,P�i�,C
������?�N�4i��mt����U�Vi,��+�4n�x���(t���)�J���U�����_��b��s��9�d��!t�<l�0��9::
7�P�3t�PY[[<��__���h�~���b#�>��o�����?�LOU�_O����^�dk�P##�J
�9sF�����hF5SM��f���JG9��+*���������B]�v��E��4i�^����VG[[�Tnff���*���g200P/��������������3f��{,--���C�/�����������7b����*VQ���/�����
$!���}��]�v���8p�����-Z�jG��?<}�t�>}�*�l���������W�^M����������O��>RK(������(��v�vp��9���h�K�.]�n��k����)��O>�W\����+�s�N�V��,Y2f��]PoeR��o�MNN�~�zh���5Sya
����M��?���*��c��Q��9���S����_I?���[�_	��B
�@��������SRR��?*�E��������5k�6�x��QNN������_T/CQ�����W������g9�l�k�.!!������S�����GH=�y����oE9�
����(���������F�>|��a����������aC��ia�2e���c�B��������UY��,[��������3gRq����M�RHG����C��?ojjJ�O�0�B��lLxxxhh���������w�y����/RI�k��7�x�b�+W�����9�6mrrr�����U���~P��J�����,@�`�i������(�J���U>]�{yyi������2��?��k}��dee]�~�����9Cz��A������g
������0##�V���bZJ�O	?����c/|�������k?��vn��}������C�:�hK�,��

o��I{�n������|��m�6((�D
���T*ooo�RI~~��_M!���?��������y�8�[T��S��B����B��SXX��g��=��?���Rx��o���Yj�f
��M��u�Vz!=���������N���R���Bc������*�M���*((��Nq���N�>��)��t``���'UnOVWRRBk�������bOQ�0d��*���K��>t��J@�����%����>�����?��O�>�N������2Z>��L�k5������Y��h������E�N�:�?E{A{��{w���:�v�����eZ��=J��g��HOOv����xZ���Nx:t�������C��w�?|������������������c�T����1l�0����^E��m�I�A��n���J3��A
Vbb"���uk���G����m��)]4��D����s��qv�p�&M�����r�8p������iCaPXX���)�>���i���7�|3a����u8��0-[�tpp�%����9|�0����������~�����W������,�o�UDx�Qii)������j�*j�����������{��@;�R��U���T�%}�ZX	_����;m�4����#�A�q�9��`#F����b�M�6Q���]��oW]���Bc�TRI%�@� �k��
t����W��]�����w��w>���A�����)�qtt��)ji��-�U���z���w]]]9y���0���jJNN�EOOo��!�w���]��9r�H���h����cbb*������<������*�bSUm=!!���������W�������U��=�#U|<����:T��rWV��L�0���o�����|��wO�]u��C%���;w�P���>��4N~��7PO!���������?�,Y"�hF��c�T��(��


&L���G�9��PL��E����y����

bw���u������	yyy����lE�#F���|�k����~{��M�����������7���:|�0�X����( ���?�<�v���������+�*i������������6��qww���Z�o�������MZT���%u8n��\���95k3'�
y���;v��
�0����vV�(�PI%��y��e+V����m����]gg��o��B
���"����o����_��������������;w��/��k�A�=����i��k�}��'t���������tpp�J��-[&''�������i�Y�x�������9�O�
2d��iT����g�����/���������7�|COu��-00����|
;6l�@���T
�k���T��]J<[[[
�����N�:���=�g��,/-�:t��(,��s��VVVT���GFFFhh�����O�n��1m����Q����Gq������h���
��8s������%�f������K}��m��C�R���?�Z���<j��m�����~������������]�J����u&���x
����G��I�=�
]��{��
���j���/vTT�B''�9s��:Q���[�n����2ccc��G����}�������/\��"�{��5m����w��E�"=K1
E�-Z�f
U2~����p�����d�Xg���w���5�]�v�8�������`�(��4iR�;5e���S�r�O�~��'�{���9y�Fq^��})���������m���UP�E������������3������R�)\���*�KQ?XZZ���k)1p���[�
�I��P%�PDbjjJG���C*QH����C�������_4�t�<��E���WB�L�.hlP
�i�>���)@P�����o�\��(��\�%����������^��[����WRy���$''W^���E��>���-**J�Sqqq*��$'�9q�K�
6���9r�
S����kE�I�7��#��/�z���S�]�����JX%����n�~%���[��B3����9M�e�@� ��t �9�@� ��t �9�@� ��t �9�@� ��t �9�@� ��t �9�@� ��t h8����m�6z���n���������l��7������---�N��P���j8��A�q���N�:Q�W�^g��>�����E��iii������?rrr������^z��J^���={���;w�������������+=[Q~5����w��*ARR�|p������:��?��Q�S��������{���7�����i3v��9s�����w��	>maa��u�	&�������$VVV...T2  @X,??����Zr��m�D���C�
0@X~��A�|}}���d����S�G�Z:(�&M���4���;}�t%ebbb�����OZyii�W_}�a�����?z��Y�f�������������d:^T9������~8b�:|���W�'88x�����%-����XUt�@��,�J�}�]W;A���LA
���?�'���ie�U�=E��zy
)
w����������92>>�B���~����X*��I�/������W���RQ~5����_|Q%�B1��hY������e���s��u�Z�h�Z�`���;�<v���%K�=�g�Z���S�/����PQ>�Gvvvo�����YI���A��1c������l���z�Z���?��'|y�����Y#�n��A����Y�wv�����������w�^�I�W���1��5�/^��7�|���}��544<�|HH��k�((..��j�(P/�Z�j�������������L>��r,iy�������z���O>���������Oc�����@�p���(�i����[>Bt-��i����{zz���>���7�� ����{��_=|�0����������i��(Jc>]F�����Q8u��%Z UV�TJ�
(����,
t�=����p��I��^�x��)S�PlAU��{�����$=|�������gY�]\\hI�uKc?KR���?�����y�p)�����_���w�f�ba6l-�iiil���<�:A}[w���}����d9��	����8'''zH����Ma{�K�����u��l����@Q :��`<xp����W��~�:����3���Z�)����z��
)t{E�8d�:�W�\��Kci��'N�(����y���Q'E~�!5`�����%��GMcU�Z�z���^}���]�R_��S)YQ���P/ ���$����o�
����g[�)[�.p�n����w���G��V�r���%�O�>|y}}���{�9s��
���Ua���tm}��1�k�s���{��)���g���k��������������g:t���W��U����7o�1bD5;�����b���O���1���hg��o��Bj!�E���}�v��5����~Z�)��D��m)R	Dh!���z��w(v9r���t8*�~8�}<�����bYzE��P�8o�<*���o���|����-5��+11�u��+����$��%�9=�(Aq�{���gR0�b�
�]�e���W�^��6c�"Ot�*��y���`:�+W�T��*j6 ��AC������PPP@gp�����^x����;v��%Tx������>>>��i|9������5b��b��]�(�=������?��iS�M��<`���M�6
2�q��������H�
�'_��-�r��o�P���>c�V������~�5~��-,��o����stt�4�~	�RjOPP���������%%%�r��k�Y
���/����O?m������}}}���o���V�^M;��\%G�7nE?����( �o�%%%Q`����Z����{��BCC5�F}��eooO1P�~�^~�e:(�2	���{xx=zT�SW��(��h���F58j������oh15k�344VVV���ciA=y�$�m���gw�
�,���2r��-ZP�Q��iUP� �����(���p���F��}��x�
�L�!�J�wtt���������s��!�=z�������������"����t�RJ��OK/����7��_~a��P�GK&cu���;v���(��`�z�"V����J�>v�����k'N���U����|����)������������-�T��a�(H�>}���U�>��A�6���g�_ggga&��j��n�:
�h<P8K��������:u�����P���������7!!��w�a%k0���?j��
�_��i�)S����������u����t���a��b�u����/^��T�^>x����,��f_����I�&M�6����),������K�w�fgg�={v��
*��v�;wn��]��4P@@�?�4]�x���CK�8�|��J����S��U���s��o	Q���MW������M�:�=K�(&L`�C[���?������7n�?���cG�](�R��Jv��y��B��?V�W��b8���7o���QB�V�*_���r�����^���rK�,����4i�����{r�(���;�J�W����$�lT4f*KB��J�>}�u��fff*S���j6�^@

-�_~�%-?�w�KKK/_�<z�hZ~T><����o�����*_��gOZN����^���[P�V��������+�<���(@~B�;t��+m����#ty������mmmM�(�|�����r�70*���Pff�zD��*���o___

�}��f�����Mc���-\�PxE�������oE�S��R���u�������XJLL�8r��=~����3�
U�o�(��)�d_a�v�E��&
������P�s��e���KKK�H�����3#C��S+��{��Z����l,	�r�4��������U�L��P/ �������=;;;<<����?����)S��+,,|��7���w��->�������"������������}XX�%���*-E��

LLL(����]����~�wfP���E�>�`��T��;h�����Z�re9z��ML���?�|��9�/�����;E��������K���P�T�������{��-�����T�6��L�>����_F���v��}����_�rg)���:""��Z�%Z����U~H*�����o���)EZ!
6�������������7d�Z��n���M�]�v�Q���?�M�B��5��2��n����HHH����(`�0�B�G��p��� u���t8Xd@�������W��T�5*=z�6J���$���fW���=������9t����s{��E�+�
��S�j��3g�^����������E<-�����f��w���]���777
\�}�]z�s��,�b�/��B}(��o����?WWW
��Z�����w�����*j�������h�������7���q��"�/X}�����]c���{��}���>�����N��8B
5j�w�}�������_kTW��r�o�Q���;�dddPD���=�P�A�:������F���GKr�{���o�,��������O�f����:�C����N����P7R�@�N�2��{���#�������8p`AAU�i�&�����?35K���q��bnnN#��h
�*z��f�x6!���}fDA����+/���#��I����R�Z��������S)����V���;FEEi|���j�\E�=~�xEOUY�V������������y�����c�������,T�����s���	?���>��#��i���q�z=��P��_@��B�qw����)���{�I����GM�K�*�o@}�t �9�@� ��t �9�@� ��t �9�@� ��t �9�@� ��t �9�&���f��1u�Ta~VV������CW�^M/\�������>n�8�z4P�,**�8q����T*���400�b����O������ ��M�2%;;�S�N�O��9��#��1"444((��???OOOWWWVXc�6m��g���6o�|��e�'O����!C���(�r�JD?�]���z���={�����������o����;w�aLL���Ipp0����;l��-[�,\����X����������C�&$$P�z�jww�~��=���ZR? �~�3322�O��{��m���9W�\qssc\]]����/�X@"��gzzz�������b33����U�VEFF���SNhh("!���~@M�6��w�uqqa9yyy&&&�!.�#|��3{���v�Z�DLLLXXXHH���K-Z4{��������������@-�����;SRR~��ga���EVV{���iiiYe�������}||����4i2h�����>}�������P��*::Z���'���7t��*���h�����m���������??""����v��cccU>;����z����Lz���:`��c��QZ*��_������f�C��Tr�)��[�8b��?����[�W�...622Z�b���S�9r������S�;v���P�����^���Q��x��d��D���������[Sy���� �zI�RsssN~?���G����r�J���DEE��,��f���NNN�H�KE4fr�����#G�����O�����t����o�-� 200(,,����~��g��U)p����h�$/���^^^�gaP���@\�@� ��t �9�@� ��t �9�@� ��t �9�@� ��t �9�@� ��t �9�@� ��t �9�@� ��t �9�@� ��t �9�@�����~�={vDD���S�����9s�$%%Y[[��5k���y��������D����q�������zfQQ�������Ridd���KNN8}�4�?��1��h��)����:ub9�������W�~��W����~������{��#F�



�0��������������m��Q����m����e�&O����!C����Qz����~������[������G�Q,B��=<<������LLL���)�o����
��e�����bbb�PB=S__����r����
�(�rww�H�)�;��~@���4n�x��	|:%%�����h��XWW���8���\��^@"��gzzz�������b333���U�"##���)'44���+W��V�������-�O��*q����C�����m���=E��k,�1�G�k���6mZLLLXXXHH���K-Z4{�����������?����k��������?��nS�������c��Y�p!�n���EVV{633���RX^c�������}||����4i2h�����>}�������P��*::Z�m�9�����Xt�T=���9��/���������cDDDYY���=���U��Lc����Lz���:`��c��QZ*��_������f�C�*9��h�"����E��f,X_�����c��[��E?������h��S�N=r������/_N�;v�pqq�@Gc7_���%K�H$N?����n���[XX<�}���H*����s����=:g���� �7n6��2e�W_}E�.X�����7:99�Saaa����P�����L�s�N�w��������������-]��)v��@�����eee��g��U��t�R�4f����C///��0���A .@�s��A:�@�s��A���fp�E����3���4d������7*�.'8��u����3����b>��O�*��{��m@�����s��O������m@��t �9�@� ��t �9����L�AA]7�A@T�%��'�2��mK�^�O���u#@ui��y|��]��m	�NA:�@�s��A:�@�s����k3P�����.��us� r����	���pDu�Z<�W�^�"gU�����@v����;|��?=��*%l��6]���'��	���{���|����.��F�>*��F�CP.��Qjf>�njknflT���Z����SI�E����K��r���@-A:��@?������#""�N���\�p!$$$11���!<<|��qe
U�UEEE'N466�J����T,999  ������t��T?�)S�dggw����P�2b������� �H���<==��i�����Z�W���6o�|��e�'O����!C���(�r�JD?��p����$J4z�S`]7����<~�O�8��un]��w/=/�H��}}=�&�u��gW���z���={����������`J���w��a[�l��z���k�*}}}gg���oBB@�W�vww���_�����sE�RJ�kn3��k���r3#�D*�f�,�Z9=�����k�N������)��8����=m��{y������v��d?�adfj��A����K}���o����B|?��n�:.����I����q���u��gW��(�Q��r����{���'�H�3k�*OO���zX\\lff����j����H�	

�N$�h����"J��,b4y��k�2)����3�����������H����M>s�����
�
�zt����H��(����e��V�-��L��s�Oo���r����Z�:-k�m���w�
�~1��Kir,�pA���YJT�?���V���r�cK�J*^�8:^�����Py��8w���|���.�������M=;V����y����#�4�����R��2<*)�D^^Z]�d�����B>mld ��8#���������zj{vzv�g�~�c8����f������_�����]�>��z�~@����LLL�C�Q���3k��=z�]�v��i111aaa!!!K�.]�h������o���/�9::Z�����P$55U��PFF:��'O��'�^%��M��&��N�&��R>�U�����.,�PT�0�4#�O_:�Nc�J�}
��2,�}�<s����|f���Ri	+y����{,�^~�-��}����Tu$��������sb��bb&K��{?k�5J���
����Z�
dgg�������-,.��Q��,��[�'M��H1��V]��Q�E��O8�����f>}4-?�����eE��S��Ll��hx����Md��f=H>�����uh+G������{�B��~���xX�Q�QiAj����DS��bG����_%��q[RZF	�F��6>J���x����������#��6w�WR����4(aoi���������"�F�Js?��3[������+�v���g�S�5\����v����2%���������*�_����[�t��*���Ii�G���1�/{��������TK�My�7��`�m�o�e;��^�/��]>����JJ�I�}�O���n����j���/S���������G�4�d~����e����OwXb��TI�o����)���|�0�N�K��*(�]����v�,����9���8�3�D�hXI��S���Dan!��<��m{����[������y�H1����S���Q��V�����6�[Q=u��@YYY�aff������������F���������I�A�������477�����U����
����uW9��n���J���S��Db��)��}���W�)i��k9yD�,���e��"216���6��E\
���s����������l��27����JJe��[��O;��j��k%��Y�o����Rc�x������OK$.W�00�g1�����c�6����>����;���Upf�#~����	���s�C\��`����}�kk�����C8s+��	gOn��VVV8��B?v 49w+`�>������wS)p1������6��p������?�(N�6MZ�|��\�l8���������u��q�y��R=J�%��3��������I^�C�����r�eo��?���Q�����m:�XV���_��f�,���������`3�Jb�������0��J����
�7d'�NR���?l4�
n���t���iy�#�j��,W�;O��n���Mq��e)�����|�����?���|�����uvv����*�<:��P��;za�e�����QT�#���(/���*yUV^Q��>��\bm��H����>>�|�k�w���;���-|��o>����we��uk��*��Ji���F�&F������9��y�L>�d�4W9����]��<xm�5��p�c	���(������lI/�������S����l������g�q�dE

5�Cbv���U��uuu�_��]����������������I{������'Re7���X�HV\vv|����Xm������P��#""�����d������={j����(M��<�0`��c�S�R)�u0}}}J?��V���r9����Oj&��8#W6dK��4�����DV��n��y�����~PyT��8��S��8'��Ye��}:���(K�t�^W�U\�h�������1���{;�oZ��y�qe�3��
w�E��^��_W~8>�5PYm���V�]���ZK�������|>�$.-l-L����q)��������������o�:���};�Rm�����U��������������;0-�~Z����Evu����{�b��[�w��k���mdd�b���S�9r������/�X=�
��������'z�2�,Y"{�B?�����������]/���}�e����jy�~}��7.l�z�����fw��^~�pXR��v���X�[����*.{O����4���o�p�����x��������7�ceV�J�������W~Y^I��1	��T����%�{���e{���5hdm���-����r}U�s;f����^��k�
%�����%���n��T*57���Y\\|���9s��\�2**�,�f���NNNTFcfXXX`` �/�T�Ud�������#�������O���[�t���Q���O��������1U�������]kfjYea�E�8��bm��p��Y����N�Yl����G%�[�������(+��{]�2��V�g���8�H�QpW�^ 1��}*>�7��������������YI8����z��X�<<<��=[��K�.��U�e9������,�>�e�|Sq7w������8k@�o��
�%��}��QY�b�&%n[qHJ��>�ta�:m����q9r�|�k�~���?�������_�|�?�/���]klX�-O�@ �ls����nD=����*n?�JTZjQq���������v��\��@���)����j�I�����lg�yB�����a~o��E�����2���k�"^*�M#3���[��k����F� �4W���r7�j��a���v�H�������t�����7M�v�8W��N������m��bT�]]���K.
E*�?de)����������)�&0"��J�M��v�G7��=��B�z�,� �p\�@S���gdw�X�j>��q�u���M��x��=�H�*��X��B��eV�zx�h�������}�O�h�!��q�(K��5����o ���"'��zI���3�oP���5}�[��kI�{����
�>�U�~��U�]�kE=\�7D��i�3"uW*�VvQ����F�2.k�"-���� Rjb��wm�9��#|����[��<�����[UZ�>I4pH�%Kf�Ym��A��G����'����r)���*���� R��=������{���F��Q�,!���$��Z�N�(C/��
8Yxean���]]6�@�����f��[�?[��nq'o���cs�v�;as�d1h��/��4J�j�Z���T�������?����9��_*{Y�s�3E��;�W�@�y�#n�����/s�g�isj��W��:���8- i�����.�\On�������M�7����|������K��KV+E�Z�W�@�WV~Ob����{[��_�h�����4�[z�������P������W����R�\:{w��?E5Wx����*x�i�EA|w�����31��U�����nr�'(�z���&K<*��������+��o=rT�N!�WJ�fD��T��i+v����k�IT�2%9���mi�Mp�����L��N���r���_h�����I�Z�����uM���nXv�
�w���q/VV������;�<�P����������.��_�{����S<x�S�M�:h<��
��l._��Ka�������[�t�fuI
����(���j� �9��a+T���4����C@m���w%��n�����Nn_���"�y�R�H�9��o����o��%����M��
��b~���Oo]w���{���9�>}:@nnn�����P������*��fcmgn�6m�D��5k6v�Xq�x
���0l��|�3�	\����%r��_��{�����[-�nbV��
��I�6�������f���^����W"@������������{�j����j���i;�Y��q���k��0�����c"@?�������u�K���������z��A�&M����������OO�nmi[���D�._�<q��s�����������DFF:99���g����^���� �g��Pppp```LL���	@k���<y������
�6D�RSS)���fff3f����o��<Sn�t_wY����0���<{
���������r��A>#D������������III�5w�L)26����:��:m
������-��*�e��
�gNz��im��N�R��#����V��v��������������{�����'��Gq7��R�\�-����5�i�Vu��R��C��G`���fe���#������n���9
�����RSS�����Y���(�&t����]?O��+>�B�%��|�V��~�m���h�������{����Trr�X[�g���
��)���y�����9-��y����_|��eKa���g��<���9��MJxv~<�D�z��A������������!C����;bm@{�@������KMM51)������k�-�8q��	F��f��idddm��WP��q�_W�����)�
1�����c��������><xp��y��������O		��.P"11�����;n�8�Wi,��YTTD!����T*������}rrr@@����)�6��V�s�+������k�)))@���������7n�F���3r����h�h���=<<�u�6b������� 
S���<==]]]��(�Q/��M��������/[���[fC�)++����+��w"@���:�&MZ�p�G}�~����(q7��~���G�(��t��-]\\���(�211	���}�6l��-��*������z���>�=����
�V�^�����_���x�������X�bC~~~c��=t���[!�4k�l��m�$''{{{���������PL��4r����D=����������mffF��j����H�	

E$P�^�~������,;;������[�n���Q�u���9r�������|�	�D�����;h����	_E�h�������k�M��t��E���=�}������k���Vi!��!IMMU/ ���������'���WI����;,����v�taQ!����2UH��sh�R����Y���|�DZ���*�V���Ul���P�]�5��OG�U{��V����H��LefFF��
�K"��l>QPP��MHx�
���2a^���X�23���`iV���L�I����J
�3%]P-�pe�����C�(������w��k�b�/�V��a�L� ����Yi��������&����>/_����42�e�"G��}�xQZ`��]��������7[*��0Y��Xp��L�>a�KGPQ2�|�t���T�W8#h�\c�����d���������i��{!lFP�
gD���J�C�Y��Y�����MKci�4gY���������������g��s�r��!�������j{|F�`
a��{���^z�Zy6#�4���*���q�������8#�a/��WT������cGJ0#d
6����CbccM
�Y��;�|$���
f�p��!�.]���V���|Fh>���[�P��O�4U�*]�4��e����x2����#�XQ��Hi<�W���������}}}�����uk[[��_������q���,���/�A�9::ZXXd	�
�TK��N�h�����E����$%%5i��6��OSS���\:~�`����n�������'d���U
�6���'$�\���=j��G%�>���\�l����s��agG+�5>mbl�+$6��E\
�ikg��Vuk��3�8�����|T����S�`na�0S^�,^�e�eg2���Og:������q�(Zihh�=*�7���o��K��d�-aR����Rq2�g�����N*Y?d*\��a��r�P��9�!���f��l�J��l�xn�b�0'/m(���C�UXYY=����k���@(8���]6q����*
��P^�W*�����[���u�q�y������K��������g��v
��C�l673c������)�`dhX$���Uy���k�!����Xe/�r�0�����u��m:���B�%WWW����op������}�c�l��w�`F�vXw)���U���8��jL#Sy��BQ���2���3B�!E��p�n���	b���g��C�-{lF���j���9�RX�'R�p����++:Se(�]����a3�Zv ��M)��;�X�d��) �v�-��lm]���0��I�3����@Xsj�fgu8[W�������;�2#CW���w�cL�!�������"�������QVk%�w9��RV+���b���sg���d.;�w�m��=>#�C���v���Y���m�8�K$�\U��9M����)F��\�	w�;D�dN����'���khd�����~2�f$r4a��a���l_�d���;nc��w����i��bN~�):���o�QVV��������={
_��cG�3)M��<�0`��c�8YT+�����/��P��QL@��G���!����E�\E�.]�\�r��e
_�������I�&y{{�X�b����
��/_N�w�����B%5��I��x�I�`R
���t�I�-,,jo��V��h�b��-�X�:///
Y����9j��i��Q������,X@a�������������@
_(p�X@c&��s'�;r�H�axx��������.]�D�5�pW/)4k�YJ*+
�L������v��1i�$�D��Dj�>���T2=<<�����K�*/�1��,�R����:f'qS�)�_�
�A% ��������$r��[7q+�����N��RiRR��[���Pdd$K���l���S�N�n@K"@�{�>|��<}�tq��
� ��_��M<�Z��������!!!�n@K�x������c�������j� �g�h�������������������Gbb�k��fkk{������{{{��	Q�yzz��'N�x�"�S~~~���3g�k+�������i����dgg��	-�M�2������["�dff���L�6���<E"@���9r���G���)
���wZ�����D�@,���0�J8��YBO�36���4D�@YYY���b����O�(KX7����C�Z ZdggWRR"Vm����3:}���|��0x��I����Gk|���[bm@{�@t�^�=@�.���J�"�l���ik�
����U<M���?��"=�C�;,
�hPhh����5>��_?���=��q��U��
�g�h��/j1277�H$b��pX����P���i�@-[�T������
�����JC`����u#4[�������pj�2e���nNm�w�T�Xaaaddd``�?��#�V�V�:�'��MJxv~n���nM�-
V�111y�����}�6 
��o��V%'66v���/���X�E-�trrr�N�>�����@
�V���_����#G����IVVVHH���{5j4e��E�Q��(311���!<<\���4P�,**�8q����T*���400��!]@@����)���j[m@�/3f���y-����:233�{�����G�E������#BCC���(L�������L�
k��i�F=366�y����-�<y�����RVVF��+W"�����CMKK����u����I���/\�@������}��6l��-[.\�^�^����������C�&$$P�z�jwww�Y�����>������*'��w���W�Z���?L�<y��YW�\qssce\]]������X@"��gzzz���/..633KII�mEFF���SNhh("!���V�����^z����6*�edd��y���.11��������9//��������r���X@cf�=��];m������������K�.Z�h����������������Z%rt����'�;w�����|���H'''q�Blmm)j�2e
�;v�8n��={����Q���dff��eaa�^@c�����C��_�����&M�4(00�O�>�������`����Vi!��_��:Y>�n�f�����n�Lgggs6��MDGR����>!�>|h��H*��������!��^����o�������i�Z�?L�U��r�+,,n�k�������jo���
��)�iS��|B*�.u�`����C�&$<`d!�2�n:{�����������	���L�I����J
�3%]P��H)���2e�DC��RvT.�H/��F���|[��!(��2��=��&��x�S�2����������[^��F���P�(wA��/JT���6v�fK����pd&$$���#�(�S�]:RvV��+����X�a�O���q�U��P����k�H�A-d{(����i�jiv�6�����c3"-��Y?��e�&'�c�����a} �\yfy?g)�K����-?����gDy�`���w��������`3BH��`�R���G._�Tf����!,�{�����
G���G;R�!k��l�kj��'4���3B��\����dv�*8����'s�w�*RW'sY':�OO��Q���`�+j)�'��9
�(�����5k��7��N~k������Y���Q$Ai===N>|{��)|��3)M��|$
0���c���J������K#�����1��uW9�������*���}��*�#���r7����?�(�R��7���\���l�����V�k|���$W>Hl����>���.O�*GGG���g�q����A�����)������a��~�f�l��LF����L�)�v��}�?�Vq�
�
�����C����[�:�@Y����d ����S�I�B"��Le��W6��SNjX1';���X��G���X��f��>��RaN^�P~��;DY���v���Z~ ���l����m�WQ���S��<CCCN�>))�*���]�B]��^^^�{�D������	|�=mW�py?���as33�*;[�{��
F��E��ZZ��]�v2P9���U��-�d�X���:��6���uH!k����+�^��78y�fE��>�1[6t�;A0#h����Z�n�����
�|A5���<������ja�r��!��"Y�q����Mq�8A@�|U���u��e��{{V-���0�k*V���#�y��g3������K��=�!lFX���CX�)eqG����4E3�N���A��-�����ga.�zg���������7A����p��
���I������]�3�
�U�1A���_6#�����/+FSFY��l���GJY�`FP���fD���Y�V~2��'s�vi�b�Vp2���d.����Juu2�w���Q;�S
����������!��
������a�����i33�3f��@�(Z�jE������-[v����[���������X�b���G�9|��������;\\\(��X����W�(s��%|�R
���t�����_��Qd�����$%%5j�H�M0��������d���������� zHa����O�����$�/�<�4f��;w���������O�����t��Z�)x
D�.\��g���{������'O��������E��{��dzxx�={V%���K���I^�c�������^9
�����RSS�����Y���(�&tGQ~�����������:m@�!���[�j���o�^�*y��[�Z>mme�@,"@���[�x��[��_����n@"@��O����M___���"r��Y��c��['��D�����w�^???q���PtttDD�����oP� x�����O�x�yxx�[!���� �g�hPTT��#���.V��A���7�<q���9s<==U�j���X[��h���������������e������9r��;���6�|4�dee=x��I�&�_xF�]�|y������333���������trrw+�9
���111�h��5�'O����[���Pjj*E<|���l���~����������Qrr���3�0))�Q�F�n@K"@.����s�=ggg�����'O�����n@K"@�z�:p�@jj�����5k������[`�Z�z���E�@,�c��s����('''))I*�:;;K$���@��EFF._����E__?99y��Q����D�
@���;w�g�����}���|___@�L-Z�pa��-?��S77����������_�z���N�M�B�h��������/�������#z8x�`�6 
1�5j�>���7n���/{��!b�b3*))����9s��	f����e�O>����V�MhO�h������666���YYY����
			k+�-:q����tnn��Q�����"&�&D!ZTTT���_�i������������LSS��?�X�M�B����~��e��S�

������/�Us���������z�jzx��������D����q�����X@=����'K����H�g����(�����wPD�����������f�����ZF�J-�0�����������X�M�6�������7_�l�������?d����2J�\��@}W����������o��s�������S�o����
��e���Yy�(��������L9�oBB@�W�vww���_��*��@��O��{��m���+W��������qqq��h, �H�3===KJJ�aqq���YJJ��U�"##���)'44�@�U��i������...,'//����=���r�/�X@cf�=��]K����			Y�t��E�f����}{??������9�E�5��sgJJ��?�,�������b333---�,�1������C����ORRR�&M
��OSS������J�WEGG���r����:Y~FF�����dd�)������%
Y���d����>!�>|h��H)^��������!��^e��o�f������i	W��t�C�y���	F��Zs*������7���%%�F��e���{��
�K��99�|���U���������yy��k`
��,?�l����]L�d�T�1�l��P9S�����b��,S�!J4��-eG��A���h����%��L� ����Yi��x�S�2����������[^��F���P�(wA��/J�/�������/�Q�hl������������dN�v�H�Y���pF��Oc�����d���������i�J�f3�Z��P8#��5�,`���Pm��3����fDZK�~�9��MN��
������@82����~�Rn�:�U[~|Ym������� ,�w�^c�K�]+/�f����:\���G�&\����A�3BX���yE�L+y�<v�3B�`#��
;$66�� �5�Oh<�g�'����dN�n�B�C��d.�A��	��\x jz2��bE��#��d^�5��y3�%m����_��I���QVV������/����;���Ii���#i�����dU�L___*����_��������'���
wW��DB�����H$���
>mee�=��R���l�_�������s��!��������I�|��X[q)|����c���9::�jW����Ov���������s����a�l��LF����lkk���}m������F��y�lh�.�ye����)PVki�8P�����=��T,$�~�T&�|e�l9���s�����5[|�B�U�m��S�/���
���C�U��z���o������w���M�a��[��lm�[��C�R������$��w�F��������~�7S���L{�����~(�-��ff�Uv�v�8E�
�����*=�v�:d�r��%[N���|�u��m:���B�%WWW����op������}�c�l��w�`F�vXw)�n��U���8��jL#Sy��BQ���2���3B�!E�D���Y���vq��X���!�y�����Z���aN�T���G�����f��f�}�(+{�C����E��jS����(�'Ymi�f��r�3�[[�C�����\6&��$s��a��o�Q���l]VK���m�9�!�g��c�)��lFd�q�_V4����Z+�8��=~R�jp������3���O��!�������DR?*���\�	w�;D�dN5�jkz2/��F���+��'�j�A�8b��?����[�W�...622Z�b���S�9r������S�;v���P�����^����W�(s��%|�R
���t���O{�@$�5����������PX�q�F'''�����39�m����#�������O���[�ti���!@~�!K{xx�={V���K�*/�1��,�zyy���@�� �'�t �9�@� ��t �9�@� ��t �9�@� ��t �9�@� ��t �9�@� ��t �9�@� ��t �9�@� ��t �9�@� ��t �9�8����3gNRR�����Y�f��A�.\		ILLtpp7n���4P�,**�8q����T*���400�b����O������ ��eff����^���W_���������g�����1"444((��???OOOWWW�*
k��i�F=366�y����-�<y�����RVVF��+W"����k���#�E(��������[bbb^^���Ipp0e���w��a[�lY�p!{ULL�zJ�g���;;;S����@[���i���x�k��q�	&�����~|||���)be\]]������r��z�D�����YRRB������h�V�����������PDB�W}
����o:4<<�m���;@�)
\(GXXc��=z�X�v��i�bbb���BBB�.]�h����g�o����/>>^X3�^*
�>��������I3����H7R����9J����l999lwX���9(��E�ffe�*�?|�9�W�.��655�O�HK��W��*�y���	F��Zs*������7���%%�F��e���{��
�K��99�|����U�����Ae���a�5��eff	6��������,�
7��-�*gJ��Z��Rl7�e�:D���C����r���@zy
4B����4LP�Id�={6+��r�Yf�`��~���|�v�������.����Ei���v��������R�����+�			�{�*J��o�������
g�l�4�m�M(N6�n�jY��v�i6#��l�3�XY3�V-��f=>#��~lF���4�������{����9��#�+�,��,�v�CX����������(/�,�{��51������lFi���U�=z�h�������8#�a/��WT������cGJ0#d
6����CbccM
�Y������pF�q2/��O����-T:��N��Nt������'s�)V�,<RO��Q������3f�����AY�iC#������3}}}i��}||����4i2h�����>}����������{����pCt(�p�UN>!mll����$-�UvD"���n�i+++~�	�2ggg�������dE���9�������616��k�".�����{,�sttd��>�����
�G��ME
��3Y�r�v�����������U���>�E+

��G�����]�!��d�-aR����Rq2�g�����N*Y?d*\��a��r�P��9�!���f���@(�j����}�����������QVAG�wG�]36��Ba���M�a��[��lm�[��C�R������$��w�Fu)K{yy���%n�fs?&����]E���P*[�������l��q�6��kiUzt��u�@�0�:V�K��2�
c�6�[�t�?�!��J����{M7���A�����l��-�������Rj��5���?7p���F������6#��e�
g��C�d����j7�����U�3B�!��=6#��Y�����N)���G�����f����2��.QV�X��a-;�a�����Q�O���
�;��g
���.]�Y������d�wv ����M�!j3�:����j�t����S����qFP���1&�����fDV^��eE�h�(��������'U��������;����d.�b��m�8�K$���R]����p��C�N�T���'���khd�����~2�fT��3g����/����s:v�QVV��������={
_����LJS&'�p��1N�J������K!?�/�5���;v��u�X�C������V�X1u��#G�>|x�����c�
t4��Y��x��d�>���������[XX<�}���h���7n�6l��2e�W_}�`�
k6n����DO���R�B���3���;���#G�����O�����t����� ���=���L=�������*��.]����L��{�����Z}
�j�@�s��A:�@�s��A:�@�s��A:�@�s��A:�@�s��A:�@�s��A:�@�s��A:�@�s��A:���]�p!$$$11���!<<|��q�)��YTT4q�Dccc�Ti``@����N�>M�u�o �Q�2b������� 
S���<==]]]+/��M��������/[�l������2dHYY�W�\����kPPLL���Ipp0����;l��-[�,\����P����wvv��7!!����W��������vD���+W���������qqqU�H$�����%%%�������,%%e��U��������H��jPP^^���	{H��TY@cf�=��];m������������K�.Z�h��������������=3G�,|$�����r3��M8�^|rx�R>a��F�"�����R�(+�2�>�����U��`�{��hg��+PVk��s��'_t1�+)�����p�"P3�3h�LQ�JY����vtw'{JX�r��j8�>|��2���J�[�-QT���U�dxpA~&%�7ub����������J�Rm%�C�b��,�$^�0���-StB�VN�j[|��G_Y�Y��j{�9���O725)���[p�.��������a�f�9���z��UV��w�K���:��g�J�l9Oy��qF|����p��|��x�������U�Re��]z56Pt����h�`��5�h�ul�(-�����>��E��MKm��y�ie��������y;>A���X�q������\�BY���.�)��D���M���R�mm�f-����m������<�sW>����|N��2��]�y��@1���-��gC�s�^��)��2�d
�lZ������n�����g�����D�*1��T�k���$;�M��\���&�9E7�a�ea<�@�7�a����bY��Z�b>��sKK��Re��������ld>6#ZZ�PV��7)'�%�m��j}:�*+S������s(�3���u�\E�
fD[�W�t�D	�F�'���M�g���%?cfDG�23OE�(g�q�%�j�{��d������k.�0#d-3���qF:8�i�{>!�f�9�����fD3I�V���fD�~Gk�ald��mn���Y(J[�s�/��Qj<��bg��mI����pm�������pF�p2��'s3	��AQ�8��s����dn����v'������"Y��CW���:Tdaa����fffZZZVY@c�����C��_����&M�4(00�O�>�������`����Vi����Gz����%���R&dg>�;JE��`�6��'�S��&�q�M�[�QV{S�����f:�HY�.s���������K?V-��6M��Z��X�Y���d>���#gS��|�PP�^N9Ei����Z.����A����ys�j9A�G9������bk��QO+�5��Y?h����Y:VRm�u���r�Z}A�=r\�����Us;�
A�
��V���Ry�X�q�$�*��r��������j�c,v�z�I	)��J���A����
�V1t�������wZ��KR����k�����q�,wC������Fg��C���?9�cL0#Z*B���Z������������4���!}�a�gkU��=����[+<V�b����1f�������z����S'��W{��������gW>�?#�9��!�$@���?�^�����O���z2��'���8���j��d�U��-} ��\9t�{#c�������;FDD�����=������g�4fR�2�ajj���;Fi�T�L__�������������~U[{5�ZT[���^�����jk�����:�T���mdd�b���S�9r������/��;v���P��������W�(s��%�,�����[�nM�-,,*h<�TDqITTTPP��(���q�������R�RQ��d�������#�������O���[�ti���A@�������*��.]����L��{�����ZC����V��mh��������Z���jF���>V[{5�m��@� ��t �9���?�0{������S��UgLL��9s������g��5c��j����y��]�fkkK��2e�X5���,ww��C��^�Z�
��������?�t��A�j��!!!{��m�����E���s�����gKJJ���+Wj_�����������O�>�Z�}����#4���?����2D�
�'������������q���RmE�ZV+��S�V�W��j9���k���,��S�V�I��ZQ&�z��O:��T��V���r�i�V��
P��������S'��������3�����������g��}�����;w����+[�n��w��yooo��G�U��zf��ill,Vm���������o���Xu����������K��5j���U��RTIaa!�~��Q�n���i�R.''�j������III���35�O�>ZV���:b��u���=z��=t>j��Y�����D(**�M����>}�����������J�SmE�ZV+��S�V�W��j3���k�il���N�ZQ&�z��L:�j��tGi�����h
~-'��j;v�(��������[t�|}}E��f2]��3�&������@eee����e����.!!A���?��v����t��B�?�����(�1iiiQQQ�n�211i��5]<�[?����hbk������x�1�[�l����}�'O�l����)M����k������>�:�z��=J��6l��-[.\�e�ejY�(�N�ZQf\E����S�V��^�(����^�I�^�(�N�Z�'��Q�����D�h�k9�4V���,��������VQ����	�4]�������z��_������^x�Qj����>}�����m�&J�|����t~?~������i�D���.;�7o�j�������`����f���Z����4����E��N�t�H�J���v&''{{{k_--�����������W��P}"\�r��n�!]��*�}�ejY�(�N�ZQf����~��W+��S�Y�IW�q�f��W+��S�V�I�q�FGGk9�*�ZN4�������a�Y=t������m��X��M�^�u[[�5k��	Z�:�\������C��x����N:������s�����:|�p-������7���h��"�����E	]6��f��_������(�5j�h��u#G��:ujzz�'�|"J'��2��_~�e����O��������������P�N�g�I''���R'Z-�8�q[������3f���,^�����������9��J����;wR,O�v"4N�u��?��#�����o������!:_��<w��q��q{���\����v����G������K-��wo��}��1h� :ijw-;v�������3X��E�3YYY�aff������]-M:�q&��X�Ne��5�ji�k�V�m!jh��9C�J�V������^�|����t�544���������?�?o��9))��i*�����C�iY����o����{w���G���L�:	]z�E���9'_���H�jy�����x�t���6m�����Y�����������[1�t���� "Z�"""�{����alllm|^,���t�q<L:���N}��2�ji��X���B������c��['�X�����_��l���w��uJ���������?��c:���5�����N=����3����7m��}�v��m��������l��k��m��U�+�'Nt��M��8�Y���+���i����9i�$������������]5:T�j����i�[�b���S�9B���������ji�a��0�81&��Q��D����������!�J������G���-((H��~��{��7��O�2������Z��O�o���y��]+++:5��x6Qk�3��C���5����/�R3M���@{{{�D�`�����R-'�`�i��b�F���h�����w��Q��M��ZKK�%K��7.##�����?�055�qmM���(JP�e���������N�ZN:�����h9�*�-g\-�d*�V�WQ�ZN�J�A�IWQ�ZN����r�U�4h9�4V�t�R-��j�{�9�W7@u�����
��F�]VV&z���r�T9���E���Z��E��Z�a���|KN�j_����&������gE�V�IWQ�ZN����rWy�������VR�����~�f�UT�����j��t-
ZN����r�UT��� �9�@� ��t �9�@� ��t �9�@� ��t �9�@� ��t �9�@� ��t �9�@� ��D��U��_����������~�z�6m���

5�@���[��SL������2������vK�)�lN��!���3�yj�e��wi��K����v��
�5�o����N�����k|6<<���>�2e
�+fCj�NZ�[��������7����t��-���[��Qy�jV��z�CC���+E�M������^������!�a
��q7%��c���o��i���S���n��W(R��f�i{�T�i����������O����9o�����_7����C�U�Vm�����;��u��aC5�U�,�=��_OW������
;���o�9a��:���9}���Y����MLL���7~��5k��\����FFF?�����~�����ow����/���cu�������o������x�b����XG��,Z�&��e��!!!,e�� Tog��Wm��^�dI�F�\VV�g�����#�������������G��3gNVV������3�]�������_x�:X[�l�z����s

(���c����]���%Z�
���������v��>|�m��OTL����Y���={����hy�4i�S�?meff:���Q�F�����w���KPP���;�-[8������ZE���������������;���z�����t=�4�E�!Ja�z;) ����b�D;y�$�]TT���~�Up�(uuu]�t���?F#F����b�[�nQGu�c��z��S__�\tt4�����9rd���,@�@u��7��---����
O}u�N1�g������B�e��H��������C���t��4���a��m�F����k���bbb���{�����.XXX��B����7����N�n���_�}�]N�f�Z��Q#ss���We�5��Y}RW�=J��8����y��\����
4n���[�hA!E9������u�������[qqq@@����i�$4P���YYY�	���J5�tY�b*��E����C�S'''q��tP����O���G��D�f����?DFF
��]�����O�J���t��-��Q�j		�������
������D�X�=����*>@��������|Z8\)f�
��J��� ���������C���/t=��}���X�|���kW``��Y�~����������Kd�,�K'���Z�����-��!�H$����!�>\5v�i����<���O7��
�,@�0���'^�S�N���/))��������v����K/�����9��w�qww��7�����_~�K�.��og��k��]�x1-�{�����o������t��vv����5�)������W��=���EAgZZW�8p ��{������Itt�o��Vw;:
����U��M��m-M�f3���#""��jkk��s�g������LS�#kkkZf��5}����R�Z�?���V�Z�7�
�Y��2i����7�+�1c��1"55���Bt��igM����6��&�wEc;E�J�i)q�2�U�74h��NNN_�5��������>�J�U��D"���z���f��ahh��'��������A"�7��Wy:i�_�m��)��,9~�8��3�Y��g�����|z��
�;�	��V�T���O�:%�	gi~9�~�:'��;$$�=��3��d�����v��5D��Y��}1�:���S����			,���}��9���>�Y'WW������@�A������e�_~���������o��������p��@��:@�0����_�~��Y�������6mjx_��C
���n�S"��tT�@�s��A:���_q���T�o����Us�/������S��X�.<<���>�2e
�+fC�_���M���bCC
3�={���J�=�+�2��8I�/���z
��LL�O��Ph���������D���h�0I@d�n9����W~Y����5�p��M�}�]E�SZZ�'W�:�;��}��M?.��e��w�V�fT�X5����e�
��+�*�:J,�������k��Oz��im����TO��Y�
�	���q��%�5<x0������g�����nbb2o������92))���_||���~z���9s�dee�����1���k����/����w�����/��e���W���[PP@�7n����;v,���+��luIII���i������U�6n�x���n��m������b�n����u��M�Y�f���.\022��~���/^�}�v�N�����;vPw�����n��������n��[����A�e�N�'O����{TT���~K����C��ec��Q���=��KZ'\]]�.]���Og�#F��Dk��[����I.???77�������/,,������?�����������#��o_�`�p��UT�s������v��>|�m���)F�Qo?5�!u��M���s��e����������iq������H���v����k�6�M���Y�� �t!Ngd�oS��������C��������tB6l��m��gg*��qcZ�(��EZ�h��Kgz�������.��_777�����Q��_}��w9��E+P�F������W���7�x�����tvv����Ec�������:��M�]����+&&&88�G��%�O��$���U��nQ��z7D�/@P�JW��I�����{�����899��t�:z�c�.g����|Z�g.h]��R[��J��xE�TsHH������YYY�	}}}���)Ve�k�Y���6��Y����������������	kkkZ���P3
�[����A�H$���_���2�K���������
 ^��Mi
c<x@���QT��x�:��MS��]�g����/�������j����,|��}8t����M���������g�������!--�2�{���^z)//o������N��]��H���{�����9::���~���PUe�k�Y�(��vww��7�����_~�K�.��og�+�]�v�����={�|��7���C���N-�(@��D���{�����m?������_�z���?|�pZ��R���5�It�<}�������Z6�5�uTT�{��7c�CC�O>�������������\��W�f�!�H����ZGi��G}��U�q��Q�5k�P&��/��ys*���>f��#F���V�E�V./>��s���B�<C�aC"�8�����;r*��{�>u��JfBBK{{{�;wN�l��M����i��wuu-,,��1���r��q>�gVYLc�+�J�j{�:J����������_��_�N����hlCE^�7�����{�R'C�aC���u]7�[��@� �	?B���@:���$^K=`K�IEND�B`�
#112Andreas Karlsson
andreas@proxel.se
In reply to: Pierre Ducroquet (#105)
Re: JIT compiling with LLVM v9.1

On 02/02/2018 10:48 AM, Pierre Ducroquet wrote:

I have successfully built the JIT branch against LLVM 4.0.1 on Debian testing.
This is not enough for Debian stable (LLVM 3.9 is the latest available there),
but it's a first step.
I've split the patch in four files. The first three fix the build issues, the
last one fixes a runtime issue.
I think they are small enough to not be a burden for you in your developments.
But if you don't want to carry these ifdefs right now, I maintain them in a
branch on a personal git and rebase as frequently as I can.

I tested these patches and while the code built for me and passed the
test suite on Debian testing I have a weird bug where the very first
query fails to JIT while the rest work as they should. I think I need to
dig into LLVM's codebase to see what it is, but can you reproduce this
bug at your machine?

Code to reproduce:

SET jit_expressions = true;
SET jit_above_cost = 0;
SELECT 1;
SELECT 1;

Output:

postgres=# SELECT 1;
ERROR: failed to jit module
postgres=# SELECT 1;
?column?
----------
1
(1 row)

Config:

Version: You patches applied on top of
302b7a284d30fb0e00eb5f0163aa933d4d9bea10
OS: Debian testing
llvm/clang: 4.0.1-8

Andreas

#113Pierre Ducroquet
p.psql@pinaraf.info
In reply to: Andreas Karlsson (#112)
Re: JIT compiling with LLVM v9.1

On Sunday, February 4, 2018 12:45:50 AM CET Andreas Karlsson wrote:

On 02/02/2018 10:48 AM, Pierre Ducroquet wrote:

I have successfully built the JIT branch against LLVM 4.0.1 on Debian
testing. This is not enough for Debian stable (LLVM 3.9 is the latest
available there), but it's a first step.
I've split the patch in four files. The first three fix the build issues,
the last one fixes a runtime issue.
I think they are small enough to not be a burden for you in your
developments. But if you don't want to carry these ifdefs right now, I
maintain them in a branch on a personal git and rebase as frequently as I
can.

I tested these patches and while the code built for me and passed the
test suite on Debian testing I have a weird bug where the very first
query fails to JIT while the rest work as they should. I think I need to
dig into LLVM's codebase to see what it is, but can you reproduce this
bug at your machine?

Code to reproduce:

SET jit_expressions = true;
SET jit_above_cost = 0;
SELECT 1;
SELECT 1;

Output:

postgres=# SELECT 1;
ERROR: failed to jit module
postgres=# SELECT 1;
?column?
----------
1
(1 row)

Config:

Version: You patches applied on top of
302b7a284d30fb0e00eb5f0163aa933d4d9bea10
OS: Debian testing
llvm/clang: 4.0.1-8

Andreas

Hi

Indeed, thanks for reporting this. I scripted the testing but failed to see
it, I forgot to set on_error_stop.
I will look into this and fix it.

Thanks

Pierre

#114Pierre Ducroquet
pierre.ducroquet@people-doc.com
In reply to: Andreas Karlsson (#112)
6 attachment(s)
Re: JIT compiling with LLVM v9.1

On Sunday, February 4, 2018 12:45:50 AM CET Andreas Karlsson wrote:

On 02/02/2018 10:48 AM, Pierre Ducroquet wrote:

I have successfully built the JIT branch against LLVM 4.0.1 on Debian
testing. This is not enough for Debian stable (LLVM 3.9 is the latest
available there), but it's a first step.
I've split the patch in four files. The first three fix the build issues,
the last one fixes a runtime issue.
I think they are small enough to not be a burden for you in your
developments. But if you don't want to carry these ifdefs right now, I
maintain them in a branch on a personal git and rebase as frequently as I
can.

I tested these patches and while the code built for me and passed the
test suite on Debian testing I have a weird bug where the very first
query fails to JIT while the rest work as they should. I think I need to
dig into LLVM's codebase to see what it is, but can you reproduce this
bug at your machine?

Code to reproduce:

SET jit_expressions = true;
SET jit_above_cost = 0;
SELECT 1;
SELECT 1;

Output:

postgres=# SELECT 1;
ERROR: failed to jit module
postgres=# SELECT 1;
?column?
----------
1
(1 row)

Config:

Version: You patches applied on top of
302b7a284d30fb0e00eb5f0163aa933d4d9bea10
OS: Debian testing
llvm/clang: 4.0.1-8

Andreas

I have fixed the patches, I was wrong on 'guessing' the migration of the API
for one function.
I have rebuilt the whole patch set. It is still based on 302b7a284d and has
been tested with both LLVM 3.9 and 4.0 on Debian testing.

Thanks for your feedback !

Attachments:

0001-Add-support-for-LLVM4-in-llvmjit.c.patchtext/x-patch; charset=UTF-8; name=0001-Add-support-for-LLVM4-in-llvmjit.c.patchDownload
From ebf577fc6b1e74ddb2f6b9aef1c2632ab807dd70 Mon Sep 17 00:00:00 2001
From: Pierre <pierre.ducroquet@people-doc.com>
Date: Fri, 2 Feb 2018 09:11:55 +0100
Subject: [PATCH 1/6] Add support for LLVM4 in llvmjit.c

---
 src/backend/lib/llvmjit.c | 21 ++++++++++++++++++---
 1 file changed, 18 insertions(+), 3 deletions(-)

diff --git a/src/backend/lib/llvmjit.c b/src/backend/lib/llvmjit.c
index 8e5ba94c98..046cd53ef3 100644
--- a/src/backend/lib/llvmjit.c
+++ b/src/backend/lib/llvmjit.c
@@ -230,12 +230,19 @@ llvm_get_function(LLVMJitContext *context, const char *funcname)
 
 		addr = 0;
 		if (LLVMOrcGetSymbolAddressIn(handle->stack, &addr, handle->orc_handle, mangled))
-			elog(ERROR, "failed to lookup symbol");
+			elog(ERROR, "failed to lookup symbol %s", mangled);
 		if (addr)
 			return (void *) addr;
 	}
 #endif
 
+#if LLVM_VERSION_MAJOR < 5
+	if ((addr = LLVMOrcGetSymbolAddress(llvm_opt0_orc, mangled)))
+		return (void *) addr;
+	if ((addr = LLVMOrcGetSymbolAddress(llvm_opt3_orc, mangled)))
+		return (void *) addr;
+	elog(ERROR, "failed to lookup symbol %s for %s", mangled, funcname);
+#else
 	if (LLVMOrcGetSymbolAddress(llvm_opt0_orc, &addr, mangled))
 		elog(ERROR, "failed to lookup symbol");
 	if (addr)
@@ -244,7 +251,7 @@ llvm_get_function(LLVMJitContext *context, const char *funcname)
 		elog(ERROR, "failed to lookup symbol");
 	if (addr)
 		return (void *) addr;
-
+#endif
 	elog(ERROR, "failed to JIT: %s", funcname);
 
 	return NULL;
@@ -380,11 +387,18 @@ llvm_compile_module(LLVMJitContext *context)
 	 * faster instruction selection mechanism is used.
 	 */
 	{
-		LLVMSharedModuleRef smod;
 		instr_time tb, ta;
 
 		/* emit the code */
 		INSTR_TIME_SET_CURRENT(ta);
+#if LLVM_VERSION_MAJOR < 5
+		orc_handle = LLVMOrcAddEagerlyCompiledIR(compile_orc, context->module,
+							 llvm_resolve_symbol, NULL);
+		// It seems there is no error return from that function in LLVM < 5.
+#else
+		LLVMSharedModuleRef smod;
+
+		LLVMSharedModuleRef smod;
 		smod = LLVMOrcMakeSharedModule(context->module);
 		if (LLVMOrcAddEagerlyCompiledIR(compile_orc, &orc_handle, smod,
 										llvm_resolve_symbol, NULL))
@@ -392,6 +406,7 @@ llvm_compile_module(LLVMJitContext *context)
 			elog(ERROR, "failed to jit module");
 		}
 		LLVMOrcDisposeSharedModuleRef(smod);
+#endif
 		INSTR_TIME_SET_CURRENT(tb);
 		INSTR_TIME_SUBTRACT(tb, ta);
 		ereport(DEBUG1, (errmsg("time to emit: %.3fs",
-- 
2.15.1

0002-Add-LLVM4-support-in-llvmjit_error.cpp.patchtext/x-patch; charset=UTF-8; name=0002-Add-LLVM4-support-in-llvmjit_error.cpp.patchDownload
From f90c156c9b26eda38d3a1312c3de87ffba50340a Mon Sep 17 00:00:00 2001
From: Pierre <pierre.ducroquet@people-doc.com>
Date: Fri, 2 Feb 2018 09:13:40 +0100
Subject: [PATCH 2/6] Add LLVM4 support in llvmjit_error.cpp

---
 src/backend/lib/llvmjit_error.cpp | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/src/backend/lib/llvmjit_error.cpp b/src/backend/lib/llvmjit_error.cpp
index 70cecd114b..04e51b2a31 100644
--- a/src/backend/lib/llvmjit_error.cpp
+++ b/src/backend/lib/llvmjit_error.cpp
@@ -56,7 +56,9 @@ llvm_enter_fatal_on_oom(void)
 	if (fatal_new_handler_depth == 0)
 	{
 		old_new_handler = std::set_new_handler(fatal_system_new_handler);
+#if LLVM_VERSION_MAJOR > 4
 		llvm::install_bad_alloc_error_handler(fatal_llvm_new_handler);
+#endif
 		llvm::install_fatal_error_handler(fatal_llvm_error_handler);
 	}
 	fatal_new_handler_depth++;
@@ -72,7 +74,9 @@ llvm_leave_fatal_on_oom(void)
 	if (fatal_new_handler_depth == 0)
 	{
 		std::set_new_handler(old_new_handler);
+#if LLVM_VERSION_MAJOR > 4
 		llvm::remove_bad_alloc_error_handler();
+#endif
 		llvm::remove_fatal_error_handler();
 	}
 }
@@ -87,7 +91,9 @@ llvm_reset_fatal_on_oom(void)
 	if (fatal_new_handler_depth != 0)
 	{
 		std::set_new_handler(old_new_handler);
+#if LLVM_VERSION_MAJOR > 4
 		llvm::remove_bad_alloc_error_handler();
+#endif
 		llvm::remove_fatal_error_handler();
 	}
 	fatal_new_handler_depth = 0;
-- 
2.15.1

0003-Add-LLVM4-support-in-llvmjit_inline.cpp.patchtext/x-patch; charset=UTF-8; name=0003-Add-LLVM4-support-in-llvmjit_inline.cpp.patchDownload
From 5d1270b25a80e8a25097916381f8abe67432c51f Mon Sep 17 00:00:00 2001
From: Pierre <pierre.ducroquet@people-doc.com>
Date: Fri, 2 Feb 2018 09:23:56 +0100
Subject: [PATCH 3/6] Add LLVM4 support in llvmjit_inline.cpp

---
 src/backend/lib/llvmjit_inline.cpp | 36 ++++++++++++++++++++++++++++++++++--
 1 file changed, 34 insertions(+), 2 deletions(-)

diff --git a/src/backend/lib/llvmjit_inline.cpp b/src/backend/lib/llvmjit_inline.cpp
index 151198547a..8a747cbfc0 100644
--- a/src/backend/lib/llvmjit_inline.cpp
+++ b/src/backend/lib/llvmjit_inline.cpp
@@ -100,6 +100,13 @@ llvm_inline(LLVMModuleRef M)
 	llvm_execute_inline_plan(mod, globalsToInline.get());
 }
 
+#if LLVM_VERSION_MAJOR < 5
+bool operator!(const llvm::ValueInfo &vi) {
+	return !(  (vi.Kind == llvm::ValueInfo::VI_GUID && vi.TheValue.Id)
+		|| (vi.Kind == llvm::ValueInfo::VI_Value && vi.TheValue.GV));
+}
+#endif
+
 /*
  * Build information necessary for inlining external function references in
  * mod.
@@ -146,7 +153,14 @@ llvm_build_inline_plan(llvm::Module *mod)
 		if (threshold == -1)
 			continue;
 
+#if LLVM_VERSION_MAJOR > 4
 		llvm::ValueInfo funcVI = llvm_index->getValueInfo(funcGUID);
+#else
+		const llvm::const_gvsummary_iterator &I = llvm_index->findGlobalValueSummaryList(funcGUID);
+		if (I == llvm_index->end())
+			continue;
+		llvm::ValueInfo funcVI = llvm::ValueInfo(I->first);
+#endif
 
 		/* if index doesn't know function, we don't have a body, continue */
 		if (!funcVI)
@@ -157,7 +171,12 @@ llvm_build_inline_plan(llvm::Module *mod)
 		 * look up module(s), check if function actually is defined (there
 		 * could be hash conflicts).
 		 */
+#if LLVM_VERSION_MAJOR > 4
 		for (const auto &gvs : funcVI.getSummaryList())
+#else
+		auto it_gvs = llvm_index->findGlobalValueSummaryList(funcVI.getGUID());
+		for (const auto &gvs: it_gvs->second)
+#endif
 		{
 			const llvm::FunctionSummary *fs;
 			llvm::StringRef modPath = gvs->modulePath();
@@ -318,9 +337,14 @@ llvm_execute_inline_plan(llvm::Module *mod, ImportMapTy *globalsToInline)
 
 		}
 
+#if LLVM_VERSION_MAJOR > 4
+#define IRMOVE_PARAMS , /*IsPerformingImport=*/false
+#else
+#define IRMOVE_PARAMS , /*LinkModuleInlineAsm=*/false, /*IsPerformingImport=*/false
+#endif
 		if (Mover.move(std::move(importMod), GlobalsToImport.getArrayRef(),
-					   [](llvm::GlobalValue &, llvm::IRMover::ValueAdder) {},
-					   /*IsPerformingImport=*/false))
+					   [](llvm::GlobalValue &, llvm::IRMover::ValueAdder) {}
+					   IRMOVE_PARAMS))
 			elog(ERROR, "function import failed with linker error");
 	}
 }
@@ -619,9 +643,17 @@ llvm_load_index(void)
 				elog(ERROR, "failed to open %s: %s", subpath,
 					 EC.message().c_str());
 			llvm::MemoryBufferRef ref(*MBOrErr.get().get());
+#if LLVM_VERSION_MAJOR > 4
 			llvm::Error e = llvm::readModuleSummaryIndex(ref, *index, 0);
 			if (e)
 				elog(ERROR, "could not load summary at %s", subpath);
+#else
+			std::unique_ptr<llvm::ModuleSummaryIndex> subindex = std::move(llvm::getModuleSummaryIndex(ref).get());
+			if (!subindex)
+				elog(ERROR, "could not load summary at %s", subpath);
+			else
+				index->mergeFrom(std::move(subindex), 0);
+#endif
 		}
 	}
 
-- 
2.15.1

0004-Don-t-emit-bitcode-depending-on-an-LLVM-5-function.patchtext/x-patch; charset=UTF-8; name=0004-Don-t-emit-bitcode-depending-on-an-LLVM-5-function.patchDownload
From db4d0a862f0fbf0f802bc6f83f42831240a0dc53 Mon Sep 17 00:00:00 2001
From: Pierre <pierre.ducroquet@people-doc.com>
Date: Fri, 2 Feb 2018 10:34:09 +0100
Subject: [PATCH 4/6] Don't emit bitcode depending on an LLVM 5+ function

---
 src/backend/executor/execExprCompile.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/backend/executor/execExprCompile.c b/src/backend/executor/execExprCompile.c
index 4d6304f748..d129ea7828 100644
--- a/src/backend/executor/execExprCompile.c
+++ b/src/backend/executor/execExprCompile.c
@@ -173,7 +173,11 @@ get_LifetimeEnd(LLVMModuleRef mod)
 	LLVMTypeRef sig;
 	LLVMValueRef fn;
 	LLVMTypeRef param_types[2];
+#if LLVM_VERSION_MAJOR > 4
 	const char *nm = "llvm.lifetime.end.p0i8";
+#else
+	const char *nm = "llvm.lifetime.end";
+#endif
 
 	fn = LLVMGetNamedFunction(mod, nm);
 	if (fn)
-- 
2.15.1

0006-Fix-segfault-with-LLVM-3.9.patchtext/x-patch; charset=UTF-8; name=0006-Fix-segfault-with-LLVM-3.9.patchDownload
From 54e137d21d6ef46604a59c2ec68fb4ac1a08cc58 Mon Sep 17 00:00:00 2001
From: Pierre <pierre.ducroquet@people-doc.com>
Date: Fri, 2 Feb 2018 11:29:57 +0100
Subject: [PATCH 6/6] Fix segfault with LLVM 3.9

---
 src/backend/lib/llvmjit.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/backend/lib/llvmjit.c b/src/backend/lib/llvmjit.c
index 046cd53ef3..6102b741b0 100644
--- a/src/backend/lib/llvmjit.c
+++ b/src/backend/lib/llvmjit.c
@@ -459,12 +459,12 @@ llvm_session_initialize(void)
 
 	cpu = LLVMGetHostCPUName();
 	llvm_opt0_targetmachine =
-		LLVMCreateTargetMachine(llvm_targetref, llvm_triple, cpu, NULL,
+		LLVMCreateTargetMachine(llvm_targetref, llvm_triple, cpu, "",
 								LLVMCodeGenLevelNone,
 								LLVMRelocDefault,
 								LLVMCodeModelJITDefault);
 	llvm_opt3_targetmachine =
-		LLVMCreateTargetMachine(llvm_targetref, llvm_triple, cpu, NULL,
+		LLVMCreateTargetMachine(llvm_targetref, llvm_triple, cpu, "",
 								LLVMCodeGenLevelAggressive,
 								LLVMRelocDefault,
 								LLVMCodeModelJITDefault);
-- 
2.15.1

0005-Fix-building-with-LLVM-3.9.patchtext/x-patch; charset=UTF-8; name=0005-Fix-building-with-LLVM-3.9.patchDownload
From f0e377d93ef0b39f5edd9b609018bfe9083f4f65 Mon Sep 17 00:00:00 2001
From: Pierre <pierre.ducroquet@people-doc.com>
Date: Fri, 2 Feb 2018 11:29:45 +0100
Subject: [PATCH 5/6] Fix building with LLVM 3.9

---
 src/backend/lib/llvmjit_inline.cpp | 23 +++++++++++++++++++++--
 1 file changed, 21 insertions(+), 2 deletions(-)

diff --git a/src/backend/lib/llvmjit_inline.cpp b/src/backend/lib/llvmjit_inline.cpp
index 8a747cbfc0..a785261bea 100644
--- a/src/backend/lib/llvmjit_inline.cpp
+++ b/src/backend/lib/llvmjit_inline.cpp
@@ -37,7 +37,12 @@ extern "C"
 #include <llvm/ADT/StringSet.h>
 #include <llvm/ADT/StringMap.h>
 #include <llvm/Analysis/ModuleSummaryAnalysis.h>
+#if LLVM_MAJOR_VERSION > 3
 #include <llvm/Bitcode/BitcodeReader.h>
+#else
+#include "llvm/Bitcode/ReaderWriter.h"
+#include "llvm/Support/Error.h"
+#endif
 #include <llvm/IR/CallSite.h>
 #include <llvm/IR/DebugInfo.h>
 #include <llvm/IR/IntrinsicInst.h>
@@ -100,7 +105,12 @@ llvm_inline(LLVMModuleRef M)
 	llvm_execute_inline_plan(mod, globalsToInline.get());
 }
 
-#if LLVM_VERSION_MAJOR < 5
+#if LLVM_VERSION_MAJOR < 4
+bool operator!(const llvm::ValueInfo &vi) {
+	return !(  (vi.Kind == llvm::ValueInfo::VI_GUID && vi.TheValue.Id)
+		|| (vi.Kind == llvm::ValueInfo::VI_Value && vi.TheValue.V));
+}
+#elif LLVM_VERSION_MAJOR < 5
 bool operator!(const llvm::ValueInfo &vi) {
 	return !(  (vi.Kind == llvm::ValueInfo::VI_GUID && vi.TheValue.Id)
 		|| (vi.Kind == llvm::ValueInfo::VI_Value && vi.TheValue.GV));
@@ -188,12 +198,15 @@ llvm_build_inline_plan(llvm::Module *mod)
 				 funcName.data(),
 				 modPath.data());
 
+// XXX Missing in LLVM < 4.0 ?
+#if LLVM_VERSION_MAJOR > 3
 			if (gvs->notEligibleToImport())
 			{
 				elog(DEBUG1, "uneligible to import %s due to summary",
 					 funcName.data());
 				continue;
 			}
+#endif
 
 			if ((int) fs->instCount() > threshold)
 			{
@@ -339,8 +352,10 @@ llvm_execute_inline_plan(llvm::Module *mod, ImportMapTy *globalsToInline)
 
 #if LLVM_VERSION_MAJOR > 4
 #define IRMOVE_PARAMS , /*IsPerformingImport=*/false
-#else
+#elif LLVM_VERSION_MAJOR > 3
 #define IRMOVE_PARAMS , /*LinkModuleInlineAsm=*/false, /*IsPerformingImport=*/false
+#else
+#define IRMOVE_PARAMS
 #endif
 		if (Mover.move(std::move(importMod), GlobalsToImport.getArrayRef(),
 					   [](llvm::GlobalValue &, llvm::IRMover::ValueAdder) {}
@@ -648,7 +663,11 @@ llvm_load_index(void)
 			if (e)
 				elog(ERROR, "could not load summary at %s", subpath);
 #else
+#if LLVM_VERSION_MAJOR > 3
 			std::unique_ptr<llvm::ModuleSummaryIndex> subindex = std::move(llvm::getModuleSummaryIndex(ref).get());
+#else
+			std::unique_ptr<llvm::ModuleSummaryIndex> subindex = std::move(llvm::getModuleSummaryIndex(ref, [](const llvm::DiagnosticInfo &) {}).get());
+#endif
 			if (!subindex)
 				elog(ERROR, "could not load summary at %s", subpath);
 			else
-- 
2.15.1

#115Andreas Karlsson
andreas@proxel.se
In reply to: Pierre Ducroquet (#114)
Re: JIT compiling with LLVM v9.1

OK that fixed the issue, but you have a typo in your patch set.

diff --git a/src/backend/lib/llvmjit_inline.cpp 
b/src/backend/lib/llvmjit_inline.cpp
index a785261bea..51f38e10d2 100644
--- a/src/backend/lib/llvmjit_inline.cpp
+++ b/src/backend/lib/llvmjit_inline.cpp
@@ -37,7 +37,7 @@ extern "C"
  #include <llvm/ADT/StringSet.h>
  #include <llvm/ADT/StringMap.h>
  #include <llvm/Analysis/ModuleSummaryAnalysis.h>
-#if LLVM_MAJOR_VERSION > 3
+#if LLVM_VERSION_MAJOR > 3
  #include <llvm/Bitcode/BitcodeReader.h>
  #else
  #include "llvm/Bitcode/ReaderWriter.h"

Also I get some warning. Not sure if they are from your patches or from
Andres's.

llvmjit_error.cpp:118:1: warning: unused function
'fatal_llvm_new_handler' [-Wunused-function]
fatal_llvm_new_handler(void *user_data,
^
1 warning generated.
llvmjit_inline.cpp:114:6: warning: no previous prototype for function
'operator!' [-Wmissing-prototypes]
bool operator!(const llvm::ValueInfo &vi) {
^
1 warning generated.
psqlscanslash.l: In function �psql_scan_slash_option�:
psqlscanslash.l:550:8: warning: variable �lexresult� set but not used
[-Wunused-but-set-variable]
int final_state;
^~~~~~~~~

Andreas

Show quoted text

On 02/05/2018 11:39 AM, Pierre Ducroquet wrote:

On Sunday, February 4, 2018 12:45:50 AM CET Andreas Karlsson wrote:

On 02/02/2018 10:48 AM, Pierre Ducroquet wrote:

I have successfully built the JIT branch against LLVM 4.0.1 on Debian
testing. This is not enough for Debian stable (LLVM 3.9 is the latest
available there), but it's a first step.
I've split the patch in four files. The first three fix the build issues,
the last one fixes a runtime issue.
I think they are small enough to not be a burden for you in your
developments. But if you don't want to carry these ifdefs right now, I
maintain them in a branch on a personal git and rebase as frequently as I
can.

I tested these patches and while the code built for me and passed the
test suite on Debian testing I have a weird bug where the very first
query fails to JIT while the rest work as they should. I think I need to
dig into LLVM's codebase to see what it is, but can you reproduce this
bug at your machine?

Code to reproduce:

SET jit_expressions = true;
SET jit_above_cost = 0;
SELECT 1;
SELECT 1;

Output:

postgres=# SELECT 1;
ERROR: failed to jit module
postgres=# SELECT 1;
?column?
----------
1
(1 row)

Config:

Version: You patches applied on top of
302b7a284d30fb0e00eb5f0163aa933d4d9bea10
OS: Debian testing
llvm/clang: 4.0.1-8

Andreas

I have fixed the patches, I was wrong on 'guessing' the migration of the API
for one function.
I have rebuilt the whole patch set. It is still based on 302b7a284d and has
been tested with both LLVM 3.9 and 4.0 on Debian testing.

Thanks for your feedback !

#116Pierre Ducroquet
p.psql@pinaraf.info
In reply to: Andreas Karlsson (#115)
Re: JIT compiling with LLVM v9.1

On Monday, February 5, 2018 10:20:27 PM CET Andreas Karlsson wrote:

OK that fixed the issue, but you have a typo in your patch set.

diff --git a/src/backend/lib/llvmjit_inline.cpp
b/src/backend/lib/llvmjit_inline.cpp
index a785261bea..51f38e10d2 100644
--- a/src/backend/lib/llvmjit_inline.cpp
+++ b/src/backend/lib/llvmjit_inline.cpp
@@ -37,7 +37,7 @@ extern "C"
#include <llvm/ADT/StringSet.h>
#include <llvm/ADT/StringMap.h>
#include <llvm/Analysis/ModuleSummaryAnalysis.h>
-#if LLVM_MAJOR_VERSION > 3
+#if LLVM_VERSION_MAJOR > 3
#include <llvm/Bitcode/BitcodeReader.h>
#else
#include "llvm/Bitcode/ReaderWriter.h"

Thanks, it's weird I had no issue with it. I will fix in the next patch set.

Also I get some warning. Not sure if they are from your patches or from
Andres's.

llvmjit_error.cpp:118:1: warning: unused function
'fatal_llvm_new_handler' [-Wunused-function]
fatal_llvm_new_handler(void *user_data,
^
1 warning generated.
llvmjit_inline.cpp:114:6: warning: no previous prototype for function
'operator!' [-Wmissing-prototypes]
bool operator!(const llvm::ValueInfo &vi) {
^
1 warning generated.

Both are mine, I knew about the first one, but I did not see the second one. I
will fix them too, thanks for the review!

psqlscanslash.l: In function ‘psql_scan_slash_option’:
psqlscanslash.l:550:8: warning: variable ‘lexresult’ set but not used
[-Wunused-but-set-variable]
int final_state;
^~~~~~~~~

I'm not sure Andres's patches have anything to do with psql, it's surprising.

#117Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Tomas Vondra (#111)
9 attachment(s)
Re: JIT compiling with LLVM v9.0

Hi,

On 02/03/2018 01:05 PM, Tomas Vondra wrote:

Hi,

...

In this round of tests I've disabled parallelism. Based on
discussion with Andres I've decided to repeat the tests with parallel
queries enabled - that's running now, and will take some time to
complete.

And here are the results with parallelism enabled - same machines, but
with max_parallel_workers_per_gather > 0. Based on discussions and
Andres' FOSDEM talk I somehow expected more significant JIT benefits in
the parallel case, but the results are pretty much exactly the same
(modulo speedup thanks to parallelism, of course).

In fact, the JIT impact is much noisier with parallelism enabled, for
some reason, with regressions where there were no measurable regressions
before (particularly for the 10GB case).

That is not to say we shouldn't be doing JIT, or that Andres did not
observe the speedups/benefits he mentioned during the talk - I have no
trouble believing it depends on queries, and DBT-3 may not match that.

I don't plan doing any further benchmarks on this patch series unless
someone requests that (possibly with ideas what to focus on). I'll keep
looking at the patch, of course. I've seen some build issues, so I'll
try finding more details.

regards

--
Tomas Vondra http://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Attachments:

bench-10gb-duration.pngimage/png; name=bench-10gb-duration.pngDownload
�PNG


IHDR��g���	pHYs%%IR$���IDATx���	\����AQ�E3����,���<:�*��.���<��4�,�.�[�.�JM-�>J35�������ovX`wA�Ex=<������~vvv��fwg����@�s�wP\�� 00B��� 00B��� 00B��� 00B��� 00B��� 00B��� 00B��� 00B��� 0(����+V�x���K�.������{���>���n���]��������7?��#r%>>����^e�����[�vvv��{w����U�����m5w��#F<���r[%K�,��P���B�Z�N�:��"C�r������j��W�^2>�qAQ�lY__�{���o��=z�pppP���7o��a6��~����;[�9g����Y�HNN����E��^z��������#G�y���}������Ojj����.]��?����V�TI��c���������d��M�6<xPR������W���e�>}�<��CY�������CW�\i��1�\�v�{���K�[����/�>|�������_~��/��w9�<0�V�d���K��.f��{����%6|��Wu����`zzzLL���W������5kJ�*%�K�(�_P:������jg����K��QQQr�L�2�U�e���oG�9k�,�k�[���&L����h����N�:����r]rT�����=��g�I�{'����\�R������$��?_6��3��Yo���i�d?�T�4@a #���{��_~��; O+�����iAx���)��+����;2f[}��G��o���/ek<���wC�$�\{�������5o�����U�V-Z�Hb�}����O?�k����f�92u��~�a��u��~�m��J������?^�V�\U+a�G������^�4��5spp���o���7�H�j���c�=fa
�O�~��g���j�����l�S��_]�����_|����J8�|���#$h=��S'O��X�������;v�\�R���Q�$�U�^���I��(k��q�l�:���S�Z7�Uj����-�a�?���l���k����Q��[�v�w�}';��i��X�-��V������}����|��]��-[���(!��]nnn�26���

�������%�X^�T�R�g$�����z�j3C����DFFJ�?������:Q2���K�H�������$XJ�z��'.\������"""���K�"��
%q-^�����>z����3%t���l�2n�8�"�K�����HmOf�p(����C�'O������������>;
��#b���?^.G����i�Z
���~z��������������`�M�z�$�4m�������4b���S�6m$3\�x� �rvv�������/U��%��m+������ ����>{��,w�`���`����_~��W_�P�0I_iii5k������'�����;88<����oZ����m����$�>VOW�a�)����_���C����rG|��;vH�����g��%J�HII1[|�����e��b�
m��?�~���'N����/_�|��-��;��_m���<vr�f��=g���g������;[�n��/7���H�~����o�n��JNN��������o�i��9��TN�j�Vr�l1)I���*T� ����_�
�v�}L�N���o�F�>���%���d�?����S�dJ�<x�~����d;T�X���KR��)S���W�z{{w��A"D���-l"!��������<4���5������������Z�ko���<4�G�>�@R��_�/'N������m�
l�r�VV7~���a����s��=���B�� ?��][����,Y��G�����7o�e��U��W3d;K����$�2�R��%�'�,IzJ�[dB�2����L�q�����u���43���6~���?����7�d�*7��{�I�����������Hq�����'O�*U�~�������k2��X��MC�`Z���-._	�###�N"Q���+El�S�Z��;5m��_~���{�����P�JJ��*�U�u���X������n���j�o�����j�*%c���,�#I5Q$�I4�����������a��A���[�*��[����+)Bn�V�ZRChh�dTye=�~�P�|�r�|���%���kk��t���R�J�o����gO�^�dK;vL"���:]�*���;e�Vb�n����e�����z��'��r��yIn�>� [0����������c������*::ZFQr�G�^�NTT�:L�zR����1���0NF�����G���mS2�_���s[�e���7nT�}����2V2�V�a�z��s��=����}�����[n�LKK���%f|���Z\\�x������#Q�o����N�"�J��s�=7f�WW�����h�Br��/Yd��Q���]�VF�Hd|l�N=��32�W����qj����r*U�(�K�c�=�d�5u��W^y�����JdO����!C��y5��?��):��I����7�H�Q�K�r��N�(j\Q�^�-y�F����oK�P2�)������E����������BF[�K/����_���_��.]�����o����Ok')���h��]xx��y��f�np;���?����K������yD`;�|��qc5l���Z�&dPu�����@��8R`���THI8���:t� ��|Y��%���d�(#<�|r����\V�^��;����<{���'*V���aC��/_+Y���?�~��J�*2b���E?�����{���\�R��������3f���{��[K���J�����
4(88X&�0��������;%cq���\����z����NY(U�%W�\����������HO�d�������5k����+wDK_BR��{�(3g�T�Jv�5j���;���}��-$?X�!����3J��s�v�5K�R�����:t����9r���
y�&M�t��mY�w��y�r��s��Z�h!���c��#��g2(����~���k��f}��l�����e�f�/��pP}�G�P��7O�W�S�������}-+�4��n�R2�|�K�t��������N�A��q��1�M��#�X��0��]=�����~����������Vo(+��[m�����cO<���>,#�
*h�%N��9d��K2����l�u��)�>��)�����[WR�_���;e�T���-��S�)�%!���]����z����$���w��g� n�:u$T��
���(~���g��7���j�L?]X�}7���+��m��)��l30�/..N���{���Z3999*�|>}��<�#$���P��d�n���*���S�dD��U�{��7o7j&==��\u\�^7+X%�!�Snd������Z��M\f;�n��A��:b��o���8=�#�����I��5k�|���������J`?��C||���f��Y(����W��m����d/�]�����0%&&����dIMM��M�J���u�d��?���`Y�A��f��_s��%��
��s�c�E5�'���M�������?^����o�*U�(��J`#�|��o������<x������a��={&M��������O������gKB��'�S�y����'�uS�7�����������gk���+�=�\n��$����g;W����^�^��q�<���)�o��-�
���r�{�<��\}P�9l�����
��C�J[�|��Nu|�~����_�����Se{Os%�RCBBF�}�+W]�~=��������,P#��������nI�w��|�r��m�V��III�l��?>�-�|��o��W,�H�����u��76n����co����%K
����L�3T�\900p��a�z��|6B[T�T�����~�L��:bV����A�<���;���k�w�n�N��:���V�jc���OJ�J�� ���w�r���F}wT*���}������?���{�������_�~2L��i���`ymq�,�*Yw��Ar�]�t7n�=��#YB���W�����M��J5�M���������v�|��69!��g�I����[�ha�"�}�Q��7o����g ����^���7%��o�>o7��W���#G���3+O=a�v�����:�{���i��Uj4�����#�0�B������l\<'NNN� N�>]���5k�$%%=��S��5�g�NY�N�^�o9���?��z��M��'�x��l@nyyyIr���m%%�oy�Q����_�e�np;�W�o|=�B�y���`����[��h������j_��G=z�4hP����Pr�:Vn�m�v�����m�����������������K@�5k���>k�&���ec��`J�W�������f<�o���NMMMLLTRIcv��F���`���z���}�]���F�s-X��l���:|���i���@nK.�u�f���d���\���{:���f��}!�����R�����3_�������WV������?�d���6��X!��7���{��}%~��[w����/�����$�����/C�:T;=�J=	���7�nS��=�x�����o��V�Tqqq���W2~GK�(S���^�u��u��u�f0���1C���l��1112��8��CY]�<���?���C��	G���Ww����'N��P������E����/\��������� JPP�s�=7b���)�"�����
���'7�����C�K�������~���3i��)�����H=�i�}�N��j�����>�k�����5j�g�oA7m���/������R��������m#�w���l��y �E���`���u����G���&''W�PA��fQ''2*��w��I��q�����7�|��_~��r������&M��7::���>S��!c�|�v��e�<d�'''\�
�={V�2J�T�������2b�-&����#��dV�^�������"CL�v���R������C��&.+�7��-[d|/C^�������l(y�_x�����J�L����
����S����������e��e�����`����o_t��YF������?h'���i���?���>}�X-L#�Z��i�����*[~8�o��Y��u������p�,h�����+V�3F�x�<�#G����7o.����$-xxx��)-�D��]
6��G�*�	o$��\�R�L�0������X2���'�������WV�o�<P����-�h#��5�-Z�H�.C^��(Z�l�z���>S�_P]VFT���%�L�>=W�Ek������={��Q[�nm����]]]����Z����SSS�_(R��.	G��~�M����)SdL�n���={����
]�tI�f�r�~��G��|<���5k��!fhh��J��[��������w�1�=%��lL����|L�8���&9V����KJ���^e���������_]����~+�b	��o����g��{*h�����V�Z%�\yPd=��OgP2F���Un���/\� �8p�-���QC�[o�ev���i���N�:U+��;e������1��Z�j/w�C~������Z2�����K������v�Zy��,Y"�/,,,�
�!��~����wW�^]��d����[��
���R�N����76,����}7�������ov�|��0��~%c�y#(�`r-)��tqq����E���~Z����f���d$���m�2DUT��#:t����o��]�a2t+_��D/�������%�d�����������,C�/�����������d�(�D�K�'�A��c�dt����<x����)))*T��<�@�9}��v6��_S�;V�<w�������V���
�=���D5I)�ieH��?�H���^{��Y�f)_%�z�J8��'��Y�FzJ__��]�>����z������%�J �}=n����)��?��;%N�4������D�����N�Dv�m���F��k������2x�`)@h��R�d�C��)b��y��?��������rzC�������������?��#;�����)�����q#��O�>Q������������\m�\�L.OX???	�y���'�\������J��y��
�_��-����e�88���%���`�M���T2~�:��<��lb�-#wX���3�M,[���n������������['W^~�e�=�<��l���)6�)���h�b��
Y�K�6�.�B=k�&���\�r�r�Q�U������v��5j�H���0�-V���m�l����#����*[�l���?W����>��������W��w��?�X���c�=f�Z��i��u��}���/��R�}��Y�j��#G*W���+���w��l���c�����`��( ��u����w�}���o��'�.��n����us��quu�w9�00��',,�w��W�^UO�?b���8�4�}���}�>���G}�K�.�.���
1h�����`�;��S����+���~�������O?=��������{w����]��|��G!!!�[����J���y�r�5k������M[�7���D���Y�v00B��� 00B��� 00B��� 00B��� 00B��� 00B��� 00B��� 00B��� 00@�7.88x���/����k�O&L�6m�G}��k���Y�fPl��Q�r����������}��7o�m���g����V����������G�MNN���{��Gd�Z�j���|���|��_������_�Q�F�,YR��-}n_LL���U�V�>}Z�����~x������z^�|y��������'�_����^�b�����o�������<|�p�&M�S��]w���k�a��y{{[()�����KW�REnK���*�eccc+W�,w�m��������?��c?��C�+����d�\?~���S-�����We
�.]�P�B�v�d�]�v�Vb���Kbb��+W��/o�R�/���P�Z��g���;v�������+S�L�j���i#�u��u�=o��%{���������<�d{����W��v�+���n(<<\�YO����,\��suu�Y2�[�n�����9�j����b� ����5o��!��j�j���Y������z$}���K��e����1w���p�����n��=5j��}�R�{��'�P���m���o�������[���d{��w���-Z�:u��x������<8o�<	�[�l���E����+���2�k��a������%�}�a��A2�3,�PR��u�vH�e		�K��A��HOO����������kI8:t�����Ke,�m���8q"�����A�������u�W_}%�-W���s�$��={V��D���P�<rC;w���wc����I�=������������W��G����������%����f�I�jO	�[���Fr�����'��H��l"Y\���[�[��(��<�f�>�
t��|s7o�<}����/�w�yG��������������q��u����������e()�������M�J�dJbb��O?-�L�"sm\����e����/#N�������={n�����>{���m��/f��-���g��P�M�9s��1cd�y�fu��%b�(Q"((���_��NLIIY�v��a�$�xxx���+�X���+�S.^�(������@v����k������5j���~:p�@�JIfd�/���s���V����i�������^���JF�r�$d���r�Y
<X��<F/���:E��l���_bjn������$p��j%��;���'�|R����6y�dyj�6	W����%}
0@�/����]Hv�%K��\�R�|��GYoE2��7n\�
����g���^$�5�g:u��q�F������� �����IU�\���g��ur)J5}�R�JI���k�.u�-+��!�2�R�JJ������S�N)R-��'����V�Z����`N?�@������~b���%��x]mJ�|��W��*QM�����G����{��W$��`����e����_F�>cfY�2e$�,[����sG����+��*�w���r����f�������6m*i��/���$$''?����
`��i�c�=��/![Fag�������M����-���7o�-9p��=�~.+�:`dW������w��������[v��}�J�'�x��o��+_dx�������v��~�6))�z���z������m���d��Y3�]���QJ��,O�3������yP���d�B���m.�,�������Ce+���;���{Y�_��-�V�*�I��[o�%O����������� �oRyyy�v�5k������j�����+��u�\j�R�XY[G��|���m�c������\F�2��1}��
JZ����eX�M�'�
4P�2��H�����/M�������:s��\�6�y|||bbb�.����.��GD�������U��-;--M����c���zH?������K��ma�7�$a�'J%9�/��u�7�xc��Y��O��:q��	.\�Lec�R2� �[�lY�t��eI��O��6mZ�~�$��k�n��Annn�-j����O?���e�H��V��l4� ;����k����S{��25DGG�&��*I�)S�L��)U���nN71~�x	r6l�BH=����}�vo������%�[^UA�SP`�����\�"���]F�*T������ejy���h�A�\v�������M�����Y�%�S�N?~����j�Uzz�z�����:���e���#�������C$Cj'�P�w2j�}�Y%''�?^��_|Q�~�_|1��������d(l��k���^��z���A��y���9���{N���`����1���#�P�l:%���}����%��)S�m�����.���l�u��KX�S���D����{�~DSO����q��{�j�?,]���a�$?K���[||�0�D;��%}5n���_��N����.���$[���n����-�d�^���h��*y$l��q�����[f���Oy{��N�:�S
�Id�|��l'k��}%�m��9�U��5`�� ���������e��{���?�|��5��o�}�(N�8!�J�>����q�QQQ2�������W����l���ce0��k�M�4����|�B����N�@"�v�\s���ri!B�Dj0�899I����v*�\�d+!S��l�C���_~�eBB��A��������������{���6y�6l��7���;W[�W_}�d�������w��Y%��`k���� �G��<��6m�G_v�l���+[[J���e�������_���	��w���E��dd���KJ��i����K��K�Z�`�D5�D�����g��?d�V���>(7-��ysZJ�`������_~Y��*U�d����������zY������#��&a������ t���u���G�V������^�|������g�z�����G����u��i�`��r�)������Sd���>���|����3���#A���������}�����^�����������h��G����n;66V�8Q���2j����O�1c��E���[�^����y�����>�@.?��3�Sp9���4�=���e�Y��GG��j%G� X������G�����m(��\o�����<�[�n)_�:~���EA5i��e��iA���m����(H�w�}7qW�}jT�~�P������G.�>l)�����C2��B�eu��9z���?�����n��mi%��LC���������[W���/���(b���Y��$�_��������&�������$�*����`@��A?�t��2N��!�����Y���9�'M�d�;WK�,y��e��e�������1qRRR���o��xK��G�"k��i��q�����I�;v���d��\�P�>>>���fYK�m�V�J���O�8a�A\�h�~���%.6�c��2���#Ef�?��d��]�6n�(�fY��s�O?���#��z����}�M���o���_������~��DeUY�~?P����D``���.�[6QNo�(������{��WK�
0;���?�t2}��_N_Y�tdcS2�{�J��w���v����y��	�~��7����J�;K�?��=���k�Sq��	���-O�\=��2`�������R��������&���y��`@�\��aCc�@�F���o��������pV"��Y�7n,�%��[^�9�f�3G�H�B�
2 ��G��~�z�9rd���-[��0���:�5�w��9  `�������j��
"I���f�?���u�d�Vo���Q��|��la�k��e����4h��?�?~<� X=�d�lS��e����������U�V�����5����d���60�$cv2�R�J��]���O[xt.]��~�Q=Y���o����2���f�i�����g���������/������3�������\JV�[���Je�{���������(+�=���_���J��'���u���sO����~�G��NNN9�i �%�|��gO<��D������d��2@?q�D�S�����2��_��-}�)��w�<3g��q��
0`���fg��@�qd�I1�%�6������Jz��)�QK����lY���&c�\-%����?����<G����O���?����)i�l���X�>,�i<x�`	`�h�5j��������c�z��������f�e;+������q���3f���[/�������`;��������������������2Q��W2���OXbb��m������J���d���/�_�����IIIY�|YU@��U			�o����[��
e���|���G�d(,C�����@P?��r��?��#��
2F��5d��O?�4k�q�;v���O?�����H�i����.�-}T�:u�\'�h��M���M�6q�D��D8��q#<<<  @�.�<���x����R����O������wolt��1%O���s�'�|r���o���'�|�M�1njj��A�>����K��[W6���������s~��j���X���?--�����mU�Gy��/��U��SI��G_R��y����_~�e��a������/��Rv��y��F�/�n��o���{MTT�����>�s�N	!�O��U��~�K��G}T�&������N�=:�3I��m��M�����'�-
b��J��r<���{�~)�L��S����]���1b����y2n��%������={f{21��
f����}����g�F��+���e7y�d�K#�g���rE;?�-}�d|���_7j�(00�C������O�x������wu{���h��I�&���O�������d��d���-[��];����y��&��Wpp�t�n��2e����������9s6n�(�O�>��T�����}�
<X������u�l:=�v�
^�F
��9��������������KS�������cbb$�jg4!����o�9s���k�J�������NMA��]�����&�]b�v��c��K$�������m(�������)3k�,%�g�����3b����f�M��[oIN�����2����l�'RO"��}������o������e�-]���;��~O@E�?���w������j��-<�@BB��]�.]�$�?��9Q�Y����!x���l�
lY���i���7�~���;w������O��}������???�I����������������m��2��3v��!C�#G�Hr+S��H7�-[VY�|�Az0@�y�����J�*�������?/���^e6k�L�r)X�a3I�G�=s��$��?��j���vN*W�<e���2���W�t����Nn�u��9���s�=7~�x�K����d�'O��(ba�kuc�'�����<
2�����g�������NP))�����y����F�r��}����@KU���g>U�S��~��g�t%K��R�d��2���L)777�d�����6�V��?��#+���z���(��u��1y������X+�l��$��l�R�����p�b����e�����u�zYV��J�L�����g��([@��U���6F��SP���8p@��2�\�vmJJJ�Z��2j������/�������;s�L	`6���7�����g��-�&55�v��&Lx�����m[��������C% �-��M�n�[a$q����?���$���4e��Rn]=�F��2����7�|*�k�J����������I\���o�f�R�$%8p���M�4��$�^{�����Z��Db��j����=y\����W/^���|z*������?�xN,�N�����%�m������y_z�%�S�j�����[��@Y6�6�O�>R��u�l<���$o�������,Y��}{�C�������F=z��o6����IV(K���w�^��!$�K��U�c-�A�7I#��������[��"���v����[R�d���;W@O"��}�S��)%J��m";�����������{

@���A?���gZ�\����s�t�q�=2�N���&~�Ak�<yR2O�'H�xxxd���<==_�`�g���s:��-,/.H�p�J��VW�����\=���O<a�����d�b���,S�Q�u��?�lyA���4�2����ov����"��9����F�V�){�����v�����(����,�m>S�r{O�*����{+U��y��P�� �f��i��
�
P�� �~��w{�Pt�1�
B��� 00B��� 00B��� 00B��� 00B��� 00B��� 00B��6r����g<���?�&FGG�Y��������]�v�:u������X]$�P������s��MLHHh�����{����I�S�N���l��u��}��]��E��NEO�
`)))/��b������/�����KR
;v�:�c��}���>}��Y��]��E��NEO�
`�|$z�_��S�N��K�.uss>|�6�O�>&L��3g�tpp��*���a���b�N�:��k�5o�\?=11���Cm��qqq�Oo��uHHHxxx��5�Veu??���@�TL���C��/?m�����������4��������a��"r�]'�"�8�E�m�����~ruu�q��~���7�R��-���&�111Y�fu�<�@�T�Xdd��Q��~�������Tzz�\���ZV��a���qqq����&C�n����J�]1b�$�?�0��Jv�J�S���]$�l��}N��]�6W�@�������x�����X�����KNN>w����'Mwww''���p������V�ZY�iu�J�*�v������l�"�c3��/����o������5;p�@lll��e�������m��U�Z���tvv��Hn�	�H*^l���m���O�P��O��;6L}3j���C�


R�,X�������j3!!����nnn���X��8(^�n��,�U�V��X5h����O�2����M�6���r��F��5J���I�:l����E�vP�fgg�
6IF��q�����a��O�a�<�@�S�����z:x=�E��]�A��]�������000B��� 00B��� 00B��� 00B��� 00B��� 00B��� 00B��� 00B��� 00B��� 00����7/]���~�n�^e�X��`(\��x�������������e/<u�������G���\p`(:|�r���Z��Ok�L�q�2�����c�6m������?_�R����O�0�A���E�
4(�RS�L�n9�3:::00p��5/^���������S}}}m��lU��l�lj���T�m��W��?w����F���v����m�&%%=��S����V��������V��{k���r��o�j���|��rZgBBB���<��w�&M��:u*$$d��������eK��~���7�L�&��������c����n�����R�H(�����3~��G�l�����w����?�����`Y�:�c����O�>k�,[:(�]k��U�-��%{�1gg���p��0OOO���t�R77����kS���3a��>s�L�n�>�3�6u�T�)g��MNNP��)��B�
V���x���6m�������n�:$$Dr�����5k���{�NP��^LL��F����:~�xubtt�\��3g���QQQr]R``���]IDDDZZ�����tuJXXXJJ��0��(����S�Z}��]�jU�Z����;`��-6lX�5N�<9o��g�y&66v���Y�s��M��g6���M��xV;���Px����/_�r���+V�8{�lHH��N���_{��N�:i����M�6}���X�T)����.���e����[���rZp���6�p'

��o^�vM�<~�xh�����}3��u����<t������T&��7���1C��c����;�������%J�h���Y�z��u��u��5��W�f���zxx(����N��`�C���������{wkw��3r�����]��l�Y��:"����u{"����W�r��j7i���w�|-�H��R|�����|�����<y�n���������[�ne���������DQ&��j��T������W�t�R���5j���~066V"������������p��1���0�����Y���e���/����n��M����l����x0___�X+V�x��W�7o�N<y���M�\]]���_�T����GEE5n�X�j���y��2E��XBB��������3�8p������AAA��\�p!00�������g�}��c�|�w�����?�z������>��t���a���O>�d��-�~�i??�c���Y�F�����5���6i��C��7oV�4h���S�L9|�p��M%��\��Q�F�F����&1%>%5Ik�������b���k�w����{o����~�m�2e$k�1��GU;���s��m�����
"##��/��_��'��];�u:;;K��� �U7n���6lX``���C��7K�N���b��6�~;XU���q�����[��:CNs4h�~gLO�Tp�����@�W�`%��3�fz��Jr��;J������fRS���B��PL�&�&�Fk���j9���c=(`(.��yv����aO��$�q��lUs��{7{��b�!��A``�!��A``�!��A``�!��A``�!��A``�!��A``�!��A``�!��A``�!��A``�8����i��m�������*Uj����	4h�u���\�f�������v�:u�T___���H�	��)v���m��MJJz���BCCW�Z���������Z��			���?x�`����4ir�������[����O�S����H�	��)vl��������m{����)�z��5c���Q������,=�;v�������g����:�.��u(z�]k��U�-��%{�1gg���p��t�R77����k���3a��>s�L�����H�	��)vl���fS��=��� �:��M}���[���HH�Y����V�����:I�.�����8p`��Q�������)iii���f=�)aaaY���ERRRr�NER�
`������r�o���V��U��\�y��\J3�����d�����H�	�H*����_�r���'V�Xq������D����e���eu�n����k�����;Nh�%}���kfM�
�f���Q��+nU��ui���q�����w�^���<�
����3f�Wv����s��={<x���C��])u�:���E�������T������[�_w������W��?�sV��T�uM/%&���J���*WN�_�r���o���3I�l����{��.EV��R|����������~{���Z�j999igD�����4V?�h�����"�*U��:I�+�]�t�s���5
		�OW?
�����Y����e��sSSS�m�&A�Z�jY�i�"�]'�"�x0__�[�n�X���W_m���:�����6mruu�_��48t������� ���.\��6�?��������E�vP�&>����;>����{��Y�����W�^��G�.]Z:4h���S�L9|�p��M%k�\��Q�F�F�R���I�:l��Y�bu��.��k�n��������������2e��l�r���>������y��
AAA��6n����3l����@���YY]$�P��&�4i�|�r$g�vn�
������-y�1��]�� 00B��� 00B��� 00B��� 00B��� 00B��� 00B��� 00(v���}3Wk�t.����v��� ��NRR���okM��0c�� 0�(HMK��Ak�ptn����� [0�(HL�����Z�LI�f���X�E��� 00B��� 00B��v���3f�[�.""����i���'On���:w��E�
����)S&L���:�����Ys��Eoo��]�N�:�������b��]���E�������?����O�^�b���k�n���H�7n�e��}�U��_P���������<x�w��M�49u�THH��p��}��l��8(vl���aaa��+���N���W��=�M��n�:�l�����w����?�������c��S:v�(n����f�������0gg�N�:
2D������)S���cjS
`�����s���nnn�������g��	2}���V;��}pg0(�u��9��l��� *�����$%%%''�/_^m�Xdd���
*XXabb��C���i�������u������p???�j��y��
�����q������,��$!!���]�f�������6����r��9������������iii���f��)aaa)))�;��b��� ~��7
4�����G�s�����3�U�V����:E}l��e��
�Q����'�����3����:4�n��)����f�����2&&�j���G
-�X@@@�R�l�,=����Z�|��A�$����O%K�T'N�8���^����������i���zk��������t����.�n����k�����;Qh�%}���kfM�
�f���Q��+nU��ui���q�����w�^���<�mwIi��fJJ��qcBb�����
`����flll��e���v����C=����N�������;	?�'O

�����+�oO�o���s�z��v��f������Y�ffs=<<����R�xd��!kyYk���{�����mg�6e�������U25�p]�K��4���5�����W�\�r����L�5�7o����������������NNN���b���Sl�U�dT���x���.]�0`����|���V�^-W*V��s�Nc������/|���o�����3�.���#��n��:���_����p��aa�=�k��U�R%��v/�q�`o������;t� ���I_�&Mj����a��L��h�"j��%�����WC��D������k��P�'��z"
%�����5;p���m����m��I����v�"������z���(�`�7o����I�.��v�����r}��1��(`��5~����#��/Q�L����GEE5n��~������y��2E=]aBB����������8t������� u��.\���5[:yq���z�������
������kj�IOO��i�vn�J�*]�|�����d|�p��qf��|��r����;��'�l����O?���w��1�l���.T����J������Iu��A�/^,�����M�6�x�r��F��5����X�
����K�;w��r�J�.]��/^4�Nd9u��\J��:���^�z���m������
������������k����:����sPP����7���6,00P������X�&M�$,$$�J�*���S2�*��U�V������r���A��+�(�!���vP���N���g�	&xyy�_�����^~��S�N}��r�=?��M��7��Q��_�E!dt�Z��������\]]��>9r��Y����.(&���U���i���:�L�y��Y���>��F�V��T^^^�f����Rpgq��Nqr0�}l]0-]	��b�cr���J���Z�LI~*������>�}������O��P��W�tA�#�����~�K888\�x1""�r���*UJMM=s�LTTT�:uj��eL1@������3Z���[=�~����v���^��}���C<����qZ��[�>���Y�@�:�m���\*WRF���?��6z����~[K_J�{b:t1b��Q���E�����#U�T�:�z��|@�ft���\�lY������^������b�HF�A�����G������Y3/_��e��}���9��b�HF��S��.]z��y{���&zzz�;Vf\��V�D�I�&M�0!<<�������*T��W3:��2����.�`qqq���[�l���JKK3�{��q�����w����P�reGGG�o�����w���7��W_5�v���`7n������7
����q��'O����3�v���`�g�~��7>���F�|�`_F���'GFF6n��B�
>>>fs�=jp=`����7�T�R�jU�o����s�N�o
	�������.]rpp����R������!�}��AAAg������]��w��������a�`K�,y��7n��_���+����;wn����{����]�\������z�jm��3$zM�>��3:�;vl�����%J�(1d����{��b�HF0�^���Y�KKOO7�0���a���|�I�n�$qi%���7�Q�FF2:��7�W�^
4�V�J����s��}��w.\X�v������`={�\�|����g���M�S��d0���h������q����U����_�,>>~��m]�t����fLL��+{��2e�_��v���Gy$<<<..N�"�o�������iS���
�ct{����]��M���n��A��,�t(b�`7n|��w�|�Im���c�.]�~��w�}��b�HF�7n�+W.�t����\�?��|����~���A������_4h���b�HF��������i���:u�X�bBB��C�/^�K��#�z������J���n�����{���
.�d�����������f�*U*U�d|`0;0�s�Z�j�����0��w�}7i���G���]�v�l����>���;v�1\�zu�����������i������6l�u���\�f�������v�:u�T___���H�	��1:������{�n����1c��}ubBB��o������/t��]k��Exxx����|����O�X�b���[�n}���b��o��A��I�&�N�
		���������:�.��u(z�`��O�����U�����&a,,,l������'�m}�������:�W�^R��i���['M)C�Rpp���\�����+���5+�uZ]$�P�����/�@%J������c�-Y������;u�4d�m���?^�L�c�����K����
>\���O�	&���3g��Lcu�<�@�ct������u�����)��>0����$i�|��J�OB:t�M�6...�>�[�			�Y����V�����:IF�{�����?����~b\\��9s���>��Q-X�@X����zDD��C�>������a��")))�]'�"��6q��.]�4j��k���\�d���KW�^}���M�6\���}��1cZ�j����J����r����nnnr�u
V��:IF��;����o���z��?�X.����E��o���b�/_>h���
���O%K���3==]�����+����[�n����i��k��^�'4���y��5��w}3�B�����*Z��k/7n�(�ej����1!=�e������d��s��w=5U�35�l�T�L�LsS37���s;�X�/^<w����j�����\�����'I%+V�������P�{WJ���5cu�<��B�gB���-�5�;���m��+Z����9�dj*�����i�E%Lkz�+���v�r��7�����k6o�����m�����8�$��������k:)�;��S��K���~��g	}>�oA}�����Kwb��E��R;0[)���[�{��}��������uI_/����_~��o��9���Q����/�bxx��"aa�=�k���umV����u(��`/^�����F�-���zj���r�b��;w�0��]����}�=gg�f��8p@"b��e�������m��U�Z��k�e���@�dt{��7�_���C���?H��4iR��m�
6e��E�tk�����G��5}�8t������� u��.\��6�?�����E��X��80:�m��Y�V�&M������k�!d��1��(`���J����g6K�a�r�
�x�b)����M�6���r��F��5J�*�K����N��������k����JOO��i�����*U�|���:uJ.����u�K/�$���y��
AAA��6n����3l�0I������H�	��1:�U�P�����b�s��+W�t��E�~��E�������I.
����
d]��El���3:�u��a��I��BBB�T���];%������U+��#��N���g�	&xyy�_�^����_~���S_|�������`U�V��TT���k��%��#G��5k��������
`�j�Z�~�]w��6����s�7o�o����]�t	

5�60�A���S���6v����
�(1�#�O<�����-=
�0�A�S�N��_�z��)����a�cn
-����B��� 00bt�����eKTTTZZ������\��6z�����T�\�����[;2:�}��w���{��W
�]�;���7z��a��@a`tk�����'����]�;������x��O?��Q�F�4���l�������7�P��������G�\��v���*U�T�Z����3:������[�B���9}���K�����T�b�2��_�_OM������)�X����)���������3g�hSj�����������b����E���Z�A��J(0��`K�,y��7n��_���+����;wn����{����]�\������z�jm��3$zM�>��3:�;vl�����%J�(1d����{��b�HF0�^���Y�KKOO7�6�x{jj��]�~����`
6���O�u�&�K�(�l��y�52�69���X�Y7?,c�b�\F�q������A����T����x���������k��5�0���g����/?~��Y���u����8mv��>""".\����P�jU???�����KJz���\Iqp�_5����?��n(�"*	'L�Z���W
@qdPk��e�>}^�u�b��������gPKIIIKKS�s��]��J�eS�����m�j������~�+(��P�?ej>6X�AN}��7�w�H���]�Z�W��w"����s�O>��f��f�����s�n����z�9~e�������eOo�����Z����	`@VF��7���d������0�H�N|{#�Ak>~��eK���@ap&2z���Z�r�8�����>���l�����������U�r���;::�g���&$$�s�=�`��
gn�k��u�%��Q�s����f�2��n���o��=��������rpp�T���!C+(�N��v+>Yk�]���tI;�3�����_?{����������i����<i����{�I�&f�Y�h��A��.2e��	&���������5k�\�x����k��S�N�����p�^�`��G�i��>x�u�*v�f��XN����k���>j@
���������l���qC.���[�Z5��x �&$$�o������{��Dw�������[����O��-F0����Y������[^�����Gdd����i����Kj��A�j9r�}��z�������������N����D������5��@as RIL�wE�����[RR��������{��RRR^y��3f8;;g�A
`�����s���nnn�������g��	2}���V;������|�u��^�B�M�����ftpHL����������5j�h������l���������?����7�///�<:�Xdd���
*X����x���6m�������n�:$$$<<����r���������J�aS;����v�y����JO/���/������g���WO����;c���C�N�4��w�5�������r��9����������m������4����������`@1atKMM-]��z���966V���o_I8�!����-[�l��a5j�8y���y��y�)URb��7o�Tt�r�qssS2�rf�C���������Z�|y�.]}}}w����iS����dw'N|���:u��E����K�o�����K�*e�z�3>�e��]:l��U6HN�]���P��=�$��Y966�li]�V��sBBB�fb��\Vk&�d���i�� �a����
���/<����Lk"""��<�<rD�4{U�e�f�`Ah�%}���kfM�
�f���Q��+n�e�.M��et?O�w�^��B�!��W�d��s��������Z��f�:djf����������.1F���������o�}���r����7/�s�}��fS�����k�5k����_��53�����d�F�:�#������gB���m�#(���.V.������r�4�l��J��]������...�J��Y�%Y��|�NN������S�nn����Kd�'�8{B��"�����h��/r��;����^^^�'��]�|##';#�)��h��~���������^JL���0S�����a�����O
��ys_�n6i�/N��M����$���N��^��Jd:�V�2�O��,��g�-����Y�t�N�9���Pjt{�����>}��\<z����S�z�J����kp1������[�ne�%G�G���f����{���UK���R1�������J����o�S�vm�?�Wp$b-^����]+Ru��1���0�����Y��������)����m��I����v���Q����.w)el�����W�9iz+�e����Z3��k���O�@�fhKLL|��'F���];mb���^��)3}���������__����?���C���+LHH8~����[@@��a���C�


R�,X�������6v����\x[k�In��Y���W�n��wt���_��5��z������|)���"��V�T�={��8qB��}�������SRR��??n�8�9f�oo��s�>���-[�|�������;�f�WW����BCC�4i��C���7�S
�x��)S�>|�i���V�\��Q�Q�F������v�t^�����|���A�={���������CY8C`���kWpp���t���|��$����s��m�����
"##��/��_��'��];�u:;;K��� �U7n���6lX``���C�F�e���)S�m�����+V,Y��~���G��q,�i�!��
4P� �'Q*8CNKY���3:�]�z�T�Rm��1�v���`{��1�����i��x2:�Y�nUJJ�����,�dt�u������/_�t��F2:�>|8��?��s��!'N4�0R��X�F�f��1r��?�����@A)L��];�7���(,l��5����w�s+6���SZ���GU�;�c��1--����aaa������Pl-�������/6r���iv���o����k������5]F���^Ik��S<��Z�Zz��|Qk]�y���#�f@�F#�}���������Z����?����,�������w�vft�q���GG�*U�<��sc��1���#����q\k���^e���d��9-y�����i�/����n�)�[)�B/1L	���RR�#o���^e*���N��IaZ�-�n�X���=j�-�G���3��N��5���Y7���%��
�w���']Q42������wR��0�b�J���xi�s1Q`�fP������INN���?
(�AB���j����>�R�Z���*�/������������#""*W�\�R����3g�DEE��S�V�Z�vaP��{�ze���C�=x�`�&M�)���[�n}�����gL1`Fl���o���������:t�0b��Q�Fi9
����#G�T��uz������������l������M_�z���������`�
z��w�=*���G�\�|y��-���9r�����et�:uj�������g�m������ce������`%J��4i��	���/_����^�B����np%`0�����1 �]nX���rt�����C��
���\���>�An%%D�<�5�S������� 00B���O_:�g��?���[�����|�]�P0���bn^������tl����i�r��Q
00B��� 0@������b����������P�� 0@]�����5����Xw ������uZs��zv,�;`���{�Wk�����U������!�LNG;r�7����`;@�C�"..1919Uk�)�\�����8#�@7z���?������\��iv�'�Z9�,�����{�hM���](QNk�&�s�y0(^�F�S�������BK���vFk���)�y�m(�,99y��I���^�&M���o67:::00p��5/^���������S}}}-���"yX'�D���LO�_)}�1����?����������}�����[���S�BBB�n��o�>	Ny[$���nTN�kj�6�_)}�.����4m��~���4�f�1�|�<v�XuJ�����;}��Y�fe�N���a���b�RRR^y��3f8;;g�a���nnn�������g��	2}���yX$�P�����%�'������j������~z���CBB���k����E���r�NER�`�EDD�������MW����e
KVIII��:I�Ln��)����f���������a�<�3��_V�L�I!��N�3m:�ov�w�^���&���r��/kY]�B��[����e��Z�vm��bS�)I%�sN��w�P��o~15\\��C��CZ�o�I�������7%�������eK���b��25��Z39%���S��hjn���!����*"���y-�~r���r�L�7n��������>�s�Fg�s3�����}�v�����|;��������Yh�%}���kfM�
9������~]q��5e����~=�]��+��3NpB��/<�����	Q���273���E���k��F9~���}�gk.��(�-��r������{��B&��U8�9�\���(����{���-�����inj�f||���y�j�q�*���q@l�qlLL���A�y���yC�yndd��cE�0N����C��])u�:7���a������By&t�������.�999+�&rZ\����\ .�+����J(/��maYr�[+L�<ww7��in��e�4S��k�k7Ls]\\��!���Kr�i���Sb����������sg����($��oT�2
G����s������V������'����%��~�n��!�u������m��qw��'��w�35-�������W��?�bz�3�Jx��n����}I1���U��~���S��^�!a�&M���A)���*?��u��1��i������������������C���.���x���S��i�������d�{Q_���S�`����ys_�nJ!cy�'/���^��J��/X���St=K����-����Y�t�N�����+�2�o8�7�������i3�-SF�*ww�t��������k��/%2W����i��1���z�L���e_7�����V�ZyX�R�J�]'�vm��7G���B�����\��5k��.�1v����8;;7k�������Z���JMMM��m��j���m���`�����w*��L���O��dz )5*���"��8p���C���������,�p�B``��LHH8~����[@@���X�@���%d�d�y_����x'��?�[4c�kZs��T�s�P���}�������SRR��??n�8�9f�oo�A�-^�x��)�n���d��+W6j�h��Qj����&M�t��a������X�@��c#o����	W-t~�.����+8�t��K�.i�^xA�����
���$#m�����g��a��������H�	�����D�����\��%K�X�_��V.�45c8�
)�.���`�������m���zy���k��D�����)gn�����/F,%J��S���~��_�`@�����������P��c�H��$�����������s��7�$���!;��f�j���q���q�.������5n�5�S�YP����t���Z�~��+Zy+�����O]��5����0�B@D�&�����q:�I���OS�k�~x�dc��b����B�y�t����Z������r�n=i����������g�d�����Y)�5=�o����F�S���������iMG�������X��@���+Z�k��������XX��'^O���5]��JL+�(x0w�[�'��Gk��4�P�/;�`#�+��/�8(%��V��`�zK����Y�M�k��VII	�.
��>��J�������nR���]�Mk�pp�W�UN���-_k���V��[@�#��H�Y�\�oj�wQ*�l�j`.1U�����,S�����X@A#��HK���15K7�_)���S�S���f��|�XL��m��o=�5�?������dB����^��5�7�e��)����Mm��'Z��Zi�Y���C��k�-/?�Zm�z��no0��������N���$������K�J�������~���\�����O�f��`���� 0�O�Y�����7=�V	(f`���8��NS3���J�BKS��S�f��@����ze��tt(U���v����AI)������%�KT)�f����)������|�Gk:\��}�)I?m�Zk:9��V�5�Kx��b��:q6����k�UKnnp�4���R7�e���,����������������]��)Z�a�s���?u��Z�����	[������H�S�.2���m!�(��m��V������qJO3�n��8��3�L�K2��>����>�����v=��~A��������v&2Fk�X�%��T>�����uw�/;'�����7L�^p� ��EC��R�>���,�T�q�O�X��"���uYk�;���
��o����r6/��w��j�Y�d5��"�n����lZ����������>�j�{Zs���.�[�<X�y���YNq�W%v�w��.���^�~��8"��$-%a�� ��^N�����E
�(:���>�IMI\��}�P�r�B��D��9~AkT�������&���t��Lj�,��������2�m �E�G�]�q~?z���?j��M�����4�g�R9�e]�i�x�Y����2�����nE�[b�r���}��s��!��A``�!��A``�!��A``�!��[�h��A��N�2e��	rZ*:::00p��5/^���������S}}}m���#���q��\����Z�j��<�@N�$$$�o������{�n����S�BBB�n��o�>�Z�t�qIg"on�����Ut�l�z�<#��S���#���>�?�������c��S:v�(n����f���,�I8r��P������;���<==m_d���nnn�������g��	2}���V;�[�
1�9}����tT�B�:��M����[���������Y�P�f�|�w��WO���5K���� ��EGG���9s���%�% 0 ��iii���f��)aaa)))�;�v+����?kM��>M�=�S�#�����Z�G��
,��c�����-[�l��a5j�8y���y��y������C�f���M�tuu5����&�111V;��}(|��.}�s���S���U0s'N|���:u��E����7m�����8p`�R�l\Ozz�\Z�~��[�n����i��k��������$;�XVf))����V����o����M��v��)�����(�:�_��q#Z����\{����7����y-�+s�R���k�����������?�/�[��������flll�����X}g��;!1Aq.�5��w������a�Cz�Lss�����;�HS?75��V,��rw���7o�w��W,t�oS��7�3�c�,�of����h������>���#�n�����o^���\�~�\%S��������>�gBt��17cJ�����owH�����4�(�dnZ�?S�3=��������|�*8��3��-�6��5��?^Q�{n�8&���fhhh�����%}g���4�+�<7*���u������f5��~u���C��N������f/�r�qr���q�f=S�K����v^X�_g�^�0�5�/���?-��[�?������{�:&�+�����~���V���l��������������V����f�}��fS�����k�5k����_��53�����d�F�:�#������gB�����8�$��`NN�JR|N�X��T"5S3��`�����Kw��]kF�&n:`�v�G�R������\?��wS����W�n�s����q�w���g�M������i��2+�����Z���S�fj����9J	�7�G�_�X�I�:ujW��.�K������pwwS����-[VI3�����v�4W�d�t�s)���f������hj�������sg����l��s*Q�B�D	�MG���wG����C3�#r$�����L���-k�P�����L��6��Gfg���*�o����w��1��oT�2�oy��3�-WN��i����N<=</e���c�G������}n����KC���O�+�����J�f������~g�o�����u�^��=��O�h��6�h�+�\Q�h�r�x���U���-�������c`��Z�j��d�;#�)�M7��AOw��8�gj�F��^���S�*WN_F�N��f����I���
��RzE�r3Yk����w���r�LJ�i�f���2���?o���l��.��u���5�����i�E}�O����y������B���O������i6���k�2e��rwwOW.kM�/��~v�/�4!��D{��u�V�Y���������(",��g���U�T�r�������yj�)'����qL+��R.��NH�p���rt�H�\Uk�^�"���D���KL����~��c����6����s�f�8��{����|jj��m����k�V;�R�*/�1���Q^�}�%)�����O<����>�R�Z���I�L��)3}���������__����?���C���+LHH8~����[@@��a���C�


R�,X�������6v(�����#�fj6�(n`�8::��;��'�l����O?���w���5k����.\�P���I�:l��Y�2h����O�2����M�6�x�r��F��5������={n��������aCddd������7q����k������t

�X�q�F�a��j8��@q@�F�9�m���zy=�R�rZ�jEB(F�S�cC��s	�������D0��l��_�
2��N�n��n�Mk��wkU3~[��`EYJJr���Z3))��� ��_�������5+���Sb�i����2Mk��W���XkVI�����Z��Z���}���R0��!��������k�����D�1�nv�pEk����&Fk������?����t�nf
`qR0��!��A``�!��A``�!��A``���_

�2Gk6��������9"��/5=>9���LKK�c1��y�oF���5���X��<_���������	�]��X�
�+��]�	��\���W�_9�@��P�#����������j�����P``���-���L����+�b��e�}��x�9rT���Jk��=+�w���"�@A�t ������ �k]��f���M��ij�6�/�)4��g������k5��W9�!�D����m��eK� �������w���\U���4�~;�+�e�/���y��=t��S+1%��H���9[kHl����G2���X��}�Q�9(�v�uOH��5[�X���k�z�����}���Z����7J�����,����ZQq�\��5+_���w7����nT�[k^�/���CE_L���$��,-=�����[�Iaoh���1��E����)wgY�b\����f�W���2�N0��@w�Ug^�>�5��wTe�Z9u����P�9`Xj��!�w�3Q�n&��j�Q��2%���(`i�J��+��.�<~y���\���9.q,4���LO�)� w`������R�i�Y�����m\���o.���5}=�������`��|�3>�Q����W��45���/{~��[	������%�v7�M��j����m=�b������6Y`?n����[^
�-���h_l�s����f��~W��n��a+����OW����~��t4�%�(�`@>�OLIH6}H�lBL��8���+igM����eS���GkM��e'g��y����^�5���DqTp�"�� h����0���h�c����4;���r��Li�_����[~|Kk�����[������^``�(.b�{L�FkVwu���?����6Z�V�����Z��F��9���m�����Z�f���S�j�v���qZkz�myM��9�P\���m>xZk��NW~�c�}��R/^k%��l9qAk���t�l:�Nyg�h���K�N�#��SM�VOI�t�@qF��� 00B�Fttt``��5k.^������k��S������"yX'�"�f.!!�}�����w�&MN�:�u��}��Ip��"yX'���fn������������x���c��}�O�>k���-��u(z`��.]���6|�pmJ�>}&L� �g�������E��NE,����C��i����E?�u��!!!���5k���"~~~�]'
��0%-Vk�����5��p��s���a���7�h������R�f5���%��\�L"""���������S�����%������v���>���t \k��m�<{�4{j=E9��>;Y��
S��6�9y^k���������><}����i���zAk�y>�X�Vd�2�y��\����Mwss�����<,��uZ5��=�����:�uJM4������w����CJh�KHUL��SJ�uAk��*]�����N^��x����Xk�)���3�4�������\S\;�m���nx�r��,��fe]I��ue���]�����(�P_F-�r�2�{\S������x��Z~.��6��J�+�r��,[��GWFt�f�i�2*z�����+�t������e8z�S��6WY?����j��s)s�������������/��y���*��`��e�hM�L'�|��]������e�z��f��QJ���e��xKk��)�m��Jy$�8�v����MJ���U<K(�=���tf���>�t����������:��dj�:�b�]-������{?�5K;��k�����X�����������nfy��Z�����W���2����}��^R��Z����r��t�*Y�������Z��~��T����6N��r��5�v��R���o��J��E����N.-��s�L�'�����aJ*����4���Y�9���N�\.-���*�GDT��t��+�TB��TqIU��f�+�x�>������8���Zv��YP�f@��Iq�M���_����igp-UK_F5}��o)�2j�(^�#d��?MG������/�W\��N�2��V��m:������JyVP��1����x�n���w����JZ�*N�����yo�J��W����K�v*������������VJ���P��R�^��4���������#�!��kr���C���vH_wG��T"��r����bL�������h:h��U")��C�_XE��\�K;W�6���n8.\K;[�?-��Z�?s��je���V������6u���jy�����V���TI��s35����_X����/�u��eKi����JM������5;pUy�=����V�lj���P�,���_X-�����j�����Ju]�O���e����uw#����n�&���r��/kY]�B��[����e��Z�v��U3M��<��}0S����������<�V?�������fZ4\����L��Nk�G�VF|�2���H�T�yE9�s	���
�2���a�(n����8���7�I_F����te�Q���9s��*�*T�����FJ-�A�ll��J������{����Jh�����o����-����j�d=�4tV�*z�2��������o�w�W�}���+sn�7���<���?C�k�t����`����3�+��y+.\9j�������~�t�������Ksq��*�LM�����L�9��!E9�5����O�C�7So���<z��3��z�L�;��?-�y�?���vGke����^��+#�b.��0;p�d.#=�|�<������{���:2�2�a�?S}3��f�������2���
E������8��>X�4�Q��������Dq0�~������5*4V�O�CG�3e���o>�#C7S����p�������J�����!#���ya5�?o���l�L�R�G�����j��i�ZMq��(��g������W��R��k�������"��+!t�����������X
�$����5����2���<��M�L<<<����R��ss�H���}��U���w�n�n��PePFa��2
a������\ePFa��P�q�+!�e������n6=,,L.k����E*U���u(�`�8;;7k�������e�����SSS�m�&A�Z�jy[$��P$��
8p������AAA��\�p!00Pm&$$?~���-  ��E�vP��
4h���S�L9|�p��M%k�\��Q�F�F�R;���6i��C��7o�q�0s���6l

���q�F�a��j���"yX'����
�E�����A���/bKE����"+�5(��e����0�QjP(#3�(T5(��e���U���[7���A
edF���22+e����2
U
edF���h�A��� 00B��� 00B+.���'M���{�5i�d���v�����3f�X�n]DD���O��M'O���aC���6m������?_�R����O�0�A���7r����g<���?7�v-Z4h�����L�"���J6l�0}��C�9;;��1q���z��\\\��^�zu�*9}��l�;v�;w����Y�f���o���ahe��s��M�����O<!M77���]�G�������5k�\�x����k��S�N��dp�t0������0��j�/����2�<�Z��Q-�a����0�pj��V�?m9.p��Z��G��b���0`����k��]���E9�v����'�����+��]�u��x��28��m������z*   44t��U��������U+��������s�r�7n����}�V�VM?��GD,^���g�����^�uy��f��e�����
�a��1��`6q����.]rww7��#G���/Y��k��V�V�3g�|��'2h��T���
+C��2����<Ue$�o��>���?��q���
�v-�d#<x�w����}������O�<LV�-(��#��2�9�����pj���V��1GT�esD�\�a�S�es8�z@0��i�q�����2
���V����H��_��<���>�������>���W^yE���W��={N�6m��u��1v�����m��i����T2c�����24)))/���<:�������F�y�}����W������z�����)SF����K�7^�d��l��)fS�������O�:�����2��p��My
h���:��G���{����`o���<.�������)���������o��z��?���2�Y�N�a��w�O�>k�,��0��j�V�9�Z-��#���@�V�0�pj�c��V�0��j�c�V�0�pj��`���j�?��QF���O^�d������Ur��:u2d�6������c��YF�V�Z�h��0�c�=&����Y�F|2VX�~�l�o]1xzz�����Z^#e�T�
�f�����v�J�5�by��w�=���=}��\��I
6tss���0�y���{����)2�����/^\p���j����)��M�����	d���3�k��Z�1GT��b��jQm��z8�Z�1�S�esD���� ��Vk0�pj�c�V�?��a���j�aDJ+������e�*�>��lJRRRrrr����,c���fS��=+eY����S������Z�����u%��!22R�*T0����7�.]�C�r=1����}���7o�����/��o��u���������'��^�*����[VClllLLL������<(�j�:x�`jjj�%
�v-�d�8t�P�6m\\\��e�����p_F��aKc�0��j���6n��>�Z-�����2�9���YPGT�5s8�\�a�S����V�K�?��QF�0���dw�����
����F����:~�x�:t�<��M����b��+_���9s���??**J��_�b`X
���=r���a�������t�I�&��_h0���]�v}���
���c�~�����g��U�N�s����Y�L�w�y��d����$#����%����U�T1�MDDDZZ��f��)aaa�5��s�#*�SGTM1?��v<~���dc��I�}l��}��1�Z�z��W�R�����z��o�U�V��U��-Z�e���~�I+��N�����e����F�'O��7o�3�<+�cj�v��\v��E^&_�uyA�9s����_~�ecj0����	

2���������?���<��:�j�����K�-�����Y�f{���1������p[��[�nV����7�R�,f��3����5&�����T�US��f{?�~\����I�,_�|��Ar0����%K��y)�r���'V�Xq�����#��9j����~�{����hV'N|���:u��������i���zk����J�2��������%K�h�y�����w�-�����NNF����e����v0�����Cu��-==}���.\����;w��f�#�y<v���={>���2rROi S�U�f�^a;�Vri����W1?�r8����)��S�z�,�%[��W�0J���'O

����Ng��af���^��c����x����rKV#F��M���ss9�z&�z��u��U^��E�Y�f�P�l����'�xB�R�reyD���y�4�g�V�^��n��|���c��ig������f�N^�
{m����G}���o��B����<g8 5yNH=%����S���GT��ifQ5��p�����g!9.Y-��u�`��_x��/����7��9s�����+��C=$���~����'���k�-�_�^�����^rr��s�����������2r�����I�5j>|�lgPkP?5a�U�V���.�J�m�k��6m��G���M�,Y����F�^{����{N����4n�X����{+U�d�����������z2��K�?B\pDU8�f�UU�F?�q�jv����^.�����o���5�.]���s�F�BBB���w�ccc�)c��-J�����P-����o�����!�O�/�����N���f��n����8 �L����:uJ����15hd�����K�]�����W2~.�l�%��s4YLjj�:XQ�2�{��g��A����Y�f�����l��Z���m�}���o�	��
��,8�������������K6�a�:	`0��5k>����#G��9���+/�+V�x��W�S�<yr��M������7�����m�V?E��}�������a��_~�2e�O���qc������;v��)�}c������?~������������/����^��15h�=*/��JGU�B���:~�x�:u���m��]^�
�?�[g���s�N�sSiii�Z%����0[��2t����`���,�p�B``�����*�f8����������ga8.�RFa��V���f������������7Nm�3�����2�OJ��k��T�\9c��������������ek�^�Z^�?�����KSC��)����V�j��4������O�l��������;v���d��p�B�����{� 8k�,����v�����K�(!��a5hd�(��S4�d�l���K/�$c�K�.}����M���o��-j��2��g�s�='���~�i��}�BU�g�z�4h��S�L9|�p��Me\�r��F��5��2�9�Z�c��V�0��j���V7�1�S�esD��YP�GT�5s8�Z�1�S�c��V�0��i���0"%�}�v�
��r��/���aL���De�%G�X�v������{������o�-S���^�1��G5��B�g����m{���7l�Y�|�~��M�8�v��F�!�-~��'�z)��m��y��w�<S�F=���4��G�;v��A[TT�Tr�}����k��F���a���7.Y�D�2��������F�����eG

�q���}||�
&Ej��1�c��Vo��#��28���0�es8�ekpD��A)�#���9�Z-������1�O�e�t�ZFa����q�]��+�0h�������]E&�����>�3���5C2���J���@�� Z�j%��F��-G*+g�c�Q�����w�QQ���Q�&^p������(+/�;�-�v��i+5�r�����T*�Pta�g���������m�����je.3t�����I@�v~g��4��q�wf�����>�<�<������E�3�)���3��Nx�NM��
�SS�����E��3�)}P�tjJ7T8���;����h7�9��5D�$`�0P		��TB*!����JH�@%$`�0P		��TB*!����JH�@%$`�0P		��TB*!����JH�@%$`�0P		��TB*!����JH�@%$`�0P		��TB�3x���rrr������L�\VV6p���j��`�H��������A������i�l\�t���/444??_vcbb�o�n� AAA���*�����JWWW�@q��	`:��?o��f�����G%	�����;�Z������z�nFF�/���b�
GGG�d��am��~�p���:o$:�h>3�4�xB��M��shz`���U�5�X��?��������T������'0���q���b�uO�W�0�����l	�l
���'$KNNvssk�Nr��F�,\�2����/��_���t���X__���b�nt����c��:���k��]}��!�����m[{�
@'C��E�eff���l������o�<xpDDDTTT�.]�:������_~�eEEE�^�7n�8i�$�����^a�,�����������#GdC�7(((66v������~X�'N��1C�4++K[?,,��������������n����;t���{��*��|�r���<(��������D�>LMM���())�]�,^�8::�k������Y�`�H�[�|��������.o����z���={���k�PYY��Z���+W�3fLqq��O?���(����W��Y2��D6UUUo������������$�����BBB���3���O��7���#�%�R���>;v��,���]ggg�9g��q��I�^YY�������l�2y������)&&F~J�:j�()�H}���/������i������~��%��n���s��	`K�?g:::Jd��:t��a����F'�����s��U*���?��Sk��9}���z�6��dv���������3���W*,Z�H�����g�v���et	������%��������%�����y�RYY��J���L�:u��A�jcq�Y^^.��������������A!�zIIICC���Gt�X�����U.}�4O[���n��
9q���=�o��F���&o��������'��s���V;vl@@@QQ��;w���k��ZHk�������0`���7�gg�)S�?~����R�.�������MKJJ�����+,,�����A.\�������eee�+���%Kt�i&�D��n����TJ��GM����q�9R�d���-'d93�8XN\�= l����uw]]]���4�����?~|�F�%	Xqq�]���6Kf7,//�����O�lu��5��^�0q	�N��|���[�666FGG6��������xii���JI�`:66v��5�:�5k�D��������8.`����(I�v722r��������+�������0���v����j���{�f�J����;�cV�����^����������0��K���������6�������\B����������n����q������233�t�"���]�F�����6�����y�t�J��[b:N\�= :%�h�h)o�=z�0� MMM�wQt)X__?s�LK��N�����+V����������~�kjjtw[����?j<z����H��������.p������'.�
������W�>}.^�(I�n���?��rk�f���vk<��3JIyy������e["�]��}����w���OEEE�~�,�1�a�����:u*;;���v������QQQ���t�����vW���l�h$�~F���U^5�}�7��h,zq��	��������7//����WJ��?���g�}��l��,	[rrrHHH��]=z���!�������/���G���+!!A)� F������-�.����������,X ���a���^�#����g+w\�r���������}�����I���Z~�����P5��m���6�w`���6/^�z����G_�zu������)))z���;WR��G�N�0a��I'O��|L�7���jez�{�����K�z���={���wo�������0�����������@B�@s����|���w���������555���uuuqqq�=��4<<<�-[VXX������t���O>�$((Hv;~���E/))i���'.�����b����#
���a�������9����o�����>}�L�>=>>���Oo}GG�/�������������������%��W����������i������8���������M�<�R]�U^�M&����K�c��S�N���h����+/��;w���;J�D��w���i��;w����+���������_o��EB���,y����%���os����]{/�j���r��8q���������^�f�������
JOO7���z�����Q___��z]�p��'2I��u���P����n��j����.M��~�7�� Na`	�5��i��t��m�F�#������
��7���F-4^��u�9q��TB*!�������3�,:kC*!����JH�@%$`�0P		��TB�<''�	&�>}���YYY7n�q�FTT�|��}�,{���^z)''���������eee|��V���=�����V�U�*E�����7�x���-11q�������3���_YY����ZC[�	����d��744(�����6m��K�.����������nLL����
$((�����z�� ,������5\g���^������\�R[[�d��u��������+���`���s�?����)�i���l�VM���o�N�������m���<��Y������8$�e�:K%	�����;�Z������z�nFF�/���b�
GGG�d��a�C�	`w�Kn��`����5��55�{�^�z�����Q��v�����:��5R���C��jgf��!�����m[���~,��~u�E���~,�5���G�5��=�#��m\2)meggH�fkhwO�8!	Xrr���[��
@'C���G����]�x�G�
H���K�
7o�|��w�9"����N�8Q�9s����e��7�|s��=�[ZZ������_VTTH�����7N�4I9��<(��?���033S��E��FUU��u�����j�?����o���999�����q�RSSU���5�L^^��E�R.e�$r��e��n��=x��������f�bFC3�kXh���Q��3f��feei������

������ssso��%�x���{��
:T�w�������CKFFFII�de�d������]�vm�����d�f���K�{���T�,���y��i2���	`K$��S�-����/����F�.HP��[o���^�~=--MB����*$$$!!����
$��IB(iRVV&����+W�3fLqq��YO?���1�S*���455����O	�F�%���B.;v�������J(��/L�0���3;;�����V���O��q��Y��X��h{"s���.S!	����{����k��������)�d�,�0<����+Y���lK��>����c��RGv%Q��s����P����������H''�e���6^I�������/+y�L���k%q�������%�F����7744>|800Pv%Z�`�����
���?����3g�t_�h����={VZ)W��9r���J���8��rss�%�<��Sk��Qn+������ri������.������_���$�S2����?/���AAAv23�5-�h����%D������r�B�'���4+%�6LR�	����g�h���J�������6��������S}���rXI�|||�~j{>p�@��?1u��A�I��M�Z�7''Gf/33S��������D�S{TG��d`�H�����XPP ��z*$�FQ���������yS)qvv�2e���������o�f�ljj��Q��9s�h��PTT�4Q��%K������y���#F��[��I����i��H�,��n�>
e[�#34:ts-�777	����qg�Y�B;�m��^h�c��-==}��iIII����v�����u�=������������L21����L��[�nyzz*%�v��
0�f������>\�P�v���]�'�|�e�k����>%����?~|��h��}k�4�j��w������������f������(�v722r������J��5x�`�]WWW����f�d;���vh�Z���&�q�����/��u�d�����)����GwWY���RI���766v��52-�f���.44���[o���6C�X�?c���i���j��tJJJj�\����&J��K)����k/v��\Lb�D�63m�����(111+�����K�Zkh�L�#k[h����ym�_����4��&u����uw�K�<x�-i6^���q�����f�������K��`:0�f(qgm���M��������}�{�����^���3M<���F�
%�Sh����1����v0y����+V����������>�S�Y��Q]�x��QQQ��`���aaa.\P�.;FI���8��R�;�@;"l����:W�\�-��G�-�V��}����w����G[^QQ��_���)5/^�(a�n���?������3�3f���&�1%%���S�����.]�4555**J�8�.]������4����,�3����w�����T�Z����IWII��IKK��!�QJ�������@�#l�����)S���������Tm��]�u^|���>�H
�	��;
�vAxx���{����^)9����g�}�Y����B��������B+���������aaa,��l��Avu/��!��=[������O�3fLk�],**�'MJJj�mFY����o?��c�������t3�#�������!!!2��eddH�r�~� $`�-Y�vmAA�����������?x����C[!11���#�������%��q���={����r������;����^�z���W�^��s���{JJ�*cj�xf���~�1c&��`l����������`B��l����|������������|���������������&L�I^�lYaa���SS��s�>��I�e�-�6���s%]�j�����x��/����o���������GR��G��'M�t��I��$W�3=v����v�O}w��:}G��a�s�=����J��c��6���?o��]B+�m��������>,�Q�>}��_?y�������[�$$$������B�L�>=>>����-c4O�p��F#u���������0c&[���ill0��Yhcc��9u��d��[Y��������$�|��w�B��v���i��;w�>���?V>.����������e�$~YYY���r�������6�r)7g��>�0\��k7��f�����m��I��gO��rss}}}�J0�$o2���<9����L��sE� $`��1�x�V,��-�v�����iz���#��A�|�g����D
��74Z;�^}M
�������i1Q�Fk=���z+?VCc3i�Q#����Zo��km`���
�4tK�u��S�����_�~;4��p�..��o^[�K���n����k���%I��i�}T�:���^�#����JH�@%$`���D:	��TB*!����J�Y6�\��IEND�B`�
bench-10gb-pct.pngimage/png; name=bench-10gb-pct.pngDownload
�PNG


IHDR��g���	pHYs%%IR$���IDATx���y������{���1�		�-��P��,E�E
IZ�����Pv�$�D�d
1�Y��0c�}�}���;s����s�q5���8�u���������g��[NN������(*``�!��A``�!��A``�!��A``�!��A``�!��A``�!��A``�!��A``�!��A``�������;�^�z�����g7������?���7ntv[�g��m�=��<HII)Y����S`;w�l���Rx���w50z�j�:w���DFu�����U{���w���U+g������o��I����z�)�|��y#F�p�I?��c���V�|��|��?H3222$A���C�}��G\�����\���Q#�P��h�b��}���-[V},���s�=��Wn��@�A�����{xx��SSS�L~���9s��H��/��S���srr������]��s�����/Q��<���Z�X1��R9;;[����v�w��.]������R�JI��`�n��Q�F��5����������~nK�.������[�)Z?���@=�����C�������^y�"
���H!����a�>���dBB����Y���_J�������{��T�gLKK;v���)S6l��i�&	B������L�3�?IR�V�����kO=����&M���?�Y�f...��^{�����z����[���������}��Z;n�={��JJ�.��Q#g���p[u�uc��~��7�����{��m�r�^�50���jc2b��'�|����=z�8r�H��Um�X�D	Ik�������v�Z5��%K�\�|Y��?�/_^-�\���+�����K��
`III�w������3�0��g7��r[u�m��� �(�z��I�i����k�&N��x�bG�rssk�������[�*ww����K���KU�x�GyDXxx������3==]�c�N�7o~���<(�%�>���o����~8n���z��_~�:�~�m�n��+����������}����W�%�}������;u�TJJJ��e[�h1d���q?��s��me������������	&���C������}��� �������������V�Z�^��x�
�w�T�oT~M5�����KzL�$���r����������j���/Z�H}�����aC����s"&&F�����;w.55U:P2��A�����_�~���;.]�$
�<y�4�����������2eJ���mt���rd'���:DK�l��
����SOIy�dw�L��k�Z����SAw�
�����j��=l�0�/_����>���td����[�J�[���M�|J��`�'��p��_|Q�0Q���]3f���y��-���
�xq��yY����K�(q�=�������&2���ZM�2J��Q�F�g���0	��/_��>DF��}��<�Q�����F���{[�n���{o`sl4U%M��*�U��u�J~V���o�����dp/u�7o.�X�f�<�-
����?.�Ar�Dn��)S���3��0@��z���JLL���?d@/��U���A"�dT������(wb�
�C$oK��eK||�������85w����&�l�1��<h�����`n�3�<#,##��_~������2����bz��7N#&&F����L����/����?20UL�\���O_�p��'������{}mdvv��e�+��K��3��e�d����`W�R���~�T�f��������^�t��e������$}�,�G��.|���2P��i��=�n���%�����O���������j�l����]�J����R_z��/��BZ��Gd8P����[6n����&['q��_�u�
�ri��Z�)�R����d]����3~�x�+�/�t��A6��/�|���n`����
�C�w�>l�0I������?�}��o�����w���&��_c�yr|�����`nD�F�\\\rrr��=k��T����C����$��PI��jYYY2V�p(���k�n����g����O�:u�w4h��F�U�V%%%�����?V��b����_o���~���?���W_}�}�J����'�M�6c�u�Oe�)�/CL���B]S?(��xkN�(�k7�b���Q��������T�#2^�r��l�6��K�g�����]�v(��_�^��D_��@\H���s�D��3gj��rx�y��&L0�H{��m+������6���h�p;D���OH4Z�v�.����9�`��6����"O���BY8���q�����k����uO}h�+����x��+��C�;vT��RL��7o��/�{C���<��c�?��~�����}�Kb�=����_�@��/n=��#�?>��gO9rDF����3���R����@.KdH-[�&&&n��I���C�F�G���u�J�<z��
l���V�Vm����5���,i��_� !|�A�[�H�X�����^s��V���#�{�gG�h�Q7��
�C$�H�C:!!��O�T�
T4�?��6���E�����Z��%''+y��M��������1&�g��:u�����]���y����I��V�5��;'��x�I�&�n`�������]�������XS����e(�{JzO} �I�8�q����5j�x��G�n���_���
RRR$6k��FllT�z�n2�Y7U%{Sv������HKK���Q������*�*������K�����'Oj���7
W��������7�v�N!vH�N����d97n4���n�����*U��[x�m�v�"Ovw��+r���!���Q1��A���A�����s���{��w?������~��=vo^�'	Q�N���L�0a����j�K�III�.\�����0T���/�%��l����,66V�j��������������^3�:C���j�*���oa�9����y����Tyni����%K��92..�&��v�Z~+2�}]J>��5Z��v�V�v�����O?�`���k���W_}����h~��&����y���_���
0�����_���1���`�V��l���Q�'N�?~�������_/onR�b����#Ft��]�;�����x�~���/��I}_"O}��LK����{���'*�|�����_�t��o�y���d���O?/^\����v+6�FS%�0@V��S�q���{�����N�^�zDDDAW�~0��0�
��7�v�Y�w�b����111�t�������#/��B��9?���w:��j�*���������,��x�		`�Qn@HH�
�5p�@	`			����m�gG��R#\��T\�|��&��8'�x��Y	N��777���S�J���~�����g�y&�w	�ll����R�6��?�P��M�6����uIF����������g�7y��~��������!�U�V��U�n����}���k�J��������S(m��a�����nH�������
����@����C���#7��R�����B��SO���
0��.�������@��0��U��'O�>}���C�i'��g�`.--M�u#3��#6l������z���O��u�V���uPB�6e�i]��e��K�>�����G���s��{������?��2����jo����B�������i��IW�b���M�9?����_��%K�N�z�����(m������)}���\�y0��o����;''�n��o����3����?�U�~�BoUJJ���,X0d���Of�����$��7>>^��'~�a�+z�����_~�E�+�Ju_�QJ�:uJ{����Y����O>��g����_�X]���&M������#��M1}b�}���7o�7o���Z�j����;W��-���_�U��7�7�u��~�P�|8���0�L���y��'d0�w�^	�w�y��)����M�:�K�7�fvb�w�������e�	r�Jx��S�&�<c�����q���_��dTs�z�����0���!�����_�h�z222��+'�]����,����w�}���32i��no�o��u�V�]�ty���7n,������?�\����*V������o��@m�R��s�='��<x�_|������#P
�\S��<���$��+W�w]���?e���kk�n�������/!PF�6l0�����~8p��k�z���xWH���{�eggK�D���z�$���[�
�
l�
��5���z���_]�x��Q�F����7�C���$�x{{�~�B?�-A�A�����#��|c�����w�x���i�����X�����{6l({��w������7���os~�1l_�����o_�n��'O6LN�t���Jd�P'����K��N�F�7�|����c�i����E��k�V�\�����2�W����6u��������m;g����G����i��J�.m���������~���/�)��l�<y��=����N�:2V���4@���@�t����JZ�n��k��%}(��^x�F�x������5k���4^�#��p���
���2���)�����#��y����|�M�F�n�����2e����o�
3�������l<�@JJ�d�2e�H�^�t���?��3�v	u=z��l��q��	��/��j�@9����>�����^�zu	-�����/��dAAA�������X�b&�J��j����7�f�ucJ�(a�����.��b�
9s%j>��3�/��O�`R(�k0yK71O�,YR�������������t3�(G��2:��G��(\#G�l�����k�.�J�([��D/�������8�0���ces���{���U�ZU��^����)QMR�d?��<y�������>k�,y655�\Sr���O>�d���RS��/_�s�����{�n�&�'�|Rb��M��q����YS�'�u�(���w�?~���b���
lT~d����S:m�����m��j��A��
*HJ~������Yn��y��={�DEEI���
��������|���
:$G`@@�DiX��-���t�;�Vt�Jz@�#3���<����fU��1l_���7n,�;u����7GFF�UN���/�h�'+����9~7���Q%�����Q�~}	����s��������2~a�+c�+���|���z���>�]����i�&y0l�0�5u�6��2��8�Q��*I^���������K��u��$�����7�$���n�t���]��N|��G�r+:DH���C��9?��Q9�/�T�t�+2�����������
7�Pt��?���?V?���kWg�����c���c��������
����BCC{��q��U�V�#G�4���������s���u��1bDA��C��1��)��Q�F||�SV

�!��A``�!��A``�!��A``�!��A``�!��A``�!��A``�!��A``�!��A``�!��A����?���C�������o���{}��������gq�@�Ep�|}}�U�����N����y��y��3g����jcQ���.\�x����322*U���c���J�*]����?����G������Y����=zt�����8R�����K:]�fMxx�l�l���>:j�(�4]���g��[�n=}���k���)s�w�l��w��m����<r�H����%���R���������#���m4�zv���G���e]���<�MJJ�X��l�#�<���?�Xx��]7l���B���{yV���[S�L��TkW�^

�%\�t�\�rm���#�v��Z�]%K�LKK�r�J��e�k��e�����.9#�X���_"""���K�*U�j���[���[���fbb�E�V�


��r�����oV�^]� d!��(,,�\�V�D���S�v���J�.-OI���?����K����c��@�Bp��01O�����Z�j5m�TW������I_��w�!�����d�������g�|���}����N�.��1c�dB�o��]�v�?^Fl�6mrsss������������;���:������C������}�vm����/_z�����5h��Q�Fqqq���0@���%e�>�h'�d���%K������]���\�|Y��2|_�t�$�v��Y��b�
�t����N��o����HOJ���/o��_|!d��[h����H���o�U�^g����#+��{����c���.-�&�c���YYY���{��'|||bbb~��7	�r �_�^R�ZS�G�V�����%aFb�	rI��.����,A�Y�E�Q?9��[z��c���������[��L�0A�9��.���������q��5���G����hFJJ�����dpS�B)IKK{��g�p������?p����U�&#N�JIjjj�n�6o�����6��:�b��9��^x�	E���3g����2���m�Z"�@�X���4i����j~;133s���#F������-K�.��;�X�z��$**J��!!!2�}���l��zv���<z��O?����2N�&�*��_��s����T�5��a��G�����s���e�$d���v�
4H�������%�f���}��]Z�


��Y�������~�isyvv������>	S��;��#��O�>r�H�WL��Z��/

��������>�^�dyv��q���Sn�ItK�=GV'G��kr�t��a��-�3�a�E
�
�}L}���������i������D�%$EH��w�Z���%{�_]�C%����>��N�:�Hu��Hk111<����ge0�
� �K1���-����0����*_~�e�A%�ik���=��S���{���$��`�����u�?����m|���R�JI�Y�r���?.9J����U2����c��%_M�6-�q5m�T���E��������G}�����C?��S��]��KH����v�����o�[��Y�������������������I��#�b����{����������[���{K��={�[�N,2y��e�����T?U���^�z�����\e��qp�<(��Y�f�C���U�$�,����;�P���Dv����!��+�H�K0�orZ
2Dzi��	j��;�l(�c�U�T��$����o�Iw���*�-@�P�����+��������eo5k�X������C��?�������;��?��`��:�����=���2��!���K4h�@��_�%�bs�D8�[�~}uR��	z�!]�2�]����2���?/�����������d��o���e��Px��k������������/�����k����/d�e�0�e�0�������h���k��6k���S��Z-|���###%S9���k�w���+V���,	0<<����{���$��i�f��^^^_~�e�-�}�Y�H]:G�O��U����x6n��{�n������ ..N��|"�\\\$EhK&O�l�i�b��n~�x���$�m���Bn�IdW�{�{��7V�Z%����n���BPX��t������o2�-W�\���y�������2(�����wp�2n�������7�d�t������ut#���u�AAA����e���#���������$C�o>��d���b�edd\�xQ���E�����_|��u�����P
��c�v������w8p��?����X�~�$�I{����2f5j�
4L�N1}����>����$��*U��G�d%���\���6m
��T�NY���I�&v?��%QG1}���?�0����c����%�=���)))��%�����^�W�F�~��g9�����+��r$)I�9��f��I�������l�9��%�@���-[�����m~wK��?�����k�:�%��$rD�{�����wo	`��m�oQ����!�(��et[�R%;�H���_�p����w�����Q�:uJ��}�����cbbd����'���W�:RGW>v�XL>��w�u��B��B��e�J �Q��^saaa��F�����``���&�F���[)�$[	����?����.^�855u���Je���e�={�����{��^���
|���s��5/��/�PL��'O�y���b�$���%0H����]��O?����!��$�JoKS%9o��]�J/-]������K��_d��)3�W_R��}�������F��,X Q��&���o�������U�>��C�j�+���\������
&G`��������oJ����[t�V�����+��&a�
}K���p��Y���o����1c�1nJJ��A�V�Z%�����;��?������JKK��i��f��Q���;i���L�;RG[��'���9�W�^$���INN~�����[iv�N�$8p@F��=��l�z����$�t�6��2j�����L�6��E���W������}�������g���?���)��X�7�~���&kKd�\]]���o.�%�`)�����\�����Q�6��)��7o.i�Xbb�b�ZWHH����j����������)Sd/H�����@�U4�U��!�]�_�}���_��-e��r>,�~s��N�:��������[�s��&���LC��sA=n����+�[TT����@�S�N�������|��gd��[q�p�9H�bs'����
0��um������$oH�8s�L�5t��~��wu�s�|��_|Q���o��_�.\���[7L�V���d�u�%���~�I1�z1�!�
�&M��5v�X�;�I�|�I���G�������x��G����n�~��)]���/����8[���#��o/C|�?R�����%���]6�:l��E��X��H�}���#G���1cF����6����-R�7�|s��5��6Ze���@�R��%���.\(�[�(�7y�1&k��h���$�k���/������e\������(���������b������7n���?�����~��W���g���Y��a��9����[q��	�~���@'�5�=���?�W�����,�K��u��R����\��Ac�@��;���k�����/��pV"��Y�5j$�����m/\��U���#u�U�\9��c.���e�~���!C��h���?O��W7����c��5�����g���UK:D����u�?�|�c�f�vW���*�����ZzX�������7������<y2$$�z��A�h�)t���y~����_���5k�����
~��2pWox�$���D�%d�.{?<<����t���	F�f�v��yjG���>���/�9��I��}�p}��G�@Z�xq~_M��y���[�n���U��V����P*��C=�����@'�5�=8p@1u�b��X_�Z�ju3[
6��Z��|d�������R.9���?����D�_Z6/�x��2@?u��������/��s�=��1�t��E��|0n��>}����Cw':�G�����S2h��x��iI�n�d0*�cI�7�&�5���d,[��$}����:u�]p��q�=�$����>>>��ts%%%I�,X� �A��A�$���=z��m�$}�����z�����722RW.����+ec^iFbb��i��|����K���68�d����qqq/��R@@��,*!!!�[&��������%�������S*ko���>>'���|	��~��
�������O"�n��gWjj���h=z�PL_����T�[
Z0�@��2��x�����+W��<yR+6n d�.�+00��O?��".�}��2Z������u��AI;����.�#uT:t�\'����~����{����;��D8��������Y�\.�<���x�k���+W�����S��5�����N�8���/t������^�v�o���'���e����5`����g[�U�n]���w�}��>���U�V��~�j����X�V�=��c�-�E��SI���/�Xw�<-i���[G�!)���3�/���f�6q�Kr��������,&&�����C���[B���g�;@�_�����'���D�����������IB�m���[[/�pO"G��c�.9��zr����~)A�p��`
��.��C�F���g����HLL��nJJJ�n�����j���s��i�������|#���6Lp'N4iD����+��|pG�h��~���
6

j���z�;��	C�>��3����SO=���_����2��'�dL��?�H`���b=�\��M�6��SM�0A�����G�����Tsd�)��g�	����8��>��e��^�z��R�@�=�@;��4h�de��Z?+]'�g�7��;��S63�U���'�|Rv���~+L}?D��c������k���NDD�4Of�|+�3g���q�D}���|��qj
���6�H�H�m�o����19�%�i?�g�����~�>�c@�UI�[r���5K1���u�rF|��Wj7J���������.]FU?}��k"��$����=������j�*��+V�~����T0�c��y����/�o�������������K2�S��������d�[?+��+W���K�y�����w�=�t��QX��m�:�{�6���#ut*U�$�<�y�=���#G����/������#����M���/������c��J�*%R�������R��C���O�>2��xv���V�PA����3/^�
M�4�Qf�f���k?l&)������������W�R�Fo��b���'O��+C[�~�|����U�V���s�~��z�-�K����d��O��(bc�k�3��w��I�����/�o����is~7���2p����i��|}}?��C���*9�
�3�*9�di?���t]������#Y�����0�=������P��^{���J|:y��,D������^�c/&&�����e��&M2�Z��'r�I�m�����saaa�@����3��by�:�-:�l���J{��E������Qz@��5k��6F�o)�`
���<(c\hn��133�V�Z����G��o`���������{����9S����7����9s�H�����]���o�=l�0�h��::O=���!C$ �e�f.���0		�����
6H�����Q��/e��=��dx-�lJ~���g�����@%�u��Y�+���aW��[g�,Q����������+�7��Iv
>|���������dk�{�_�|���k�.[�Lw?=�se�$�ho#��_��xv��	r;w������:t��Sz5����;v�@Y��\��W/i��M�����j��)y[zL��yL�|���m��z����*�0f�9�\����,P�������K��/aLW�/�}-� ���9�~��g9Ad��R�xS�n5KLL��H����s��$����=��L)V����Hr<��s�?���B�RP`n�tmI@@�{&Z�������2��:SLt����'O�>-�'�$�y{{��(k>>>CM��l��Q~72q���%�NS�8���q4������������#���~�Z�:��{TX�����gT��l������&�a�-��l���<6���������&��I?�=�n�$�vK�=�j�����U�-�`P`��G�
�u��3E

l���6��@����"���o�9�	�t&�H!��A``�!��A``�!��A``�!��A``�!��A``�!��A``�!��A``�"�222�}��3f4n�����6o�<u�������7m���w�y���������_�>**����s��S�L)_���5���v����!C�������s�����Msuu�.�{��g��9t��4����-S���'���#q%�
��-{������W_}5--M&��o�c���-[�����m������G�o���[�d�<��~	Ny.��,v+4�X�b���)���������y������a���{I_���������M��s�=�v$�XW�z���/�,)���~+U���:�Q�F��/W����e�����c���H<������Sg����J��b�Bdd���;%by{{7i�D����Xll����G���y���)��������^zi��i��Y�t�������/Q�F���8ur��^^^����y�^�z����R>s�Ls5-����!%U�TQ��[�l1�3f�������o�C��0???�46*l��M�L�v��q�I�2e��J&>��u��%Kj�j����%K���$��hw�J�*�����-��6����%���^�x��1OO��v��f��'$D;vl��{����S�Z�w�}w����lDD��)�������Z0��dff��P�vmy��Q#y ��j��� %%%00�_�~����w����>��33f�psc����z�����S�N}��y��W���f��9h�����a��%$$���K���������`f�@���� q�y��}�Q�6m$n��M�S&L�yg��5~���k�._�<==]�]�lY))��P�`zf��y��G�w�}�;�����/�7WNN�����#����0�|i����<~��g���w�����g�^����o���C���(����{���y�;v$'';�Bf22���or!0=OO�����={�K*V���c�����������J^�t�%��:vgqd�M�4	

�d������/-<xp�.]��111�/_�W��:W��u-Z$1��.#m���o�7n�(K��Y2f���������#G��~�8  @1}��N�:nnnaaa��$��Z�jY/�Z�j�g�P��#���]�zu����3�Y�HJJ���S���������L������e��:t����7�;wN1������Y3� ��|������;wJ�R�����,Z��3g������+�QLo�)��M3�A�%��)Sx]�p�����?o����z��~�$#%��uk�z��7����!C���'M����`����H	E�djjjHH���W��5���=��
f999���-Z�<x�Z��� kT'�;V�v�}
�1�\��k��?��>����x���q����_����I�&�F��5kV����t��l��b���7����'9r�i���|�����
�=Z�p������k�n��m�b��������w��Qm������E�:t�����f��������pS�\��wopp�y���K����K����~���?���a%K�l����	��Htww��y��I�$#m��%  `��AAA6~
��,.3**JR���u_6����kW77����a��FW(dE.��3�]���%�$�
���M�|�~�������
�B�
������Ml����\g!��A``�!��A``�!��A``�!��A``�!��A``�!��A``�!��A``�!��A``�!��A``�!��A``�)�,##��w��1cF���8`���Q����3h������������_�����s�)S��/_��r��b�Bhh��!Cv�����9p��i�����j���{�3g�:t����Fz��W���'���#q�nM�fs�������m�V�N�=$��;wn��%;v�����<�cw�$+VL��<�����_�o�����[�n��
{��%}��"�����6mz�=�H��c�fff��/�(5�=�-�?��<v�X��}���{��:u��Y��\��YlW�����s�D,oo�&M��S��/7��������9�y��7�1n�"�$V���K��M��f�$�^?��c���+V����z��W�%�z�z����|���...���;��
RR�J�)y�e�s�1c�xxxL�<����\����Hc���s������{[)--�����[�.Y����U�VK�,	�Q��nQvg�T���
���2i�v999j�����/^,y�������<E.�9h��!e��}���233��~�U��������Z0���*lW�]��<o���<�HV�jUy�����_?�jC�����\]]�y��3f���g����<|�����o����K�.�}*!!A�J�n///��3�����n�[��7������is���m���cyj��	2��Y����v�����������G�������E`z�/_=z���>��K�����Q4�,�Y������G___y,m�����C�f���z�j??��+W:�S�N�l����.]�g��cGrrr~���q���p`z#G��������������;]j��lAgqd�M�4	

������������<x�D��={���Hh�W��:W��u-Z���a}���m������
8���P�� �Y���W�^=c�	0.\P�?%''�d�2e�U������Q����U���2��R�BG����R�zu����3�Y�HJJ���S�������y�AND��}�v�;�D[����7��>}z�f�<(��|������;wJ�R������nw�-���3AAAs���X��L���_$S�(QB�b!u	�BC�0h��GyD["��W�^���1b��fT����<i�$���"##%�����!!!^^^5k�TK��b��YNNN```�-��������c����]�@�F`�"�v�����?��333/^�8n�8u���_�k�����J�*��H
0`��e�'O>r�H��M%�|��W
6=z�Z�����7n����m���n�������������o�E�u��A���5k�O�^x����w����`���K���������ww���7O�4I2��-[F�d�������2���$%N�8Q�e3In111]�vuss6l���0E.��3q�����z;x-�E�&y�R�~����HQ�B����<<<�������B��� 00B��'��Q��jQR���W�I��Q`�df+��-J��A��#�@5������2O>��K������Q'N<rl�y�j�ZNl@�������2O��Q���Nln�!��A``�!���K���k���u�.�~��������)��iKjT�K("``�!��A``�!��A``�!��A``�!��A``���G�h'_x����8�1��NV2�Z��WR\�9�5�M�@Q�pM;��������-~�r�U���w+�����``�!�@��w����EIZ���@VDXFF����;c����8p@����W�M��i���������M�N�8�A��
qqqAAA��������������)S��/oc�vg�]!44t��!�w����8p�4���U������9s���C���7�;�������������ZS8����3����w�h�l�������(��'O���G�J��FGG���aaa]�ty������W�^�q��;v<���R!55�m��uz��!����sK�,�g���/�)�e���n�A�+VL��<�����_�o�����[�n��
{��%}������%����=l���M���Zt&��������M��s�=�v$�XW�8qbhh����K��v���[�n�����M�������y������Vh��}����N�:k��<Wjw�"##w��)����I�&������,66v���#G�l��y�u�[�����LIV��M���")���C``����'�,U���'��+Vxyy��J��3����������3g���X/��,�+DDDHI�*U�����-[�5�����1y���
F*r���O"��
�g������gdd�-[V���>|�u��%K���i����%K���j������,�*U�]!;;[&��.''G-?������%�yz��?E.���H{����qDD���j�����%������,����+��][���7j�HH$�Z��<HII	����D��C�~��w����<���3�����m�a��v�z���x���_~Y&�o���u��������`w�$n5o����>j����'�m�&���	&���f�?~���k�/_�����O��e�JI!l<�BE�e��Uh�����_�xq5srr��awm����������W?������;t�����W�^����r���C�v��I�������K�`;v�HNN�ou7nt��EG����-K�o������.���]��={.D\������/�&��EARq?����$!��5����@���P��p�r%��
�����rqS:jK�]�$$$p(����&�g����&Mz���%�������V�z�K-Q���;�#�l��Ihh��������333��K��={�����^�z�\u��]�hQFF��]F��m�����-K��;�2��G��v��)�oxygC�����e���<x��[w~*4w2  ��_������!f/�2��j��q$��z��6�u���t����R.,�\6�W��zZ�r��E��j���8o+���	`y��%�f���������3�?y,77���0�,���o�Z���fw�
*8�L�������U��z$%%�_�)9Q�������L�n��O��b����a���:�9�2��r�p����(u���K�� �K�����?f��S�����5;x��������v��)AK�7�
�R�e�9s&((h���+^AE�E�"���D�e��Q��b��n�������o)�j��\��D��N&WqZK��A�[�~��~8j�(��������!C���'M���,X� 22RB�:������U�fMg�[�,'''00�E��VK���d����c�j��]�o�0F�`�v�����}�'33�������S'_�u��c��O����x�
__�,[�l���G�i���$�����a���G�V��={�q�������m�Zbw��.\�o���G�j#V��}-Z��C����5k�L�>�0�@!)rl��������K�.�',���s�x�����:T�������'M�$i��-#F�

��S�vgqp�QQQ�'N�����$�����]����6�F��-T��8����&�(�$�g���o���8RAT�P!66�����c����p�"��Y``�!��A``�o��O��`QRq�������$���,���1�y�!��6ig��U%��)�O�#��"��@����|b��wq��*�pu0E��$�dL�d����
��k��(g7@QEC�������C���W��5�����P%;)w�X�x5��3��$��-DC��}��_�d�l��A��]|CI>�;��V���y�[`�?)���~6W[������m��^ 0�����kV��-y���	`��C��E��y�R�R��6��������Pt}�yibR�y���@�����e�NsQ�w^k�a�E�bb�d�?�k
�o�E�����%���ZS4�-����_L��0�z�����\JV��s'��:�)�y`�wu����%��W��xP`������%INj
���vT2.�N�T^q^k��_���d��[H��#��\v�r��EI�k��S�i�� �@��d+��-J�����Hx��;���m0@Q��aq/J�G�YN��{ke�8�)�m����%)�NjJ���q}_�%�@QEp�m�[9�;Y��5��`����>��y�~��/�����"��(:q���c�����K8�1�s�:�gvv�y2�lE��Nl�e����������qg5�#��_%�W��j��J3W'��M��k��Y��%_-:tG���jO������r�u���
xn��g�wp�v�k�~�j	��F��Jz������t'5E������N�)��u^c�+22���iKrr����p���~����$pk�����0]�����Y�e����I�2\?���e)�����P�^U._�(��@q-�����(��$%+��:�K	������J����n����O�Wvo�(���R��V��h�m1�v{���Z����
���,J��[�,����G
(��rUs�r��;��_�8{TY��E�s��`��*)I��u�^q@���+���n�RQ��;�~/(�=��=�Xrrrpp����cbb���������'Z|�`�D���RI��;�^I)?�y�q�+�(I{r'K��Tx�F�3�����Q(��������W���V,_������C������+�kJ�`c���?~��5+V����j��M�����%�Y�T����h>�[�?I9bqc��w+J�`i�����TP����z�>��i�b�����B�t��/V�0O����e�U'���ct���o������/�^EYV�~�����q�.*k^�����j~�����p-�z�O�LW��-Jr*8�%PpF������z����#6~i1�P;����U�`�5:}�t�J�^�NFF����;c����8p@�l\\\PP����������;w�<e�����;^��M.344t��!�w����8p��i�t������3g:���~������9Jbl�d�T���v�������}ov����d�[��R\��q�����U*�T�r^k�<k�\�M��U��F�9s����k�~�i��

^����'���#q%�gSSS��m+I�G����;�d��;v���_r�#n�2
T�X1�f���?\�~��}sv��u6l��w/���������k������&��C9�I�d1/��Q�����JTN6�(������s���'J�K��lY��,'[I����_("�"��e�_���l����/_n��Q�r�t�?~�V7 >>�i����s���1����/O���{��o��w��S�N�5k�#
}����;w��������Iyj����;|���#G6o����	`�������mI������J�����`>�	ai)J�?���vbtKHH�\�r�*U^�Yff�K/�4m����,Z�b����+��b.�����o�-�3g�tqq�[���q����N�[�l1�3f�������o�G�p�%F�j���J���k��(�J���k�%�)|xV����i�[�;������E�Gu������d\�(����1	���%u��Jg\2Oz���ww��l���v��m������'�&�g���>��u��%-^Nl����%K���*U�d�B�5
}�����]NN��'�~�����K���,XG7#y���k�����".�����fhK��zZ)N��U�aQRc�R�.'���HLI��d������}J��_/\MX��/m��Y%l����'��/Y6���a�GnI�n���H�_#�f�z��������U��F
\<wg!6���`f����.]�P!��r���j�NDD�d�j��?}�����fff��`�n~��k�VL=��Q#y ��j��� %%%00�_�~����w����>��33f�ps��=��������'�T�����XNw��U�����*
��\N���fq[����\�^(`���;9��y��5��]��r��B\|�����Y���uv�V�m
���r4��V�x	���P����-�Y[2�Z���;l����7s�����Jdh�d�������n-'�E�M�4�����	��O�������IHH���K���{y]��t||��
�b���7o��G�i������m�����	d�Y�f�?~�����/OOO���O��e��6�����������"�������p^[���O���!��,.)�l��O5�~�?9�&�����<j�~tz��oE�����]�/:�=�����Bl!�!��'���4sbknHVzFzR����O�<?�����>��-�����G�������|�th��(���~�<���
�y������/-��/-��{�%�T�d	�+����cWs?��X���ZNub{n�|���
��'�(s��[��"���yc0��yM�w0:�IH<xp�F��{���+���\�pa���=z����;w6�=�v*��@��\������|}���>�l�~�:4{����W����\�r����:u�g{���t��<��;�����U��111����/K��[d�j^�X�ir����9�������t�����j'e�moc����-KR�RKj�T������|��p�b��C��k�W��III�U����BDn��?��m�D�dm������\���k'��P��������WQ������;���c��ngff�i~!$$��>[K���X)���	V/U�:�Z���n����/g���67!��K�o�-IH�h��N�RG3����fy���c���7���.���M������u'���+�D�yr����;->����h]'���ob�������W�C�ut�Q�S��%���;�?���t:w�rZ������B�����k��;}����^�[�����',���/K���oBB�.��pM�Co�s:#���sg�������q�\L��W/��U���
)e�)�rg���%��d���\1O6�L9dY_�	rY�s��&\�����8�u� g��
r����o����r+�n�S(:;b��g����*���Vh�:������� g�y��O�.������������#��)e����w�t�p-)s����
��m�y��y2��;��X,a��q�7�����6����t��=j�� �5��p"29&)�<�W<�>�m�fu����N�={j���i+�z3<3:����<Uy������g��nB������^��RRR���/21��+����e]����^����
/P���$>>A�+(��G�
2l�N^����2�%�����\�l_�B�n����e-d��%\��G�����]6�[k�������@��&��%Q.��N�;Z+������Mr�m�%H�]�V<�M�&�k���N`���J^od�%�&�+��e6i�$44T�\^^^���rTI����K��=����c�z�������h��������m�6�
��Z��c����Ha~���~�}�[mI����l2���
�%��X%�����;^�y>���c�Co���W�6^�����{c��9q��K(Y�����j��Y��i%~��������Z�l�����I�}g�VB�������\���V�+i�v�����V����NtL�	vw���������g\5��#��Z����5������7�t���o(	�S��g�}oG����C��\��O�d�:��V����h��NH8���;�VL���_���$.UJv�����G;�����[������9��f�F�N�}�T���E)��5�F��N�V������19-w��\�{�jY;�����Xm�S��w���]`j��G,��J����������]��U���W�=�y��?����)�%�t[���h�S��r?_P������(�nni����U���`�_[������)^%���V(�l�tM����]v_��hX	����.t���Q*��7m��{������`y(�:ANhm���|����_1�k���wb���7&^�j�����hYA.�%�p��Ma[M�~!���2�O��7�|���	���^�������&�N89�������*��w�����2v���=C(�����n�\HuG��e��w���/w����ic���X�G��W�l�RgR~�>_v�������������wj���caW��?�#�n�A��fJ�f���J[���e6�p���,[�g����%d&�&���_h�����9~A�����L/%�`W�G�K������%%w	nn������\�~wW6X�*rY�uG�2S�~�������-P�r�B#�h+t���z���ILI?u���g���N������t���%�N����@��h�P��0:��8qb��)��}�+�~����X������0�7%�(�#�B�
�+��eJ�U�^]}<s�LyV=��������D���NNN�3
���g��Z�-�{�E������������������������1��9Kv������.w�q=��z�@����cr�'77��p����v�i|�'��*��tbs�K��:i1���,�����^�)��Z�w���d���r,���O�-�Sm������k���+sr�1�7W�����������,��{��t0w�������z�@K�������P�x���������T��8�	���_fZ���T��nJ����S��Y���B�{[i��s�e��S�g�f,)����i�n������)��;R�l����_��x��1��j��0:�I�����.��~�������5kv��AI5������s�N�Q��/�V���<s�LPP���s+V��
Gu��d��%J��zq�9ym��7*^������lE7�|$��[�4�R��Jx��,n

�*���S��Nl��<��7�o�O��<���q�����Y?���_��Ic��uZ����������^�=+=Cw��;��x�wX�
>�������<������aC������2$88x��Ij��"##%�8X!555$$����f����L3�����-Z�<�_�����5�����]�v�������_�[�����E)�[��D�����}r�v�V@��Q�w�r'������28[x��s���(��?���������c������C���f�,���q��C�q��u���~����*W����v���o��F��1�{��k��?�o`���y��Ei�:�������0`��e�'O>r�H��M%�|��WG����F�V8{�l�����k�m�6g�[�l������;z��6b���w��E:tHJJZ�f����oM��r�i�b,��X��Wq7[_�=q��,��/�u�����6zz����kP}�kHLB�K��"ck��>�Jdb����O���
w�N�����
������s�����6�����BV�'=3�l}o�?�D�����F�`t�����U��z��Y�f����#��;p���788�<y��%�����%����o��y��I��l�0b���� ���V�VX������8q�D���$����t�����-00p��a��W���HD�w�jK�.���r��3����a�������d���o�����F�����"���Wm����p�s�d@jn@������$��N��o�r��zz�DDDDFF���T�R�R�J�g+$�Ll���lrc���o�}��\��B�
��7Wyxx,6�1/��V�W(_<�;�WF��'C(����f�������	�+5?+�R���k�7�X�-z��������~��wc��3(�efffgg��Y#�������,�J�U�1(�8p@�(L�o*��o.$5s^S�|���;~��'5j�����ws��5����LF�rh�EQi'��PPF�-[����[��9s�/��Aw'�*��jQ�Qc�4(�X����-[�tuu�>������z����0�ql�������1c}�Q???�S...*T4�1(�����#3%���3�:�}��Z
�n���`�M~���9s���YS�lNN�z�D�W�<�;���f���
w�l@C�3�;`��fc���/�����g
n��&��������������������s��e��q�;`�?�xzz���f��3f��s�o0:�M�8�a��_~���w����y���?�����4�1`$��_�������W�\R�|�i��
2��w��>}����������b��'K���Q����"F���,����{RR���w��}��!��+�����7>w�jm���Z��4���+f��n�y�V��k��&�%��]w��j��N�:����/_~���M�6��������
���_��3���e���:�9p����C���Z)��XV��C���I-���7��+����������}������r������y����opc@A�}`���O����VJ^���S��&������m�(�)����5�X�~��������qPP�����L�"�+T�0w�\�Fr���=���>\�l�]�vEDD�����]�D��7chKKK�����Q���ic.�V���mg14��(Qb��}�N��0("����9s�N�Z�n��~��������V�\Y�T�Gy�L�2w�qG�����?~����a�`W�^-Q�D���
^/8��l��}�nN�
=(��Fxfh&�(�wZc�`F�V�Z��Tff����ndc���2\��s'���3��~���[��_pB��F���D]�?��s����Lnp�SG�lZ��y���7������#����g``�;��cpc�H��w�6l8m��Q�F�����m�[��`�v��y�9��K[�~�����[����������?����>������`����WW���+������_7�1`$�����
^#�&n�����A�����['##��?�4�1�07������%***""�b��*T���:�|LLL�:uj��eLc�)
`�����`��]C�9t�P��������;v8p��q�4������3f��������k�����#G�m�i��ct;v�X������W������|||V�\��m[]���k��)cpc�HF�L�>������������}����G�epc�>y��_~�������o���[o���aCs����������GEE���w��y��)R��2��b�Bhh��!Cv�����9p��i�����j���{�3g�:t����P;@�1:�I�����7o��}���>>>c����nL��;���/^|����j�:��'�|"l����w����@�N�=7n|���%K����C2��<�iw�
T�X1�f���?\�~��}����n��
6��������`�"�}����~;,,������)W�\��5���������KHH����M���'����{'M������KR
���Vh��}����N�:k��<�iw�"##w��)����I�&������,66V����#�7o~�z@!0:��\]]k�8e��������-[�K4h����N�X�B&_y�s�^�zI����3g���X/��,�+���R����<��e����1c<<<&O�\[�rN����[w��}�O�����\�z5!!�U�V�8--�����[�.Y��v.yv��%aaa5j��-��,�*U�]!;;[1��_-���QK��?��x�b�c�����n
����c����>}���5�N�:.\x���J�*5a�y6""B�O�j�ts�%������,����+��][1�5��Q#y ��j��� %%%00�_�~����w����>��33f�psc����zu������z����c��%U�T��u����/��o���usyyy����x����n�[��7������is���m���cyJ2��+Aq���k��]�|yzz�D��e�J�M��BG�;y����?���3g���5kFFF~���;v\�~���>��\R_�|J�vg�V�?~�=|}}����>��_�C���={���~~~+W�:th�N�����{/]�4��c������V�q����m�������&�N9f{CBB�l.Ag�>�&%%i?��gY!33S;m�l���bc�����mT����k}"R�RKjn6}U�)��5�+���e�t���s!��y����R�'�u'�DG[tBR�~��:�zG�:Aw`(�nw���n�������NH�z�B�	�O��*�:A��_N���,]�k�m�����6XwBJJ�v���6��,����kLN�8t��r����Zw��]�BN��'��Vl�u�u��:�z��N����u�����	��]�NZw��W�|J�W_l����+w�BB�(6�|+�N&Y]�t��Y����x��Ym'$���h������w���%k���V�!�{�L�^ULWc�&]�N�Y�h�N�~)Pw��>�u� �n��p-�Zu���:!)�b���p}���e�C+3S�	������VkL46.NWAw�Xw����$d�*���h'�b},+�:!�n/H'�eJ;���������f�F]'D_�������Y)^�����c/>>A����p�h�����N�F�;Aw�)V�m��+��������T�	'"�/2�p�|���������t�h�	�*YY���1�	��2OZ�_��G��l��u'����:A�E�U'X��t�P��J�P���M2(�
>�W�^���ns�
�z���'������{��{����hh�������7�D}V��,�,�I�&�vyyy����Q5x��.]����S�9���WO��n���-�����%���_��a-K��L��TR��,bk��?���Q�N�:�\�����������m������3�om77����I?�K�9���to���W�6��~�������\�XB�%������e�+�ml�����Be�m��-[6j��y��J�5��9B��P�K�F"�N����N�^����g\s/����h.J�o3&j��:���W�u�_�/e��*u�`�y����X�F���/J	7OZw���E�;�cu��r��5jZd�F�/���T)���|||����Z�n]�F}���9����J�t����b�	�F�H_�	��U�u�����f��o���H��M��P�L�T]}K���+P�<y<q�����?������J�*��(���~)������r'k�������4e�	m}9.�N��h����hE�Yc�bqF�5$Cw�X�����w*r�h	����.t�P����F�)�K�3Z7z�u�\�mw�����S���������;�������:aS��h��{}��G�i����>V����Pr/����������/B�||�������(��:A���2+��O��U4�������6_������\���,;��lY��R���;��m���+��3�
e�x)���u'�����Zw���d�c���nQ����p�?��%���M;0�5j����|�_P�>������hq��u������h�	���u'��+&�������=�*��7�E��5Zu���������������
:P����~s�A��?��~���KLL��w����K1�R�|��S�N�Y�hXX�nFIG��?��2eLc{�
*8�L������g��)��G���=<<�����NNN�3
p">�hA������'��������5kv�����q�8�����s�-ml3sd�-���3AAAs���X�������1yP�D	�W@8�B�r�j��q������:u���111�v�������{d���C�	�4i�Za�������I�o2��7����Y�V0���	l�������??���Y�:y�����k��h�a\�T���_����gOcc��Y�z������V�Z�.]Z�patt�����O0`��e�'O>r�H��M%�|��W
6=z����g�6n��]�v��mSK��b���4f��}G��F��}�.Z��C�IIIk���>}�-�&g\���v�����SO���/�����6&&�L�2��w���s;w������7o�<i�$�H[�l	1bDPP���B�;������z���'N�����$7ij��]����
V����
d�6���MlT�\l�������N��gq���P����F�8����������^�z�:��p0bP2d�zw(�
`�~��1+���Al����T�.��
`�{�v���Al��U��n[0���HNI������-��/P�Y��m�a����)��iK>���������g�<�]\\���4h0`��R�J�����JVb�dZ��������[g������m�v��w���+�������f�k
��c�G���?t�P��������0`��Q?���a��9�;`e���������g������-dP����[�je�Bfff��%�i8�Al����=%�����������icLc�)����c���3�b��3f�pv[P�b}+���(1)�i-n�`���������e�:�-(d1�U���;�����������'N�y��M���P3��2��E���Nj�_��v�������7O=�������c�]�Z������	��"00��V�J������U�Y
�9-�EEEeff�:u�R�J�+WvV3�0N`�-�4i�����%�k��>}z�n��o���|����7j������X�bNN��6n���G���sg���1:���3G����k]\\����M��5u�T��0���'�L��M_�X�b������3�1`$��D����r�`9997�dtk���'�|����K�2J$�7o^��

n��6n�������__2X������.\���7�DFFn��������`��u[�j�[o�5k�,sa�:u$�q�mN��^&���...U�T�T�����9!����8k�`<�Xrrrpp����cbb���u�����0��l��1����Y�f��]]]
^;8����o��7o��/�l�z���`���O=���+�����Q�F�O����� ���9s^{��O?��a������6q����/7j��\�r�g�?np{��y���S�>|����i�������?l~6...((h���QQQ����;w�2eJ���m,��,�+���2d�������6m��&��w?s���C�����
��,!!�r��U�T1x��l��^x����z��W���d�}��;v�h���<�����m[�:=z�h����s��,Y"����_�S��;��
�
*V��d3yJ�`������k^��u�6l��w�^�p;3:������5���W_~�eIA���[�R��d����5Z�|�����/I)88x����,�z��=u��Y�f��L�����s�N�X���M�4���1�;|���#G6o��Vv��et��-]�4!!a��ij�5j����sqqQ'W�X�����+��g�����o�-�3g�4W��;��
Rb~�Pl���\s��1�'O.�.pk���m�&y�]�v�8��L�2�X%��n��u��%�s�j�j��%aaa��t�;K�J�lW����Isrrr����?/^�X����g�u�[��w��		Q��1b��={$�T�V��w�8p�<!�GJts�%������,����+��][���7j�HH$�Z��<HII	����D��C�~��w����<���3�����m�a�^tt�����S�>}^}������3g4(--m��a			�l���usyyy����x����n�[��7������i#�p��m�X��0a��;k������]�v���������e�JI!��BeP�����������Z�D�<�(u��������0�����%=z������y��_|1��rrr��awm����K3|}}����>��_�C���={���~~~+W�:t��Fy�w��K�.�3����#999��m��1&&F[�����ZRs�������iV����}]�?��#�j�yr�>�&%%i?�)k������i���h�g�t�g�Q�����5�]���F]'DG_Ul��vM��l��-�U��g���k�I�NHKK����������Y�~��:�����;Aw`(�nw���n��;Z�		V/U�:���X]]'���i������������`��NHII�N^��FY����3��tHN�8t��
��Q�u'���+�D�y���h�&]'Xw���������:A~���k��i'�;���T>���/�o�����U!!W�d	�r'��.q�������m<{�������V���J�}�[w��5��N+��=w&]�*���e�.i'��w�e'X����X���N		��	�b�U�\���-�h�	����[�?�23u�i�|��lu�2���qq�
���tt�p%!CW!66N�[:�q�>�t��w���2���O�cG{z�N^�Z�������u����/�d�U������<:����a��u� ��lw��@E�	����������NDZ_d,:���hYA�	v*��u't���dee���H'���<i}~�Fk��`w����])V�`=Z�uBA*ytBGk7�� ���'�����CY�(�����S�Y��=�%+V�����_}��Iooo%�oj�����YYf�&MBCCex������/-<xp�.]��r����^�z�\u��]�h��H�[��m�6����Z��c��9�|||�(�j%K�T�s�����)=i���}�M4o������.��*�Gh+\�n[l���5*k+�����k���I9�y��n��-�!�U6\[2���������r�b	�N��/�\9�����W�	���k��e��'�;���1Q�@�N��n�RB5k,���:ANO�� ��[�����^���Q�\�L;:Q[_�	^������K��l�X��L?����b�t����R�������e��N�X�h�\ee��Y��_���$.UJv���9�����Z�n]�F}���9����J�t�`}~�:A����:�Z�j�Np[tZ����u���4�����)���o�]�v���'�'�U������n�����'i�xE����K��������;Y�V-m'�%�)Nh����p!w�tF[�E�_95��5&*g�\C2t��%�^�}y�r 7���m��B�	e�-id���9�u�']'��S�v'���j:5�N�,��m����1�N�+��6�mQ�����hy4��:�?����c9A2��/�N��u�����!�
>>����>�>�b�z��d�1�+�R�N�t�ZE�
]9��h��n��j�@���������1-5n��S��6���<��P�����[w������u'��:A�<�;�z���������v``w��������i+�:�t>Z\�u�`w���0ZwBAGk��J�b2���~���#�z���Yw���������������
:P�������1(�eggo���z������s�}C�~��y���;�<r���g����NHH�+�4>,,L7��#����z�2��=K�
Y������b�����z�]�����������y�ANdP�����&�X������;���{���C�����B	����0ww�f��I���q�8�����s�-��:��R�e�9s&((h������3��3c��D����p:����+�����/:�����\���y��������FJ�%�H���n�Z�^=�
(�0d�����I�&��,X� 22RB�:������U�fM�2m�b���d����-Z<X-����5�����]����-;��2(�/^�[�n�`��U6����m�I�&�F��5kV����t��l��b���7����'9r�i���|�����
�=Z�p������k�n��m�b��������w��Qm������E�:t�����f�������>pC��
���;�����.]�Q�R���
����v���|�����%K�n�z��	�O$���o��y��I���l�0b���� ?�lw�����O�8Q�`%����t�����-00p��a��%
�~l��E�4��?o.��3}�t�-�����@��*H.
6������[���,�T*T����b��b�p:�������Q���{�b��T.\��q��=z����;�_�;����#Yk�����0M�6M����S	`���`'N��2e��}��������#�$zeddX�K�~n�X�
>����\��P"��y�6lhpc�HF�q��u���~����*W����v���o��&22r���7�dt�����U��z��Y�f����#�;p�os����2������tqq�R�J�J��o�	LU��Yk�9-�@QC��� 00�3��#G��������U�6j��������[�9����]�v=u�T���]]]SSS��������w�}Ni�9l����=����;��//��/_�5k��A����O��`P����^�X1u����s��Q��7n��y��i8�Al�����-�����4i"��W���c�T����z����>��E��4���v�����~��x���&O�,q����~�����k���_�p
�X���?����}�2�^�z�v��Q�x�J�*����pCo���i�}����7O�X�v�$���H����� +Vl���=z�x��W���7y�d��9�?��w������J�*�_�����1b����fP;}������m�&�K-i���|p���w�}�e����
�<yr����i����o�|p���*T����p������SO�={v��Y�l```�z���?oL{�x0IV���3OV�R�Y�f�J����.[�l�F�~����?�����S�*U�$��O�>���2)�k����|�yWW�#F�p
����=z>�d��999iii��U[�b�?Pt��6mz��!�.��+Wn������1k���q����u��ak����?�EB��� 00B��� 00B��� 0;F�5g��A�-\��\�~����(���;O�2�|��6�cw�BCC��{�nOO��N�6���U������9s���C�����

����;WW�����m[�:=z�h����s��,Y�c�����Kp�s9vg�[A`�b�$��S?�p������k^��u�6l��w�^�p;#��+33��_���{�=�-�?�$�����c��%���������Sg�������b�Bdd���;%by{{7i�D�Z�|�9����>|�����7������%�G���?���Cm��+���^y�sI�^��~�m)�9s��������b�BDD��T�RE}Jl���\s��1�'O.��p���v�����������VJKK;|�p���K�,�-o����%K���j���[��Y*U�d�Bvv�L��]NN�Z"~�����K���,��p��6d���e����{�������	?��U��WKBCC���Yd�+��][���7j�HH$�Z��<HII	����D��C�~��w����<���3�����m�az�����������K�����>��� �\7���������^��Y�V����y��>��M�6'N���m�<��&L� ���5k���k��]�|yzzz�>}$:J�
o>�[��w�����G?���]�tq|���E�)�B�E[a���=z��������~��:th����W����[�r���C;u�$����{���y�;v$''����7���hKt�S������g1&:F�)::Z�����������]�6O��'���$��2e�~�toQF�D[>����8���M�
���y���5�6�:!:��bS��k�We��l����={.D\3OZwBZZ��D������������N�c�v'����n��A���zG�:!���
]'>����Y�9M{��t��Y���,�`�	)))�����(kt��~F[�������P�7J���]�v��7O;�����n�u��u�����e��]��������R�������}��W�V��\Ql�%�V��L����^�>�3,������NHJ�Z��C+I��o��S���;�\C���t������M���L�����`�R���c}F�:!$$�v'\��V�r��NHJ�X�u'\_�kn������uBDD����.���e��N����*�N�N��u���]�����d\��e]'�����Li'���������������v�>|8+��<~U���'hz=�N�~�k��v]'�?#��`=P�u��@%3���fs�������N�~>ZV�u������h�	��*YY���1�	��2OZ�_���u'����:A�E�U'X��t�P��J�P���M"���9R���~������J^���������2�4i*�#///9�,�g��r����^�z�\u��]�hQFF��-���m��V�a-K��L��T>>>J�E��%J*�����������4U{����&�7o�P���I�}g��#���-6w����������5k������<[L7p�������K���_�h�����)-��������J��|}��`�m��-[6j��y��J�5����(%T��R����lw���n��?��{)��FEsQ2��Dm}]'xiJ&�N�/����b��N0�<CXn{��-���/J	7OZw���E�;�cu��r��5jZd�F�/���T)������F:�Nh��u�����RvF*��u�����Y�n����j���:�m�iE3����	�_$��&�N(S�L����v����j�<��W�c�*cZB�y��T)]Y�%RS�/�����[ZZ�d�Z������,8���/����I�m1�~���C���X��r
���>�t{a������ ZBv���]'��:���iJ������t�P�N��������<:���gt����N����;A�0�N��E9�{�^_���l����X>V����P4���:AG�	�/�+_�h+��xk��x�(����N�5�h��J�;��}k�+te��������%;w�-W��/�N�/[V?����q�N�r�p,������B�2^�flo�	r�'j��������������*n�n�������|�_P�>������hq��u������h�	��*�����"~���k����n�f�	vGk:�N�����Gk�N(�@%�Npx����7�f��\�z��3$�\�p�������eR��2@�=��Q��b��m�L��T�P��e���T�^]}<s�LyV=������|�D������8�������Xm�*�7�xc�����5;x������?gee���S��zowww��h�g��	

�;wn�����������%JX�
��`
��#�hK$����}��#F�P�������!C���'M���Y�`Add��"u2555$$����f��j��Y�V0���	l�������??���Y�:y�����k��h�A�P�D[�~��J�*���0`��e�'O>r�H��M%�|��W
6=z�Z�����7n����m���n�������������o�E�u��A���5k�O�^�]���
���}����&M���e�����#F��)d��8������_}����/�Ir���������[``��a�n���I0;|||���kI.
6�s����tG*�
*X�lT1��c���y8B��� 00B��� 00B��� 00B��� 00B��� 00B��� 00B��� 00B��� 00B��� 00B��� 00B����W�M��i���������M�N�8�A��
qqqAAA��������������)S��/oc�vg�]!44t��!�w����8p�4���U������9s���C�����

L/::���������O?�z���7������
���m������G����;wn��%�����%8��L����0h��b��I6��~�����������u��m��a����/�vF��8qbhh����K/�%��w����{���i�&��?�$�����c����o��w��S���5+�e���v�����;wJ����n���<�|�rs���>|���#�7o~�z@! �����w��!00�\���O�*U������+���^y�s�^�z����R>s�L�e���v���)�R����<��e����1c<<<&O�\8���!����=[W������Q�lYy���v�����[�,YR[�U�VK�,	�Q��nv��T�T�v���l�4G����D�����/�<���y�[�#���`�	`�?��<�����S�Z5]�$44�:���%33�v���k�����F���dU�V�)))��������6t����������g��1c��{��0L�c��]����<���/�dBB��-]������������^��Y�V����y��>��M�6'N���m�<��&L� ���5k���k��]�|yzzz�>}��-+%���
��U�V
0�A���}���m����Q4�t��Y������G___y����������C�g�^�z������+���S'y�w��K�.�3����#999��m��1&&F[�����ZRs��������hE��^jj����w5�<�?L�`�������5�YV����XcL���Y�����(�d�pm�����]�o�����*6�\��xU6O��*����B�5��u'���jOT�N����II�������/��������M�;�5Z�h]'$X�T�����but� k�/�iOV���5�6[wBB�E�;!%%E;y�re�n���h��!9���U�* �F����k������c���t�`���N�^��"""t��?��u��k�����p�U*������o�������+�M��
��IV�8��b�gt��6�={V�	Ii�C+Zh%�>���r�uw��k���;��W����I���i�;���_
�]v��h]'������k1��[._�	I�k����kt�-�Z���N����X���T��L�����8]�	b�	:�N������������������ � �)�d|B;��#w���u�}������g�x�'�������M���	��v
�����gd��*�N��dfX]�lTt�p"��"c�	��G�
�N�;P�]�;���5�@%++SW?F:��]�I��K7Z����5]'��H������
:P��
8Z�I��I��8q��I��q	9�����������%��:vgqd�M�4	

���������U����K��=����Q�z�������h�����[��m�6����Z��c��9�|||�(�j%K�T�s�����)=i���}�M4o������.��*�Gh+\�n[l���5*k+�����k���I9�y��n��-�!�U6\[2���������r�b	�N��/�\9�����W�	���k��e��'�;���1Q�@�N��n�RB5k,���:!  �v'H/�Vx�3�����kT4%��N���u��v�d����R)[,V����3����X1�}����p��u'xyY���<VG(�!WYY��E�k����9�K��m��@N(m������[��Q�<�w�!eg��?]'X�_�N�5�F��N�V�����V4�o{�p�E"�n���2e����[j��]�������{�=��2�%��'=K��U�5^Q"5��R,+������N��UK�	qIi�����r:\��4��c��WN�:d����-����cI�v_���
�%dG[���uB�CK���.A�h��I�	u����	�~��N��<K{F�j[����k���
���Ma[������5Z�������c��XN�E����tt�p�r��E�������?�����X�^��Yc�����>��V��BWF��,�|�[�s��r�������e�cLK�7��.�
���(+�h+�)��h���� G{�f�k�	:�N�1��N���:�z��������:�����s�
�N0���n]'���.���P���n�R���-������H���Fk��`w����i�.��:�z�����T���Gk�(xc`y��%�f���������3�?y,��aaa�Y$)����K�;K�
Y���K������*yV=������|�D���NNN�3
p"X$wI�z������{����Y�f����������;wJ�R��q�h�g��	

�;wn�����������%JX�
��`z������G�e��T���2dHpp��I���DFFJ(R'SSSCBB���j����,v+�����h�b���j���_@@��Q�<v�X����m4� ���;V1}uo��q���x�
__�,[�l���G�i���$�����a���G�V��={�q�������m�Zbw��.\�o���G�j#V��}-Z��C����5k�L�>�V���D�;w������k����C%����o��y��I���l�0b���� ?�lw�����O�8Q�e3In111]�vuss6lX!t��F�So�n���`�<��_���Bl��HQ�B���*�;p,6��rND��� 00B��� 00B��� 00B��� 00B��� 00B��� 00B��� 00B��� 00B��� 00B��� 00B��� ��~����(���;O�2�|��73��
���C���{�������M�����]~�����9s��!ww�[��n��RSS��m+Q�G����}�Eq�}�wA� �Bl��X��5��c7j��-�0*"X��r�%�*����Z�X�Q1�r����k,6��("��7;�fwqgY�� �����svf��sv����;�l�����[�l9q����p�m�BCC


�6��:v���Y��#G
��g������������2`��q�F���/_>k�,��{��C�]�t��U�t�D�
���?u��X����Z����,;;{������m������bP���������?��C�e��!������+W��������������n=zTXs�������-��#����|������N�:���������l�r���F��w777�+��P�����-�������T�YZZV��@�CV>���T�xxx���-������&����W����iii���t�J���������>�`��QT����}����j�4h��ld���r�����'O�����J���5�����t�Dr*���i�v����;���?~�n�]������U�����{�����/^�1����Zt8��]�uhZOXla�������mm���������aK����-�����.���X�����)^�t��hp[qK��������n��c;�
!Mk�(*]���[	��,,��W�u���������S�~���
�^�q�L��P���,l{����W�;��c�b���J'89�/�wB!��/JCR���-���u
�<������5vB��>�2�Np���|���v�\�"a���m����h�oj�Q�xu�N(��g���x8HtBg�1��K�z�x!^�����o��"�;���� ����z'L��*;���hg������mf�9*]������ui�[��[|���MQC��E�N��� ^l����	\�T�E�N0/2��"O|�J'�z{j���M�8eS��~��t(-�<8����:!����]��;������t�y�&���`ia#^l��&�	��\���m��{���_w�u�o���~�N�3��������(����P%c+W����6'+�Q��������W�8����R�����O[9*u��N������.�E\�T�5�;�N�e�������,���-���k��g�z'X:s���.�u�%�����F�N0v(.6|i'��(}�thhcQ:{�����*�a���w��_X�n�4O:��(~�/,�w���SQ�h�*�Pda�����Fv�c�x�Np����+�t�_�:�Z��z'|�q���Ds��\�T�5��9��qt���m��G�Np����y4/:�Z����l�6���Z'���8���E���j�f�:��������U:��DE���p����iM2QQ��z��R���9�.^A�$���o7v/='�wBy�5�D�����G%��-��;A=QQ�����lM%QQ�#G�������tBy�N(o�VA(�*v,�`:o"^a������;}<x��Q�.]��z����D{{�;v������[t���C�n�Zfv���g���lw�gV=gq����J+����
�.^�V�7?�w�����k{����\�qK�R\������1S�����w��R��6�1����L8/Q��+�NPzM�v������t���\���[T:�8�����	J+���Q���g}��P(�	q�,�;�"��u'�V�(����D�,�N�3q�s�j���fr�d��3W���
��C��t��N8{�G�T���r��	����h'^������%��p���U:!�T��
��4�@.�
��!�{��	��$�d=,P���qu�Y*_�Vc'p��R�o�����:A%���	��_=���4w���O���	W8�+VNJM���+�����`��	��;�WM�<?��:A%�N���q�n�HtB��D'Iu��z'�(w�����;!�w���E%��W����E%���g+���Z'Ju��(�q����D��NP����W�LT��	9� ��Xp��;A�lM�9�Q
G?"����NJ6�Jy;A/�JE�+[[[���t�-����D��l��Ujjjzz���u�:u
����W��fee=|��I���C����y�����K�w���e�EOkz4��./Pb�{U!�Pb�{U!�Pb�{U!�Pb�{U!�Pb@\Y���X�xxx��uK���#������&u����1
4h��^�r%��?rs������9Uh�����=+�=BV>����[��x�"�=�����N�:E�m6)�c^�~}��qqq������_$�o���������X��=z�����/_�p!���g�����"~����W�^�������r�%%%|�A��m�������;99���+W�x{{���h�
�r3f��m�-Zt������|v�����7c�~�7n�l��k�����r��6m:��/��".�F��y��=z���~�����-����P�������#G.\H5���G����L��`�
�
Yr-3###"""&&F��fT�eee��������>�0a��LT-W(��f����g�6�h��[�nvv�z���y��t��?(��o����+!�W=�Pb�{U!�Pb�{U!�Pb�{U!�Pb�{U!PY1���������@U�A�T��@U�A�T��@U�A�T��@U�A�T�@e���`��`#(�A�
0FP�0�*���`����q��-��G�{������=t�Pzz���S@@@LLL���Y�����d�����{����[�M�6���k�����O_�fMhh��M�����/�3f�z��E��+��q����K����O����L������#���������y��[�4h� ���4����O��{����u�����~~~v-��^��~�-�6��0p�@Z����u��g�������7##�N�:!!!�/��a�6+��yRs�I�;Y�yRCl�I�N`0Oj���<������1�:OJ�����L;�N���=�D����;b������e���gPP���z�z��wiFKLL<p���':t��&��/���/^�4h�����7��������<y�]�vlb���x�$;;�~:�~���vf�@�m���{����kS�N�<-v����	���g@DD�KTw�����\�r�:���d���^^^�o���a��ou���A�"����^��z������W�>s��:����S��������/]�4`�:���ys��-����(�`�6+��yRs�I�;Y�yRs�I�N`0Oj���<�96�����'%_�fEm�Y'F��B�t��_4m��^�z��OLLLjj����'N�������_�~K�,9t��f�����{��)�MD��(��������M����q���p���/,���b1}����@���effN�4�N$������������[�h�J����W�X�x�b{{{�����'t����3���;��h�b����
��s��Xl��)44�o�={�������	/��%9m���������P�II���KW�Z� ��I��g0OJ� �<�}'�7OJ� �<)�yR2��I����1�=OJ������A��Q2���@������t���m�h�=z������>}��y%%%�Y���

��w����[�����y�R���S�0�5�X��]��~[�n�s*=���4j�(''���@_!���N��7�9s&�=����oq"��yskk���t6:o�������B�k����m�L��,�}�v��?�Ph2d��y��}����H �<)���I���'��d��I���'%`0O���^���d�I���'%_�r���� ��(@UH Q����������V�^��������f1,^�X����;���'����7,X0y��6m���/O�X<|���oGGG�?~����k��t;_���F��Y�n�o��v��1foO����?���k�G�333)�
f@nn�_����/�y//�K�.V�N5�B�L����:u�dff&n�>��ee�����6+��yR2��I-;Y�yR2��I����}�W�<)�yRs�I�/y��d���dU!�D���>��^?�����iV�x���3���"##Y�z���4k,Y������~y999���O>��qcVV�xc��#F�	 %%��x���)S��9s������c�����Y�����[7f;�5k������W�Z���s��]zZXXDGG�	�r;###�f�������Q�^=6����������������VJ�Q�`��<�y�F������fE�N;��>B`��HJJ���h����I����v����u���_~�����]���}��7�|C	
�&+c�Nw��A���
^�vm��u#G�������A��'�~�����:u�T:��\�2444??��	P�z�j��������orr����|�M�������cAAAl�U�V�����?O�����[�(��O�>e���'O�7�.T����Q%�>$��<�y�d��'U^�z��;�h�^"D���;w�3��3:������N`�=��������e�6o�?|�p���������)**j���=z��������3g������rPPP������ �w5`����S`���32b:����Q^��C���������o����Y�����������������{���<k��~������R+�:�R�~���TO�Q/�o�~HU/0Ob��<Y��I�_����z�v$�W�(��z�Y#&&f���4��I]�}6bcc��O������K�.����������?�����j��IHH������uk����,,,8p�����J�����N���/��������_�e#444333%%E����a���N�����T����v���>������MVza^�x�`s)H���\Y���-��5�I���'��4O��%�rV���#�~#D��x��?m���+W��UK�q;v�s��={�]����+��>LS��\PPp��]����g�������h�������Y��
/_��2�|��-X���/)�d�F;����g;u�$�C�����������3��&O�<j�(��i8���)�V�Z��[W/�����������(���,?��_�'1Or�'k�<��%�lV���#��#D��l���b�
f�{��A��=����l�"n������+w�}���<���<x;>���e������m�F��WW�k���W����x�"������y�&�x��A��N�<I�R�������^S��RLNqq'f��	
����N9���#� fll��ukzn�����R����S��T���0���I��5i����g6+�w��&�G����{�����>}��^<...tZMLL�4i�p]�k��}���VVVM�6�;����7�xC�BS��!C�w�>e�6o�[XX,]�4++���_8���>}�Z�|�c������������������;��I�
0@���������y���#u�O?�t��U��%))�N���<�e��Y��?���*..�3��2�0m�sc�����/����g������
�1���'y�'k�<)��g0+�}��@�r(�@g4g>|��]XXx�����g��u���;��L���_Mpvvvr@����Y���_0`���	�w������k���������������;��v��U+..��w�m���������RRRhj������'�Z�jE���U�(�����?�m�fhhH��&����q6����'apppXX��<��iu���U���|F�A�"F�E3�7�|s��:��w�1�Yh��1�dX�h����(���k�����3� �<)���I���'5�f�����I���Z>���'%`0OJ� �<)���{V�&�'F��B�tt�������4�	�c��eP��������]4��y�t���?����|���={�XXX��5<<��w�a��*�_�~�N�Z�b��#G>|���0l����(ooof1��iw6l��+�G;u������B�z�JI��}O�>M�@�\VV�H����f14o�����,HHH����^JnBCC����,dllLO��R�q��Q''�)S�P��go�@�yR�����1�=O��d�Mr���t�����!�<)�yR2��I������61�����*$�(�@G����k�����;�����][/���~��������wP���y����S;��i3QV�\A/�=OJ>>�	A�c�u�,o'�1Oj����6�=Oj9���� �<�M����<�e���A��Q2���@�`#(�A�
0FP�0��`��`#(�A�
0FP�0��`��`#(�A�
0FP�0��`��`#(�A�
0FP�0��`��`#(�A�
0��d��!�v����pqq�r�;w���W�\T�;q�;wN��w��1o��������/_�\��@�P�T'����������6� L\����;v���YLLL@@������u_]�r���u"��r�Si����u�*d�r.���:cc8k���j��\�������RUT���i~���i^���e��T9�~������Q�Fa�x����#?�<C�:#�5W/���I������:�#�[�����1�WJ�N���^�U��7h�`���+W������yA�w�o��N};�
�g���o[[[�6��AP���1b������9{���[�n}�����GXXXxx���A7|����<H7(!���Cddd����q��a�?��{w�;v����=z4)))88���������?���������7l���w��	�����{��G�
���L������������(��MF�9c��Z�j��j�Wu�k��u��!����kk���{Si�rD����'
%�X�0~��O?�����cbb���[8��]�v���k��
��e�)�Q999�g��{sss�����[���;g���'O���������������1|�p:+��������i�����������2��� :O�4�������6l����c;vdst5��!������x�mZ��=��A�uh����~�����,�����ccc'N�hdd4n�8�������d�����R���S#e�����a����2�Y�fQ�G��>����!���N\T�P�E�Q����D%-�0��EGGw��i���THS
L�0mr�������2eJ��Mo��AU����N�D������Q-Z���w������0`@``���sbbbjj���S�z���_��@u���


)�[����Q#:�j�c$7�?��{���?/�?:b�:��Y����$�`��G������+�����z{{/Y��_��z���o����;���S�*���;##�29�o�v�j�������VXX%viiiEEE�law�5U�t����yB����6�*|U'.��P�"�9���������h+��_{���}��+DEEQ��o�>����V�ZEDD�WV,sL��rss��T��8qb���T��u5Uz�.]����:��3�@�&NY(133�s|7��{�����<x���o���������>�Mr(�������klllnn.�]rr�����A�.���������CI9���5J�I3J�(����?�����W��=U_�t���<�lV�o�����|-���������(���Q5+�:�WRRB�I5-u����E����3g����9���
�����l"�P�To�ESS�����l�����P�n]��n���LnZA���'L��l�2J�f��!��x����E~����)�[T����������������=z���V�q��b�


��'N���m���{�_��B��}�&.�{^^�������@��By���('''  @��d��T���qC�DeLy�����,�E�>�J��z���/�077�S�����X�{5j���@{�Ahh��
����YYY��o�<�\h�]��x��3g������������Q:�v�Z��r�U�t�W�W���=q��^�������_#�����I���M�JI�oy�����2�<�;��[@_P��kkkN�Y��={�;�J�!(..�<y���3�9q����$�w���P��|N�M�/^�9s���������_�������;q��W^^�����'%%%:�����B���)��PM�%��988\�~=++���^h�������9����W�={611���1c������������>>>�"= ����d�y��`jj�~������@n�
������Bx��Mq#�	���LII�*N\f���o�(�|#T;(�@�����q���k�FGG�-�%�_���K�P�Cp���������<��n�:w�\Zd��M�{����O���s��6m�����9s�v���6##�)X��W�'.������:u��~�+H�T0������������[.]�t���.]����C�.��r���9x�������|���O?�����S�L�wh5��!(..=z4%��w��K���1cN�>-\-//�G���={�,..��� **�e{���7n\rr���II����l�B�$-��P�=--��G]��;q��5+))����sss;r������{+�_�G�9m��&M����~��'VVV�W�fpD `z0{p�Qo6����{6��srr:�<%
�l���>((h��9m���WH�U�b.�/�ul�h�C�f���g�R&\���;22r�����M�>�o��n����/���������/�����������K�.��o��������-���U�e��K�`P���^A������v��y�2��z���;w.Y��F�����w�Y�jU���u����6�����y��G�h�n�������jyDP5����f�t�0Q���IAe����2W.�����t��'����j�
*�Q
�ss�O���������c��������:��e�252o���n���
����ok^pp�p����{||���Xf��7�(�[�*��a@n(�A�
0FP��j�����P]�`#(�A�
0FP�0��`���������;���;v��7o��������/_.klr2d��]�222\\\�\���;���+��UPM���C����o3t��f���;v���YLLL@@�������vv���)�
��W`�k6CFe|QQ;22r���t�������=z�8r�-��9s��U�C����2E��C�_��}����1�Z����w}������Q�F��=�����
,7���k\�s�u�����+���@WS�������u�����l�,<<�
�k��>|�e�t�����PXLHH���?'O�lhh��4j�H�^y(�����G�Sok^��y��~�������m���b��LLL*5��5h�`���+W���G��'/��R�X\"��1��R��{/����,��
���?m%&&j(�z+����l��fff��PC��f:���bmmMI%��<x�`����
J�:t���uk��g��G����������bzzzLL���~���#��]�v���k��
�����{7�5h��������S=b�����3{�l�777�����u���s����k��'O������*��T��r�aP��t���[�>|����#,,,<<\�[t�PCO2���|�Tt����t����!!!t�III��������o��A���W_=~��a��4�&L�p����t,			iiiT��&#G��1cF�Z�*�����^�z��S��k��W�*����k��t����AP�P�H�8e��7;99Q&M����
��� J�'M����s���
6P2z����;FGGw��i�����RZI�%mr��J�)��2eJ��Mo��A	����N��LLLJJJf��I�)�m��15���>|x�-���{��eJR���������:u�TJ�����C
O��$>>���
�i����������PsO�t8��1v����Rh��6��g����� �:�H�
������T�egg���N�8���h��q/;^*�>���a���uu��Y��p���M]�C�$`���%K���8��];Z�<������^Xa������;�����#FP�MI��h+������Z��}����(���o��B)`�V�"""���YuFF%����b����B����8qb�������*e��.]����:�y8T�)EZ�����V!���!%�|e��5�RAs&�������0���H�+V�8r��TW�\���������S��^�z�_�H��������
0����k���������0������?�o@���!�W
0�j���8))��>)�Q�(��d���>>>�.?x��o166n�����G333T�����i�����#4�h�"((���3�&|";j�(�Oa
8P����Uf��
��)��lV�oS<����Z�?fff��Wp���d%�@ky�T����w��566677��.99���\� ��n�����w���J��������?������o�j_W��@����������)n�?7%���P�n]��o�����Sj������"zX��o��!l��C�(9n[ZZ��RPPP��R�-,N�8�m�������#K���/����l�Zn�COV"�����s�	&,[����3f�KV����5	�OOO�����������n����v=z�puu-3B���6������off&��������]����o^����M�Z�oy����"\@����������E�9s&���������m�COV"4W�c

��a��:1+++�"�����K�9���Rx~~~�������};O5���k���T
0�j��������O�<))�������9�'�z����c���8����/��5�=Y�0����X\\<y�dgggZs���III*���Y��
Q�7^�xq�������CBB~��W��%�=��R�.�_)@Pm���P
x��Mq#���mJC�_����eoo/�?z�����e�Ik���PB&��~��7Z��F��'+���W�^}�����D�W��.~��W����������~����`jj�~������ �f]iii:<��
�+���-�[���
0�j����}���N��������]�V������q�Fj����[(a�����K�����Mto�~���K�.]�p�K�.e~����'+�'y���]�?~HH����iq���s���E�����{���_f�j�s��5m��e�]<s��466V���4(2���o����������P5K���+:v�H]A]BB�����P�T'�f�JJJz����������9���s;;;a�����.\������]����O?}����)S^���?�9r��i��4i�����'�XYY�^���1��no��G���DhN����G�M��0B�Ry6f����O6���������=���+((���z�����������_RRr���-[�PL�9j�����J��S�.Y���������|������aT��J�C���i������z��p���^�����Y��u�]���z���;wR6�f����y��U�VQ�)\����������8p�G{{����9s��m��e;ruu�M���7o����#��[�n��������1Vw:���!�\�T�l]��,0���1R��={��G�R�������tDTXN�>�o��l����/���������/�?���������K�.��o��������-�������7;�i^��@�*�/��{��?�|���T@���P�o�>��~���7:��������P7
W�P�������#� n�}��x���
en���������6mR�l�Q��Ux���,QACl���e�\�
9����M�����4���(q����'
��P��:::�Q�9f���_0+S�C6ZA�"�w/{z��2~�B��RQ���j��@��`#(�A� ����`��`#(�A�������rD�IEND�B`�
bench-50gb-duration.pngimage/png; name=bench-50gb-duration.pngDownload
�PNG


IHDR��g���	pHYs%%IR$���IDATx���	|����I$�$�DuV��U7���:z��R�Q��uU��8��T��)uS�����Q��Ru&��3�$��;����$��HfE^��G�����gggg�o�;������������:!��N`���:!��N`���:!��N`���:!��N`���:!��N`���:!��N`���:!��N`���:!��N`���:!������2e�\�z��������.��8w����~z������q�SO=%7n���������s[�p �x�U�R���S�Sd���������Q�.]�4i����������c�=��{�N�:988�����3h� KZ�vm�v��v�|���Y�~��W)#99Y�F�
�x��'�|���r���9����+W>���Z355��/�X�x�������+C�#FT�Z5��-Z�a�����K
�����{��6l��[�f��e\$[;��\�r%00���w`
���-ZT����m�k���3gJl���o�W�nu�����7o�2���C����"E��,GG�B�
�.(�������t����w����c����]�X1�*�V�Z5t��3fX^�������-���;���4��m�����m�Q�J�:{���_~)yL���2[v���5%��N�n �h��y�[$�I��t���L�$��_��d$��<r���i������W_��������m����@0`��Y����[�����b��H{�������-[Z]0))���C�&M������Y#A������o�.�}4����U�T�V�f:u�$�����HS�^=I_���������7o���g��jq	~r����[e
�����oK�*Y���_��3�H8�t���!C$h������/S���y��i#G�����6l����+:99�"�e
�������u�;vhYKc���J
`m����s$�;000/�����-xX�D���-

��s��<y�k���P����)"iMR������V�\icf�������/K��������:Q2�����H�������bcc����F�%,o(**��o���W[�$�����?��>}��.u��M�F�%7$w�������	��80~����P�[������W�]V�E��=o� �#�(�j��)!'88������4b���S���%3DGG�EU���m�������*\�p�-$��>}���r_��~�Txxxjjj@@�Y����[oI(���������+�D��ej������wppx��g,oZ����e��;w����z��u��I�������%�=��O>�;��i�m��I���s���
JII1[�w����_z��e��i%���;w��U���}�v�R�6l�����~���V�Z�c'�h����f�:{��l��>��y�~�h�j{��%�Y�f[�n��N%''���w����w�5��\�cdU�b%o���M�t��K������o��R;����_��z[]y��u<��E8bbbd������S�eGI�����������W����/J'N���^�Z�d���[O�4�b��v�S0]�j�$l��v��E�~�����-K���+_�|^���A�����Y03�~Lz/^�����~I��8K��bx�L�@_��{���)��������uZ�~ZF���6~�����������,!�����$�<����ku�-R�9sF�{���"E���UK���7��"�F���	$2]����4	`�/_�lv��(?������b��j�������'���o�>�����*I%��t*1U�5jH�V��?���_H��>������X�B1R��tt��aI��
.,�������?���G��z�_������?%q�v�T�"5�<yR��<X������_|QXrr��m���oo�ll��z�F�N���8111�0��E�&���g�~���;v��z��4���e|o����G�*��q%2�Qrzz����e����v���w)�;s�����/�]�tI�bx[I���EG��;��3�|�����m������&)E�������N��.��2k�,�(��wW�w��T�E_}��#F����*U�A���$}�"��
3]����%��cdzu�����/�,IL�S.\x���$�X.>����R���g�}v��Ej���o�����~+[�G\RP�~�^{�55��=���8����^H�������������H���S��#������a>|����/L1����m[�k,x��w,�5�w`��a�����I���?$$DF�2�T�y-55U�e�R@����x�
��� ��}�F��W��{��y���3f��	�	J����^���d����!+V��[�H�lgJ�<v�X�2e���c����K���%c��;W��c�r�$8Y}�(+������)w�����_I����N���G�L��C����a���>}�����D��~�Q����z�$ ����e����Y����-�$����+W��]���tqq������lq���������py�$�J�Z�={��/�q���jS��]�R�>�@�"��j�Jb��]�l�.�0��~H�%$�\�v�l�'f���d=x�`~y�]�v�{>��c`s��������5�;`w����c��m��i�"E<8~�xY����������������i��1���So����%Kf����&��8]B����g���������a����5k���a:]b[�Z������H��V�-2�����?/�E������Kk�%f����_?�iR�d9yt������Y�X���v��>*1[R���m���X�����%K2��g�]�g����$U���q�����%L����Vmz��V�^]������w%$$(��B�����7����c>������)S���!���Ca��f�$kIUj�S�N���Q�F�/.��e�~�AR��7��v
6�Q~�$�H*{��������%fE������f�d��^r#��M������n�;��~��v��9`j���g���8SrG�-LXPP�Y���+?���������~���~��������g�w�f��6��%��h�C�����p$%%����HMM�e�Y�b��gIVTo�����,��4�_��4�@~GEt*�k�������OW)���������������/������gJB��c�L�|�����7����/��������/W�^-7^}����\� �t	r�	�0W�\� ��OH"JLL4���)u��~��}!���9v�;S���M���`�� �zi�����?�my��L�0������K�J�T�cT?h��/���}gY���������k�J,S?�����m�����re��/��������Y�rvvn��������#G������-����!P��l��!!!�
������fJ{���3�|}}�^���g�$��#i�k<�k��������Q�\9��;v4{'Mr���F���3%4JIR��7�2e�������Q��
'O�l�"�~R��������x��?���G�"6l(\�p�^�,�-W�T��$����GV��}�Q�F=������;[�b���(��1}���6��'H��F���7P�g��A����3�Hf��qc�6�^�0�^{�5	`�n��4��U��.�����Y��5k:t���8���<hW����r���m���\�P�F�L��Q�;b�/��q��I	N6.�'''y�L�"QSXxx��;w^|��L�22e�N��w�>���E�������Y<S ����$�e�:���w��P��t�7oV/�m��f�0�}�'u��)22�O�>/�^C���X*�;������zPo(�KJ,_�|��-27{SB�4|���������O>)i��������`����i�/�)�a�������������^�<555))I�Y*��%1�������������������^C��-�,�����Y��}����~I�Z^��G}T����+�,��j���+�m�����w��Q�F���G����;w���R?���n��-C�������_���F����7�2�����[�N��{��5����i�������w����w����Z�j��/P%$$��7O1���6Q�<��c2(�����5k2�`�d�N��^��v����7oJ�����Y3�+l�������m�6Y��KS�����~�M;v��
������[��=��_|��?��j�j�e��	�����!C���>���My����#���u��V�z��'2�S���s�AA�����@������������g�y&,,l�������*U2����l�����FP���>|������brrr���ehhu�"C�?��s��q'N��f^�P������o�I����D��� ����~����U:d�[�l��1b����:$�j��YU�V������F����_�������t�2e$3���������I2�L?{��4e����;x�`m�U�T�=&�L�,IIfu���z��...	���7J��O����F2^-0#�w��M�d�/���/eiz��!;J��_]��zI�����G�)d���.�/	j��%j^����d�j�������]�
H����O?��]�r��
��������u�f�0�Dk	`�@���IU/��Q���3�)	��������uS������l�29l��A��9t�P������GG���/.��L��S�rI���D����m$�/_�\n�3&g�����@������2�5�rK��
W�\��g�LT���z-I,S�L��o���U�V3g�6l�������%���i��� A����F������S��0�s�'N��u�������5�����n�R?����u>^x����+K�8y��D�0.7����>��t������m��bx�Oj�+����k%%J��D!{F���o���y���%�Z�J���L96$����+rO%�h����b�
)@���"���r�@1��l�*�Dk��.\�������E*U�$)����3�S��7o����I�,|*��]��}TT��F���}[B�	����w�}'Y��/���(��k������W���h�"I�W(�T���O����b����$3���?�enHHH^<e !�(�hMI\
4x���d(l��lf�pY��24o��E�~�d�G2�u��s����u��e�]�T)�^2��p��3#�M*���O�m�v��yU���Y�f��`����Y���|����~+�d�y�S����L/6(�9rD��?������e�)))�K����7ng��W��gg��0��OY����<(��B�
$�>���D5�^�i%Y���� e)�Q3f�PW��z�J�����g����KO������C��^{�K�.�����~�$R	*���e��Q������K��,8n����_��?�]rPm��Ev���;7n�(���}�����}%���{��5���3Gv��!y^�jVo�=��#����Y�~��'9H�A�����*{��'��A��0!�x��]JA�U2���3�V��][�"V�HR2}��I}
l\�d���s�;S1�uvy��lb�E�� ���
�&����0������C����f��1`��=��``6q����x�Y.�A�����8]r��t�|��Y,lK���b��]�T������������~���g��w-]����%KF�)7BCCm���aB@]�v�z��z)�!C�p9
(�`����S���5j�4hPv��x8���l�r��7o������:!��N`���:!��N`���:!��N`���:!��N`���:!��N`���:!��N`���:!��N`���:!��N`��� �F�:o��7�x�����1c�L�<��O?8p��k�C��
&��������wwwW�{���_�~�=g�����o[XUZZ�W_}��7�>|899��������j������e��}��g����;wz��1l�����.bK��w��MI�+V�8}���)�/O>����Ce����t�����������_�~����L�2O<�D���[�je�����AAA�S���U;t�0h���%KZ()����E��+WN�%�AV������e���;��E�������}���~�)�����/2Wn�=z��IJ�����!!!���/�.]�e��r�T�V-[+����%))���+�J��}��/^\�k�K�r�n��-***!!�X�b*Th���<�5j�0�'G���K#""��<��x{���*V��v����6����'Q�{J�.�����d�L|���{��)��*��>�@��k�5o��!�T�l���G��I_]�t�!�����d��k��/����~��{w�J�l_����GI&��&k��u����/#�5k�899����]�v�A��N�j���o�������9s�H���i�i�\�`��o�y��m���S'00066V��W}������`Q��2�ToK��@�� ,,L�ZM��������/��R���}��$���[g\j���2���-[�;��c��� {RJ����8��o���E�ft��9I�g����*������ydC;v��|t�c����Ks=�����k������Y��g�)Q�DLL����%���.�[�)��I�&r�H��0#�\�yI��]$�KY�t����r��sAm���(O�=���u�������G9�|��r���du
��.(�;��������]�~����ZP�����V�*�___������K/���'�\W�w�^*�����S��2%11�s��������/`c�\1s�LI_�����"m����G�!��7�Sd(�P�B&Lx�����SRRV�^=h� I,�������L�2��-3�-���G��@v����k���HHH6l�����wo�JIfd�/����g��V�����[�����^��s����NI����
3�����/y�^�uu��Y�?��M���������	���Z���)!��^������?^��O"##�p>v�XI_�z�����}�p���h����������O?�4�V$���Q�F�.]Z��'Q�{�lN�"y��1��m����[�`��.(09g�0�M*OO���g��5�W�j�E��!l����[V.�C���J*)�O%��5�z��R�:Z��OF111�5:y���L��H�R�9�N����0��MI�o���b���L{:99u���f��o���0L[��v�u={��Q����YV�X1�4K�,9w�����%G���Bb�����kW�lY�WS�N��C\���������L�@rr��O>�����
6<���Z��g���v��l���y���-��[�n�-9p����~.#�:`�P����������}��G���{�������_�j�����q���i����4�O���s�b��]�t��<<<l������dR�^=�C���QJ��,O92������yP�������>�`��&�i���K|��:%��D���g����Kv����{������V����\��I��������e�j���j�����+��y���>������:t��%����l�III�=���be�ec�u������?���X�(N���][m�PR"A��M����Z�j�{eV�9sF��6�y���o��)w�l��w���woyDd(��G�X�"������.��;w��m��53�������%�f�0�e�0M'J%Y�/��I�w�yg��S�L��:q��1.\�Lec�R� 7m��x�bI��O�>=y��=zH$k��e�>}���,X��a��^zI�����S�B�i�A<�
�W���c��>�ej0����]�=T�"L�L�81��T�����61z�h	r����BH=����c�v������K%�[^U^�S ��5jF�r��h�o�.#���K�k�n���2��l�o���P��i������M��%K���
(0�:u����%J����lD����n1$$$[{�����w$�|�I�8p@�dH����NF���6�������K�����k������'��:q�DDD����cs����+WV�XQ�"�k��&���?�<�����J�zL���{e�:t��&�N1|���O?���/$�+V�E����.g����5k����JX�^���D�z����~D��D��q�?��S��a��E
$�Y��O?}��m	`R�v1�K�
������S����e=��d����z��I�rLv��E�������@������^�xq��-3���<��>�l��m�)y�$�E�{����{���6n����l�09@�k�O	�����O��2���k�W_}�u�V������c��d�3j�(W#��L�?�N�z��-}���9R�7n����J�2"m�N�@"�v�Zs�����B�����`�qrr�l#Cm�R
�"�VB��Y�?��M�~��7���}��Q7*��'�x��?������>�qm���S�����={���o��V1�������w��Y��I���WK`��#�V�
6��/C�KI���-�Jr��i������w����	;v4����S1d���KJ���'OV��b�K��?�D5�D�~��s��?T�P�i���i�+�7���+���
0@��r��e����������<zY������3��&a�r���� �<���M�4>|�:��}�v��}�.]*��={����?���S�NIIIk��������e��d�N���O�I[��N�����O���[7	6��������+�����Rv���%���WF�O=���/�r������Bmf���=66�t���S�,*����t���V�#��?�|������/��>����M�����]6�"��������wom��(���s�f�yhd�/�����<�r�~���6s��������=�}QPM�~9`�ZP��t�4i�<
���?�A�UL>5�R?C(qV�w��-�>l)�����2��B�e��W?|���?��j��-[�,6P_d����<���T�5�x����}%9P"��)S2~�I*\�v��/�(��&��������$�*������\3��tJ��Ee�$yC���'*W�lv��q�������E������w��M��W�+W��w���X���o�"V�hSd�6lP�^�j�h��	$}�9R{�A2�s�='��^�z�too���H��%Z�h�F�p��c���u�,X`:E��
��M�[��"�K��?^����.g����A����s�/����!C������2}�M��������_���~�~��DeUY�~?P����DHH�W_}%�[vQVo�(�cL�.������������Y]L_������W%���}�l�.��c����W����c���`�������~�@1��$����3�]�fz)N�z!A�����	��'QF:{6�t���U,!555��I�:e��)d� oI.�S����d U�R��[����|��v[���f��(�%��[^�9�f�3G�H�t��2 ��G��v�Z�:t���
6�0���:�5��k�.  ��?�<y�d�*Ud�H��o���O��v[�����9::�`�����=,t���L�]�[C��������G�f��@�,�i
]�dI��:+Y����+V���_u�����oe��^60�$cv1�"E���]���O[xt.^��~�Q�X��������oV[���lQ����_����'����o�����r0��w�������b�m�7nH(���i���������(#�=���W1�R�p��xjj�����S�
@�S?�#�e''���4���s������^��������p��2@?v�X�K����?2��U��-}�);v�<3k��Q�F���k���fW��@�qd�I1�%�6������J:w�,�QK����l���&c�l-%�h����������������������(QB���R��������� �o�����6l���%}�}��v5k���s�����~V������7u����{���_�\��l���"�466��7������U��u+�K&������={$�%%%m��E:�^rS1||N		��M��~����;�\Y�G��U����o�u��U1|�2�SS.�S���
�P����24E]�r���������K��������1����6m��h��_~1���}��I�i����.�-}Tm���\'�h��
��&O�<v�X��D8��q#222  @�.�<���x��g�-W����L������wolt��%G���]�^xa�������g�}�M�1njjj�>}>����K��QCv���{���s�|��
*�X���?--���^�nU���z�����U��SI��G_R��u�LI������A�$E�8q��o����~�6��Kr�����U��������M����CB����s�+@�_�����g����-�o�c�����$��6h��y������yq�Y%�k9�<���f��`&w�)�`r��.�������_������������;w�����T����9sf�V������A6�|��2�?~����3x�`��]��>�d|��w���[7$$�u������'e����/f����:uZ�`��q�dq�'�dLy��%	2|T��%K��l�R�}�>���
����;44T:H7[F������	�������Y���_/�[�n��T����a:�4��o_��"_}�U����d�,�Mvx�J��nf�i�;����������"C������ySB�v�A3QQQR�,(�V���O_�z�D}y�m�����t��5m��	`r�%�kY�<&�D2���Y un��]���_���%O�3f(���VPW+�������Qv�{��'9�j��fU��]��'�O"�r�������������Ke�-^���;��~O@!��Es��9p����~�i����'&&�������2�S���������g�+��.]���K��<y��Q�j����];`m��Q�t��]��-[������A���=z<xP����[���-Z��*3L�:u��m2t>t��$�b��I��q����:�T5m�T���z��q���G}���Wv��'��?/{�1e��W�t�R����$�>|���3�����[�|y{;+e���8q�D\�J�+Z��?� j��IV?������=Z��2�x��Y����%�X�Z������o/���}||v��}��Q�9�TJJy���n��%�������O>�Z���(W>����J�������+\���r$K\�Q�f�H����3����w��q�����_Y�?+V�GA�����#G��c-[�0a�k�!�}"�d��
��;)7�~�Y����X����GO"����S�>S��q��Yy>���b�
�������\$��}���W��W�NII�R�J�~��
���Z-w��������K�q�����#�<2s�LI5�����U3f��LG���1��S����K@�-��M�n�[a$qM�6���~����&�L_���k�kdx-�lJ~���'O����@%�u��A�+�#caWV�Z�5�)")�w���

��$���w��~�H,�]M�>�'��s�=�r����]OO%�\�w�vL/#��_��x�w�^	r[�l�q����7�xC����i)~���2P���M������f�/mb�������$okc�E��j�J��crr�<���.����urr��R������r�%BH��0&��<.����9�$��������D�()E�7��VM\\��#Y"��������\?�T���B�
�>�I�=zd���L��=�����t����d�l����s�t�q�����$���h����K���	����g���J�(��������Y]�����~8M%�x�+4����\���������-;S1�b���,S�Q�q����jyA���4���H�7���N����AV���hc`��b8�&X�&���!t�O�����S2<p��L1��{
�� '���O___�C�+�����91}�ton [�����9�}�v{���`g
��:!��N`���:!��N`���:!��N`���:!��N`���:!��N`���:!��N`���:)�,""b���[�n=����o�����S�vmu������q��'J7�vlllHHHxxxttt��%;t�0i�$��H�	 )�l��}-Z��s���/�p���+V�������{�F����7�o���+T�`�`��������Z�����]���N�:�y��={�Hp�t�V��:�/1��92>>~��-��5S�H�������S��g�l����?�x�k�7o�$���PY�:�M�6��L�2c���-��u�_
bk��Q�
��%�}�Ygg���H���%Jd�������<X���[�1c������;88�`��@�R��I����={6999  @m����/K�)]���9))�����7wqq1]I�&M���$�U�\�l�V�����:�;1���y���}��
���6z�hubll���5k��y�bbb�������^�z�������4�U�S"""2�%�����dw����J�(�f�����X��J�*�t��%K�4�R�J���3g��/����[�n�\	lfkswwW�.���.��u�w
t0`��+W�;�l���g�����o4�;v���m���Q��=����{����{g����t���/kY]�B���7'$$��-�IF�O?�����@��S��7�m���]���;����P�B�Z�2�Y�f�:����������Jf�J�S�/�qC�D�X��q����^��c��Y��32���5��i�����U�V?~�F��������qqq���NNN�%5�W��)�����fw����.^���]��u�����NW?�/k���={�4�p�����������o�>������MMM��e��5��f�-�dw����|||$b-[������_��:����6lpss�U�V�"E�L�(M������m�6��~I�w�����

�0a��a���.\		Q����G�uww�.mou��w.��/���M�6M�6���������\�2>>��O?-Z��t�={�/���a��^z������#�������u
}��Y�p���<,Yk���u��6l������AAA�[���q���X� �+��e�����G}�k��U�V+VL���!C�y��C����l�2m��u��]�|�T�R=z�;vl�j�����2k��	����_���=h�������Y]$����&����.]j�C$�d:�v�����l_�����@0�	tB��@'0�	tB��@'0�	tB��@'0�	tB��@'0�	tB��@'0�	tB��@'0�	tB��@'0�	tB��@'0�	tB��@'0�	tB��@'0�A�nO�;�i�wo����[��!+���j�{%���5�5*�V,o��u0�Aw���/���}��W�y���L<�}�����P��q�+5w�L�B!�HB���$c3-�~�H0�	tB��@'0�I
`�'O��u����}}}���?f����kkbccCBB������K�,��C�I�&�����!��X'�|� �}���h����;/��b@@���'W�X���?�����5�����Z�����]���N�:�y��={�H.��CFy�N�KA`#G������eK�f��)�y�t�2u����Y����� *=�m�������)Sf��aK���b�����5j��A-}�g�}���922Rm.^����}���Z�n���3F�O�>����j����u�_
b�4i����g�&''�����4o������O�&M���$����Y�P�re����:�;1���y���}��
���6z�h�������o�S����b�C�������V�D���X���{�+VT�REn��uK�J3�������7�����6`��+W�;vl��eg��
��FSzz����],�rw��7oNHH�j���W�^pG�^1m^�v��y���(�,�111����x�X��i�����s�LXW����S���mk��]������_�xq%�7��)�
,w����Xg�V���_��:v���\�;��v*\��w���qn����R�wqJ��tuuMJ7�m��u���[������(�L��Y�:�Z�����U�Tqrr�������{��\___�2����?��	 �)p��������[�nXX��t��~�����������o��vuuU����n��ErT�
�i����X'�|��0����e�����[���W'?~|��
nnn�j��f������:a������/\��6�vHLL<z�����zi�\Y'����0���_�i��i��]�v�\�����W�\����-ZT:���g���'N<x�`pp�D������[w��a��v8y�dPPP���7n�h�"V;��
bk�������G���k��U��k����!C�y�������u�&L� h�������
		�>h�CFy�N�KA`"((h���:H�	5�Y���k�_*��u��
h��@'0�	tB��@'0�	tB��@'0�	tB��@'0�	tB��@'0�	tB��@'0�	tB��@'0�	tB��@'0�	tB��@'0�	tB��@'0�	tB��@'0�	����(��36}�*�O��XB�9����3�fj��J�0�	tB��@'0�I
`W�^�:u��5k�����������_�Nu������q��'�3F�]�d�:L�4�����F�.��u�G
b�v�Z�
"##;v���/�>}z��e�W���ys������7�o���+T�`��:W$&&�j�j���]�v

:u�TXX�,�g�	N�n��"9X'��� ����GDD��;��7�T�t���s���'O^�f���6t���<�5��7O�Rhh���#�)m����6e��3f�l��@�R���s��m����My����+v�����%Jd�������<X���[�1c������;88�`��@�R��l6���;����J�R������~J�.�uNJJ:p�@���]\\LW��I���������+����"~~~�]'�|� �����/�g��j366V���5k��y111r[�OHHH�^��vTTTZZ�����J�)���ERRR��N�L��u��#5j��[o�S�w��,Y2h��J�*?~|��9/��r|||���o��%s��������.o���qV��:�L}y`����fPr������.]��O�:u����/�V'�;v���m���Q��=����{����{g����t���/kY]�B���7'$$d�����m/��G��6�]�vo3����}�b|R��4�����x�X��i�����s�ZXPp�d����O�0����^�l���O�Z�2�\�f�:����������Jf�J�S�/�q[�D�X��q���H����cVs������qQk������I�KQ"����j�q�������tuuMJ7�m��u��yR�C����(�L�������7����;��Owtt����������trr���4�!�T��qY�����fw����$wI��6m�����fI�Z�p����vM�z�z�R��������o_||����:755u��-2����U�,��u�w
b���O��1}�b��M�2%&&&00�V�Z��_�u��m2E�a������:a������/\��6�=����N��������F�)SRRF�e6��w�����={�/���a��^z������#���������[�>}.\8q���K�Z�|y��u�
�v8y�dPPP���7n�h�"V;��
b;u������q�o�!�s��[�l�6m��u�._�\�T�=z�;�Z�jj7ggg�5a��H������4hPHH������.��u�_
bS��nY$�d:�v���by[:��
b� ��N`���:!��N`���:!��N`���:!��N`���:!��N`���:!��N`���:!��N`���:�/��k�.���[�./*��/��_���Gqqq��sbb��c���$���A����k��mK�����S'��=���)bcg�)�����~��������xWWW����;�]���Y3uJ��U��@~g�� FGG�o��W�^�����/��r�J�Q�L�;v���������{�����[���~�I���q�Z�h1h���'.X�@��@v`7n��$�%}U�V-$$Dn�1B�����>���]�V�re�����a��^�z��}}}/]��=�;���K�={Vn������+���W�GGG{zz�_���u������V�\��-[�������=�Q�F����C�4iR���������v�Z'��50���S_�����>����/�w����77�����:c�???��}�!�����L�����W%@�u���8�T���[�������j�������K�b�A����5���l�b
���]/���U�lY__����3g����T�^�J�*��:�/����K��u��������_�-f���`�7o~���F��[=�3;|l����������{b�[�2d��a���;�C��+W.���+�01;�%J,Y��U�Vf�W�\����=�;�>}�|��������-S.]��i��={�:T��^�:u��5k�DEEI
�������S���!666$$$<<<::�d��:t�4i�����2��u�G��$T-Zt��9�w��&�(Qb���2K��]���A�����;����O�^�l����7o���qc����(�p���]�v

:u�TXX����(�����:�/v`�
7n��1c$]�t)==�t��2]���1w��7�|S���K���;O�<y��5��7o����P��j�6m�t��}��)3f���CFy�N������1�@�M;;;�m��_�~����{�X�bG�Q��/vww<x���[�n�e�����v����X'���,!!!44t��M111iiifs�=��|���fS������\�T)����t�����������i��IXXXdd������+W6[^�@�c���7o^@@@��e�/ ����K���������X���o�G����b�C����r��+������;������?�0g����zK�Mgj���#F�h���Z��[������Y7www�{��M�2n"/�	��?O���v.T�c�����d�v���N�:���L-]��O�>u�����_
.l�gzz����],�rw��7oNHH�j���W�^pG�^1m^�v��fLI����~���\������W������Ym4%%�Qe��C<~�������6%�f���&Lx����-[���T�xq%�7��)�
,w����Xg�_�����c��Y�@�s8n���E�y�g��*&M/E������J�q�������tuuMJ7�uqq�y+��:991�4s���l���������^�n]�����������7R����M�����/�Zdd��"��J�*����;d�\^�@�c�6~����/�.]����l����u�Ar���i��
>�l���s�z��������NLMM��e���
*H�j�	 ��C�u�V�r���/���U����|����C3�/U������:a�u����/\�bc�����G����k?tv�����!����C���9r�b�N��Q��f�������}��Y�p���<,Qj���u��6l���j��'O�n�z���6.b����Ls����/:88����+WN���:uJ���=;��7�xC�����u�&L� h�������
		�>h�CFy�N��}��_-I���3��j��}����;w�a����-��j���k�����\'���l��E���z```�=��-+A���s�W�����������%��sz�Z+W�4�}��S�J��2e
������#�&M2M_�P�B���{��W���a�&�+999�t�`�|;�);�:u�|��gO?��$.m�D�9s���[W�z�������vrT*3�'��b�Y-x���C�Vk��
�wj��b�6j��.]���][2X�r������;��?\�pa�����@���<�v���;/�\/�R-��?�Z�����C?7��������*�<����6�C������KG�=c�mb���%�q1��X7����.888�/_����.��n��n���e��������K������-{��g�+fuY����.\���SOEFF&$$�S$�u���V�Z6l([���%����{��k�����iS$t�Y��O�>2�t:<L����_������GG��������~�����>��n������qz����_��=������K_z�%mbRR��_]�vm���C�t�?_l�5+F��c1@V��F���K�����m��)S&11Q�!���h��=���R��k���BWiM�����	���S�N�V��f���5j��3�������K.�J�Rc3�����>����������f�r�|}}�R	��>L�lP�J777;���O�����w��a��s���
~����o�9r�]�@����7�X�5�>��f�ZZ�����#� O�!�����]�v�]���#�M��NLLL|��w���^�u�K@�uj���_i���=wd��|�qy���?;�)S�t��y�����Z�01o�<������=~��B�
I3�����.Z�H�z@v`iii�_�~]�b@7v`�=����s��mk:1!!a��Y�?�����>������}��u�v��A��-Z�x���+�^��a���}�!��i����~��w�+p��;W�>���,h������>��;`ODGG�;w����B�
���v�tc�&���}
�o1������5����W=���������o��W����K��_\�r��(S���;�/	t`�����^�~�u��r���~��5n��-Z4h���,��$�����%h�mI_��U		��#F��$�=�;�k��U�\Yn���o���W�^�t__�K�.�_���t��g���;v��r�J���������������Ck����q�$�����+W�e��2�����g�n������>��&M���s�1c�xyy�]����n
8u���_�=�;�������7&&����p�����C���1���O�z@��*U��]��j��j����tn���M�'N�h�����'u+��~���SIII6v���?O����������������y]�L���m�l��X�b���_[�n�n�����tB��@'0�	tb�����i�������4��G���$���������P�lYGGG���C��������[o��i�#;�7nt��I���INN7n�G}�w�^�Y,���O�E&N�8f��vlllHHHxxxttt��%;t�0i�$[��H�	 �C<~�������������z�:q�D�s%"�����W�P�tz��������Z�����]%��:u*,,l���{������:�.��u�_��f����;�|���u������������j���S�v���6t���<�5��7O�


9r�:�M�6��L�2c���-��u�_������������K{{{��=|�p^������oN�:���9�j+Q�DVkX�x��������)��u3f�L�>}���C��:�/v`�n�*W�\���������K"���L����������4o�����t�&M����EFFV�\�l�V�����:�;v`;v����+g��5o�����-�'$$�W�^r;***--����l)uJDDD��du������@�c��9}���������+g�J����-Y�d��A�*U:~���9s^~����������uK�����-�����`�q�V��:�;�	`_���	��9�M�V���~��sg��cf���l�����z����{����;������o���eu6o��������W����|!)1���j�4�?���cL���~�Is���{�1�J���+��~��UG�^1m��-��I���_7�k�gd�)��h��{�����F���l��E���z```�=��-+���s��v��U�v��A����j��lJ��5�����������S��])uJ���3�P�ha�l)R#��c��Y��Of�nqqQL�K��������qOd����S�������]���OI�{�AAA�=������������*&M/E���w��q���g�(�����t�\���2�����J3��H�sz�Z+W�4}cg����p�L�� �L�l�����(�bdd�Y����[�J������[^���7�����!�9rd��If�+T�P�~�^}�U��1#k���={�4�.e+�(���\�^�}���}������NMM��e��5��f�-�dw��;0�^����KS��d_���2eJLLL```�Z��������m�d�z5���{���?44t��	j����_�p!$$Dm&&&=z���=  @�bu��wv`u�������~�iI\�D�ds���[��l��u������������5Jm�1�d���g�~��6l��K/���9r$<<�����/�P����g���'N<x�`pp�d����K���
S;�<y2((�u��7n�q��wv`�v�t�R�vm�`���KJJ:w��?�p��}���s����P�y��E�����K�����-[�M��n����/�*U�G�c���V������YfM�0A2�������
�}z0#���`��;0�7K�.=z��3����W���8FX����B�E����x��������|�>��� **����������K%��0���=��6l��[���~[nX��k�.�J=��RRR�����m���{������k���g�}�������y����g�C�l���7o��8���|�CL������x��'Mg���&&&>���z�z�5�m�����������|�I///�Y����������������kg��`67==]�L"<�����.��s��W^y����:���C���Oxx���g���RSS������/����}�{������c6=  ���>������������`��Gy�������%J����O��?��k��_��������/k���M����:uj���������_��,55�h���mgg���x�v���{��E���C�Z����K��o�������c����`�����=�;���������kk��m��������OO�9s���][�z@v`�����������vHH����'M�$�}}}g���=���X��=��J���ukTT���7�U�V�H��:�;�%%%=���C�m���6���_�2@z�"E�������c�
;|q���S�L�Q�F�f��/��l��%��k�����G�2e
.l:������:�C�z�j�"E�7o�������v����F���sz(����4i������]�v�Y��,..�l��K�.^�X�@�z@v`�8����������cu/t��|�n��S�N:t��a�Z O<(LT�V-�7�������pOOO{Wy���
bZZ��K�"""�=�;�7n�Mqtt,W�����:b���}�!�>|X����=@����~�����'99��������~��������U�lY__����3g����T�^�J�*��:�/����K��u��������?((H�����y���^{m��Q��:��w������k�K1�'��u�!C�6L�i���C;t�P�r�2N�X�"_��C+Q���%KZ�je6}�������C�����~x��a�`���2���K�6m��g���C���a�6i���E���3g�����%J�9Rf�_���P�B���3fLdd��K����K�. ��/tc��rtt0�W�3�0(h`��������q��}��GAAA{��5�]�d�:L�4�������:�#4������z�:q�D�s[�j����]�J<;u�TXX�������#�����@�R���7���k��%i�v��;��7Of����9R���M����O�2e���t�g�����RRR�|���S�:;;g�a���������t��m��12}���V;��N�KA`^^^i�����t����������No��IXXXdd������+W�a�����,���JKK���7��N���HII��!cX��u�w`�n��%��������+���Y���:7o�������X�zuV�����D�f||��I�l�t�z���MbbbL�^�v��f��������J���rs���WL���_�)iR����M����oJ�"Z3���j*%%�Qe�#��*==]�Z�.�����V�Ze��<O:v�h{������Z3�J�6���P��C��"..�I�pu��e��h�{"���W��5���L����*�%��i��|�FS��v*\��w�?��4�%Rkzzz*q���g�(�����t�\���2�����J3��H	`��/�d���:������ O<ui���k��<f�<\`����%�GFF�M�����U�T�����A�u�w`��������o����*v������n��ErT�
�i������2��w�������N�0A�2��.�����!11���������N�]A`[�n]�v�z;%%�����F�R�#F�(Y�d�>}.\8q���K�Z�|y��u�
�v������AAA�[���q���X��O��R"L�����R������ ��;w���j��/j��_]�����u�&L� h�������
		�>h�CFy�N�<�Y����������6.{'MIL16�r�0 )�l���>{B
r��v����sq�v������al'�����~~��5Z�����#Wu�*�y*����k�
))Ja;�<@`���:!��N`�����+���elz����E�������g��T����U�QP��}�������kc���a������f�)�
�X� #��/�b.n�c����v�T�xbq-P��c������[7���wRm_��������}�rt����
((��m;z���\p{U���������K���t������x'����5=[4K���L�p*l����Kp����f�R�}����`Z�����j����}�K	�n]�����WH!���E
�����~�������r��qvz�,�LWn_��Z��wb��3�d�2E��@'0�	tB��@'0�	tB����u&f���s�f@���z��@{8s�fJj����S�����4��9m������~�5�x���Y����S{��5KW<x#e��LL�����@;h:t�d0��V�3%�M/���9)�{W��Y�f�Y/�����wr���<s��/f����5-^.��9F�|%9�z���v������D;TlGw�����(����j
k��lU'o(����*�x*�Y������z�L��]Z���%��
��Cg+���j����L�r��l��f�1r�xL)R(���|�2������al'���y��o.:�5������ 0�	tB��@'0`�_��s���"�o����i�i�-� I����21��fJ��,�����e��80`�8���G�:~ ���l�V�%�����M�Y�5{TH����qv3�������}z�O����S��(�5�~�TE������N;��X��3Yk���Y��\n��#���u��_NJ�z����#U���9���~=.Qk��NRN4��]���)���Y�EkV�=$��qn���wn_�5�Z���Gk�tmL��[C[����������|�6�����K;�v@�q.������f������c=�3��:!��N`���:!��N`���:!��N`�8y�NJ���?����f!G���6+�������LI�qIk:zO/[^kuRJ1n%������Z��H�b�+�����"�eb��}���8}���c��Qo���������GGG�,Y�C��&M�����Z���`� �u�����Z3��gJ���^�����T���Ni���j��<�5��=�b�!Z�1r��E���]}���|�V+3*7��,7n�����w�P�������7[�j����]��:u*,,l���{������:�.��u��/]IKI���NN��v�����;7o]��)�)v,���2���C�>����v�7o�$�����#G�S��i#�m��)3f���"9X'��qa�o�Gkn�����~����*�G����������]�tMO4������vNO,zp����T�W��5K�6iV���v�o`�PX�%���x�bww���kS�u�6f��>}�t�,��u���z�vD�
�Y���}�8;�7�F'~���5�Gg��$-X:MkT)�����C��	�v��e	?�K���&%%8p�y��...�K5i�$,,,22�r��f+�����_v�	 �!�e"6���f��5o�����-�'$$�W�^r;***--����l)uJDDD��du������
���	w��Epw�*���U�KW���$k�X��iIZ�V���H,#�eB}l��%�
�T�����������/���������[2����U������o���a}��Er�Nx��1f�V�9���NgVg?_G�xFk�����MZ��?��FkM����,ZBk���Ld�a��I��4����X&��;p���m�j��g��������^����Z*==]�{��l|Y��":l��9!!!�W�^��,X������x��&&%�8�����T������.x��w��� �q#��u� Gc&n��m�LIIv�n��:��������7M�!h���_�n��v�Z�r����G��1>QQL;���������O��Y^�-%��Yf��qhz��z�������������/8�,el^	0]U��Sw�Eh�[1	�&���3+X�r46��dL|���4�Y-.�p��-���/i�C����%S��w��KG����w�c���k�n����CRm���Z��I�c!��{���������Vj��b��S���j����H������p������8����n�6�^G�]�V��=M�����������$�1��u��]��$��$���3�?���c�M����s����w����<����WL�vxLI�z�6�=sw�3�&������<M�������t��1@��&����p��#��6~E��`9`�y����C�����w`�h������5kv��!<<������������R�/^<�
������"5�<���cVsQ`�n^�\0\]]���.E\���(8*d�����q&3P�{���T��=����`c��L]��2~@���Y����������G�b��W���Cf��)Y����^�z�2��cM�z�o������d]wY��K�n��n�:9;��M89���bV���W��n�GY�t�bl)�����y�����1ZH���9����U�*�t�<�'��Cn?|Nk������1��O+(i��4LHw{m�
m�w���;W�f��mcC^���.�X������%�N��Z����r�]���e�q�����X�zt���w�)mRd�')�e���l�������'�{�-Z����p��u-V������A.>C��1
�f�P�"E�L�)���s.d�j2��v���RL�Kw_��K���/I��^q&J��q��g~Jz��

*��`=��v*�����pH^1^����f|���g�(��t���M7����[�oTN��'�C�W�%�_��p�09���K(&�O9`�����19$�J�4M�f�9`��4�x����M2/Qw��F0[y{���������@9###�:DD�=��T��qY�Z^���7���;W��:�`���	�Q��3z<�`�$b-\�����g�����9�����s�z����w�]o���;55u��-2����U�,��u���Sg��~�5��,�0s���2eJLLL```�Z��������m�d�z5���{���?44t���������_�p!$$Dm&&&=z���= ����`u�������[&k��`�g����/4l����^���;r�Hxx����_|��������'N�x�����`�Z��/�[���a��'O�

j�����m\�j���������g��
 O�2��s�-[�L�6m��u�/_.U�T�=��[�Z5�������0a�d����{{{4($$D��`FV��:-{{���I�/���Z%�b����5<�'|��
 k��51��ArQ�A�sk���^A��El��-6�o��q�Xj�b�&�)��<�z!�9�p3�������������=�B.��w+�����
{�)�U�c'��k�9�$�o&�����nww��7e�|�������6�3������SM~��������B��k�f���]6��l�.��M��������f�'�R���
�9��3�x@�������o[�HRK'��
+�q��N�������?����[����f�'�&�)�5��r��?�h��3k&��(�i>�]�����Zs]��������QJ��ZWoG\=�5+�T,���Z��E��7��������W���Z�5�WKh��l��W�*�����L�����/s�y������6�M"ak`���:!��N`���:!��N`RE9\Ik�9U���[k�\�fa���
?�CkV�\���e�����D���,x����$%�o��|���yt���
����5-~�w��\��l�{�O���r'j�1�y�5��q�Q����Z���6���hM��'9��;�h}�v���>��v��s�������p`�s1&~���Z���Y��A������3�f�����NE_�wTkz%��f�{��_q��Z395E��\�=J�
0�	tB��@'0�	x��J�9���,Q����#YuNJ��t'Qk-���T8���;����Sg������R�&�5�.���^��N&V
=�Kk6,����
���M�T��5��O�����f��e�nk�jeF�(�X��
�7��������s�
K���j��d�������$�e�O��m�1b|[���qn��{6��t��
��W�zU)z�� �@'0�	tB�����,��nO��\_5��q��5�t��wMl�5���� ����[�w���.��'|����s���Z����o�gs�.`	I�I��Z������c�Vu���N�R��}������"/��;qQkW�+G�g7R���������;;qT��R�7��1�9%��#@k>^�J����%]��<�R������.-�����l�z�����y�����k�/{�O����(��x���k7oiM���)��_%�2�g��S����C��W)�
�
��{�z���}�YK����Qk�s3q���Z�I@�n����w������j��s�J<����[7���=J�1�u��=�����gRl��4
�i�w�W�5���Q���LI�S�1YK>�\2�p���:�o����c,,:s����.����VWx�
<y"1)��-�{iiiv,&���}��9c��t�S9�$��RJ['�G���OkV���y���,��R�[k����%���k78��x��,;�X�
�t'�xP<u����Zs|����m��JS%��u:�������M�7�2��-�J���3^�I9������h��5j&*k��>cs�.�e0�	tB�������J4���k���E����	`�-�N������U���^a�]���H������o?�5��<}�����y'�e�g���\���K�9�$g�4^~�j����3�j����g���^��Kk&G��������������5��U�wj��OhI����wi�.~)}��h��h)���}��Z3�z�3�&kN��:�
�"E^�����Qngw�2�N�VL�����x5T��^��g������~���V����W�	��:!��N`���:!��N`���:!��N`9]�d�:L�4����~��:�#��HLLl�������v�t��������7���G�S���:�/���7o�$�����#G�S��i��{�)S���1#g��`��XN,^����}�����n���3F�O�>���!��`��X�%%%8p�y��...���4iY�r��.�����u _KN�s��y�Y��R�=]k:9�q��G]�[�l���JKK���7��N������.�����u@cl�}���\Vbw�k���}�*������v�4�z�U��.��)#&i��+���
�����i�[k�������\�x`�����[�����l������y�f��:������I��vzo�m������rKqk��q������1����S��hB�N_��e��K�4�V�]j���*�������"J�*��������U�����$jM�~����d�������bR�OY��%�.b�	E��_�_�@c��e�r�����)^���;z�6.^�ei?�G���%�s5Y�Y���
�f���n��S!����*�{gW,�x�x�$���wc�R���/�Z�dW�����f���J��e,�p�2�mT�f�RZ�N�d��F���%�B�_�S�S�G�hs�&��g�kE*�������j�pT�\�b�����������2������R��8��O)n����%�L�N��=��_��ONq2$���r��m�Y�d�q���&������jqJ@o��r>���Z���d�G�����T�?9@k�y8�6�>��V�-�5K�wr1!���)�G�Z17��:vwJM�����P�4���$hM�%��{\k�S��I
�)U�~�/j���I�r���e�-��}Lk5�/V�L���}�%=�xT2�!=�p�I
�^E+�4>����U�<M�R��)�{g��S����*�%[��5�%z����[������GMj���-Z�r?�s����k�6�*�j�w���(�8���.����)��gh�.)M���gh���K&g����r��g�[�w�?C�^C��5{
��3�xQ�@��g��k�o	��f�PG������i�^C}�+^��S"���#��f�������~
-�Q�������|<�*���W����*����
+8�Tg������wZ�r���]�~�z�oZ��kh���r�Lj�������x�3�����n�w\�u����5M_C95���54���R��qv%o��x��I���7;a���^~��o	�I�T1�����]���*��M�7���5�y�������P�x7�~�����5��~���)]��qz��p�X�IO��<�����.b�����2NW�^�����NQ��������iC�g��x%Q9�Zk������������	��Wn������5����+���1������n�gdR����I
��5���_����rOg�b���K����&LwEJ��d���;L{V*��?����Y�����A����r���K�6��������4]R�(����W��R���m�c���w�S�rO
w�}&58�=��<���8�]qJ)w�t9���{� ��x*V��h��f�V�M�C"2��eh����q;��a<��y)���G��?>�*�<bR_:v�z��u@Qh����b���uJ�{z[8$�{��/#&Ga+���g���g���l��YO)�'��\z�&*%V�6y8���0}8R+(&&���N�x���sH�=C=w��z���%������Mmp�!�@<C/��\6n��~������*����y�&��S9gl�=C/�g=����U
�}��&(�-���<{�������Q��R����p�����Y���S���fR���g��������R&����_e���&��b���_#���3������}L��l�0�^CK9�.e�+���g=��i��X���49~��
mY?C�o�?��}8r��m��W2{WJ�����"9Xg�V�2NTI��������������)��2�����)��2���*���2���\,�������"##��GDD��*U��`__���@�C�6gg�z�����/>>����?c����e�	Z*T��"�]'�|���{����hh��	�)����p�BHH��LLL<z����{@@���X� �#��D�>}.\8q���K�Z�|y��u�
�v8y�dPPP���7n�h�"V;��`9����n��	&HFZ�~�����A�BBB�O�`��@�B�!�E����]��zy����|����o�Q�C_��`�A
��jxpjP�2�A� �A
��jxpjP�2���C�������
L
��Q5h�2����Ay0����P5h�2����Ay0���`���:!��N`���:!��N`0JNN7n�G}�w�^��p����S��Y�&**���;88x���u����������'o������������3fL���������Cg����o����J��.X��O�>�O�8Q��ne���[7e��8;;�!1v��f����u����LgEFFV�XQ�2N�>-;��m�������W�����������M�����
��*����^����y�Q����������������%Kv��a��I��t.��y]�>�O�5�v��}o��)�B
��B����j���iyW�s
�ZC^�?���9a�r.�����;�$��������z�:q��k�v�Z�
����c�^xANU��-[�z����7n�O
���k����;w^|������'O�X�������5j�O
���4{�l��{��
���{�
*�N����,\���W^�Z���o�-/��l���O<��>�1B^'�&._�������p��!���8p`�*U��9��g��B�V�Z����0`���<O��)C�={�|�������idl�G�|jJLL�=����]�����S��������dl�[�t���9Z�A����{;�N��k��ju?�p��\�n�O�e�s
�\��O�'}N�������i��8	`������k��%OK;��3~������s�������.]�t��y���k������#G���o��E�?B9OIS�N������A�������G����[�M����C�>���:o����W�z�-y���}{�b�d�o��h�"���������{��i�&M�����y
��uK^Z�l�Ny��g}��	&����}yD�����}��SF����_j���e��4o�<�%5�3W�"�K�N�2e������)��&t8Z�A����{;�N�Vk��j���Vk���i�N�Vk���i�$��	�j:�0��`�'w������w��m�z��m����My����e���#����Q�
�~B��g���"##u�A#'D7�]�Vv���VG%J��y�f���;y��#S=���+���:88��$y����#�<2|�p�6z��i�k:f�S����{TT�n5yY���{����)2����O.\�G���i�����M�����1cd����s�8�Z��P�����i�}������;�Z�A�S��t8f�������2t8�Z�A������>'L�e�p��Z���0����%�={W�|���fS������\�T)�j�4i����g�J
���:u�THH����������{G�/_��r����/c���E�m����N2����c�s�����~��7=���F��w�>~������W����I�&�������@��/G�*U������Z�P�\���S�h�������t�-aaa2����e��A�t8Z�A����{;OO�Vk��j����=����i�N��k���i�$��	���H����>�$���6�|y>����.[����}��
���6z�h����9L�<9%%E�M+�����Y�f��7/&&F1����fz���gG���:th��A��Gzz�����q�L�QO���;t����O����#G������g��Q�z�s���Y�X�>�@�d$���$�����u+::�\�r�����JKK�C�l�:%"""���TA>*�B9���)�^�O���O��=�X��E�����u��#5j��[o���%J�����w_�bE�*U����6m���/���E��T��]�d��rW�T����s��y������eX�[��]���������~[^��O���o�����V����?�=3a���[�F����?���O=��:�|�����[�
t�����^�z�w����������2��qqq�U��u�������t��b�/��Q���
�P����B�r�4;	���i�s��5�_$��K����G�S�
Z�pa����+W�;vl��eg��
���/_�<l���^z�c���l1��c�8�m�����g��������^����)�O���QQQ�-��S�k���<���������I�3����e��qc�znW1\0����NOO�9sf@@�������]���p=�/y����;w~���d �^�@�T�P!""B�C�����}?�j_���p
�����������@��0�~.���I�G�����0a��.��;����c�����m���iZ�������o�d4d��	�|����J�C��Y�C��r%/�����WW������^�R�lYy8���{yA���V�\c��]��������G��.i��Gy	����x�����S�O?���w����b��Ty����Oj������/�d���unA��S��?�?5�)T��gV'�O����j
v,���<^��o����w��>}�����+R�5k&���V�:~�x�5�zsk�����G}���|��9�'���iz�u
Y���V���Y�J�<hv�e������+d�������sg���MP���]�,Z����cz������`Z���@)�������K����wrr�x�=��_�?�fw�?N�&8��S��O'=O����j
�-���<
��0m�4=����x�b�v����f:]}�>>>^�6m��>���L�j���������u
�r�p�B��}U�<k�����'�xb��}�re�I�S�N)�������a���]^,��������4����R1\�I�bRSS����������/��g
gg�z���"�MWWW��-[��Qj���O�S�	���������I@��}�E6�`�"	`x������'C���3���G^8�-[��[oiW.>~���
���j���C
}��m����9Wv���M�6�
��?��+6e�������@�^������m�)z~��w��s��=z�l]�����{����5kV�XQ�2������Z���J�.-����G��^��:Q��[��k�>��J�3g���c�����4y��u��-����hh�������_�p!$$�^%��O�P
�O�r
���i�$��	���"[j�{�0�%���k���SRR��??j�(�9b���%K�S���R��u���<==u���/�����M�v��UN��+V�\)���~�i��Eu(�����jZ����������g�~��6l��K/���9rD�V2����/��A��c���q��2�������*TH=�P�H����E#{@�&M����2��x��W_}%{c��yf����z��%�9y�����rZ���_���#�^yw%1���>}��!1q����k���u��6l��e�p
��	��Vk���i�}N�Vw��P�5�p���������2t8�Z�A������>'L�e�p��Z���0��s����P�)�&���������F��V�Yr��'��l���?�����v���j��b���+��!C�y���������-[�M��n����/�*U�G�c���V����H
���>�L^A���y��|����_W�t���G:u��m�6�2z����2�qy�t��A�2����q�����E���Z��2����o�m������Y�	&�0b�������
�
���S��P�����i�}�����t8������i�c���O�e�p
�Z��O�'}N�V���)l��8	`�k�������
�]PP���K�]�Q�%��g���]3��[��v,���P5j�H^�u��-�&:���N�V7��Y������3�{;/N������P[j������E^�?m)#�O������O[�sN�V����i��8	`���:!��N`���:!��N`���:!��N`���:!��N`���:!��N`���:!��N`���:!��N`���:!��N`���:!��N`��u[�|ytt��������=[�\�l-������Y+[x��999�����G�=i�$�q���5j�m�v��u�>|��3,��q����o��Z3���7n�(R��n�}��@0�>����P�e�}F���JYO}�Q
2D������]�U�f�����h�E�]�vm����
R�T�\���X�\�`����w�=3� ����/���D+}�N���!.����Z��V�D�����P��X�7���'-�y��::0���e��Y`�h��7J�6m���K���'%�+}z�������^I�e���XZZZJJJ����[��!19~������r��o��G�b���?�����s�*�����k���			S�L����._������o2���A�5~��
6\�r�x���53fL����[y^3�F�-{)�^�x1$$��_��{7n<z��z���~�.�����i#���%K��:tX�~���[�4i��K�~����Kc�������_�^�R%y|�v~���V�\)��_|q���r<�`:))i����-:}����e��_~y��a�����O���?�8��L��A��?�������9k�����������~��7��*/��������k��&���=+Y+>>~��A�j�:y���!�6m*c�k��ubu/�xA�4h� 66�����^���s�>��3����o��5���p��'�|������<^r[��Z�j���� Ji:;;����{�n��2^�q����S�|�M''����?2�p�����2���2H}��Gd������=z��vy6�92**j��9����<��~����G\��A��0 �Q�G�P�B22P�T�T�r������k���c����~������K�.�=���#v��e���fu/�x�q���?~������j�^�zI�6l��={��Ac�!�6m��u�d�}������V�Vm���jg�!.W�����)-[�,_���Y����������^����5j�x�����7�������SSS�o?"������G\���~���#�R��<m����-*��0 _2}=��Zy}�����?�����?��sZ�G}�A������WK�*e�r�$��t?�\��z��~~~/^T�8;;?�����/h��^�>2����oZ�n=u����xy��o�^�hQ�����S������IY����2.W�������X\��2��t�R�2e�)|�GO���g�W���K��Z�����
��r6�������P��|�����Y�H���d��A������`��<��#�N�<Y�^k��K9^0:::����7�Rg��)P��.l|Z�l9`��?�0--m��a�52�Y�Z5����GEE�p\�b6�=z��#�y��cG��m��l���x�`A�<��}���<��
���5�|���
���+jS���w��P��|)��t����_WWW��������.����K�Y�����S�N�8�~����������>��8�����iS�Mb����%J�0�0|���u��
�����;88�p��O?�R�����"W��>�Jvt��^�C[P����q�
�PQ������n�J�����}��������];{�R@�����
8�L�2���7���u������`���.L=ep���?��C���|�M�>�E��Z�<�9x����A��<�`�C���������#�L����4��{�������h�B�-e=�������T�R'N����1�?W�\)]��+8l|>����;w.[�����}���={��!CL�s������kMY�b����d����H�"��������w^��=�����t�Z��<l�t���W_�����;wV������?(�����oE��c�!��2I�BtU12$�pRR*&$Q�
��AE�s��q
r�z2��1<:6�c$\
�
��r?w��y���e������s�w�����~>�{�\�����j�����I�{��-55���KGG���'T����6n�x��������VBq��D���a<.ASSS||���o`` ��������)�&����c�.477���;99��������4%%e����������cZq��Zt�jL6Z�"
����x�������t���4�����)����pqqquu����|��7-z�WH���4�loo����#''���'<<|��6]�_�X�m�6����@��X388���+�6w���>>>CCCqqq���~5���BBBjjj�������^�z��Y:���a\��J�����-zkk����Fx��l��L�~�����tk��6f*�lcc������p�����.sssoo���xGGG��uuu��?��������<kk���h���	�����GA�����ZXZZ��R(S^^N�M��������DuI[Y������m�Kp��������4nS8{{���X�HOO��{7+�4+++))���������3���._����LQlQQ��P��+�s�N�*�<��!G��1��~S�x���i�ESk���0� �k_Uq��S#
{{{����������ijjzLB��l[�n����)�k��:�K�c����<�E���%T�'��L�=�9K�GbDa�����8]btR,,,NH��g0�~���������o��I4�	������^��t��Z�0� 0� �id��40�a�`�A $`A $`A $`A $`A0���������+Y������G��h�&�t��M�6���tvvZ[[+Y���m��yc�p�n=
�u�����(��\�~(�`������������-[6���D���8;;���
v�6�=��d��?{�����&%%��u�����������S:w��q9�xxx���h��05 �w�[�(���SG���������n���~�7>~_6�z�TP'�e�����z���2�Ky��Bv�|$�N�5h����Bk��C���g��:Fz����.f�"""(kjj�x���:^^^O�>�N

����;v�����h��05 �n�v\�!���G�x����o���T���b1�j���t�~TP���F�z����/��a��c�����	�����M�Sc��D]�?��*����I-��)�}�U\\,'���N���[J�RSS���4�7�J��h��������7o��9�B
��{�9~�{��}���.\�
Y<<<bcc_}�Uzh����.]����qNN���s'11��������K�/_~��WWW�```��s���w�}���������-[��A__��������~gg��>����1::�������K�.����[^���\��&''����������

���1-*\(g&���?F�
��YCkZTT�������WUUyzz��������������y���h}�o�.g���'���������2�$((h��=:::j��%[�n��z>{�lV��D}}���W��5��qB�e(����-�---)^�S~�I������|����C{{{vv6�\�|����WBB����COB�%mmmhR����t��m
�^{�5�c�_�```0<<E�R��h�"*d�m��y��%_~�����){��w\\\������[ZZv��Ea���O�03�p��9�������*22r��Y|��x.�?��p����,K���c���_\�x����)%*�����)?�$���7%%%,,LOO/$$D�x)=���{���X�F��o�>J\)�T��F��d�	��9|���g�����/_N�-Q0T]]�U��������7��l�B1%�����t�����_���g���(�+--�J(�y��W������c�cgg'�\���,��;w.u�(N�������(�c�L��]�cz^���f�r�����"s%&&&��U�����KA3+��u���*�O�^(&vl���
�H��������S���O�,�^�����\�����>�#+W�����L�K�F�����f��������R����J����	R�@{!�&b������az2qQ9w��������c%���+V��t�Rww��9sF�9<<L!#�y����
�,Y���V[[�.a����[G�h��
������p=��)631S��/9-���?�1y�����h~���(p��c�I5�B+9FJ�rssW�^������OkWSScll�od����������']���F����RVF��������X�d�]
@+ �&������vvv�B�� ���^xa��w��}R����l��w�P�}��}��dD��P�?���RK������������R��������������[Vh����SCCC%�C��*��a�����+�o�~���Z����OY{{{�)[�;w�P&u����{���iY�n�v>>>666R{r �&l+�ocq�c�H�7�RRRF_.udv	�X��G��(������L"�DSlf���OQ���(V��(O�[�d]��L�Z4�1~������t�%u|&&&�SvK���������-]��,+++,,��S����>�%!�&,���m�>|8<����3g�I���v�Z%�dA?�dX����03�Qa&�-Rz�b�x��VVVT3,,���j�G|,���JD��.������Z��rss}}}o��!�.;
Q����Y�S(�� �&����477�)���)��3g�������sss�������BV�T����v�c����N�_���03�Qa&�-Rz�iiiuuu�����gddDDD���u����wJ
�$��)�-�Hfee����������t�����Nvvv�
��tvv����P/$`�DOOo�����?��m�������q���'ORaBB+����( ������S�N��o��6+�v�Zcc��U��~�j��I��T,4�p�MMM���������t���C����h�~~~l�
�i������d��X[[KO���2����(����_~�����������e��{���zyy�TPFWPP@�l�~M@�e���WUU���o�����;�������fff\����.<x����b������������pYm�?��x�������t���4A��SxfT{k_sT�I5�B��Q,o����	v�G)=�r�
��������%�CCCqqq������&9$$������yxx����g���4�N�3j����S
�k������1������_755����|;�zUTT�]]]���)�<\���`�@01�H�_�i��:sI�0��7�����)�8q�Eo������)���Y���lhh�������#sss77���hwwwYOdccC�$$$�>}����.������wtt�U`'+�c"m��)?3��
39���C,~���c�E��H3SWWG�#�����}ll,�����w�B����������������9�>.����������������R����s���K�[�����:::��K�f�����c��Q9k�,��JKK�z'
��7HYY5hmmM��}��	H�&�����+�(�/�{�.��b�l	��{zz�~����V�xNI(,L���|$!�Y��+�#���eK��[oo���c�P�h&��h�R���B���q����8	~���q�����������j�y�`��e�]+u��I�K�������lKEi�1��QF'�#5���JB $`A $`�����@s��	�@��	�@����q�v����hIEND�B`�
bench-50gb-pct.pngimage/png; name=bench-50gb-pct.pngDownload
�PNG


IHDR��g���	pHYs%%IR$���IDATx����L�����7���]6wBB�IJ(")��"��RH~a�R()���r���\r	!w�6������fo��9����svgvYg�����1�������93�}��9������>OWw�00	LB���$00	LB���$00	LB���$00	LB���$00	LB���$00	LB���$00	LB���$00	LB���$00	�<����W/^���e����������k���K���M�6=��sr#111_�|��N�m���q��J����^��d�b��g�����!]�����-��O�m��a���\P���+V�v��;v|��������3f����_6��~�����i���/���?���t#%%E����?��w�g�}�����������]�|y�����iii_}���E��;_�xq�����=�P��'$$,\���������%�(����\�r��������O?m\$G�t���W�\�Y�fN�p��������s�YS�H������5��G9r��rw^��`��'Oooo�vRRR�����>u�T�|��7�+Wv�`FF�����XH�i�����+���+w���{xxh�����rC7_m����v�j��Utt����?�d��+V�8p����/#�(P��u�AYoK�j���������(��;w�����<&�N��-��w��@MFr���,$��9S�"�L"n���N1���'�������?�K�.?���5H�(���|��2�TA�������T����"r��}� K}�����O��qqq���[�l���~+1���[�f�z�����><v��U�V�[�N���a�d�����Q?~�b��9�����_~Y�W���%���[���M��{������O�2�Q�F�[��jq6����m�58�����+�+  `��9/����.]�4`�	Z������'x�k�O>�d��!r�T�R�
�xV�\9��"�e
7n��4m�t����e��b:��f��e���f����9��k���������;����UE,]��c�����+��@v���6�����K/�t���v��<x�L�2���7��5IA�����|��lf��7o������?��S�b����y-Z$�����?�A��������
r������s��
���BI\,�����92i�$	]����7:TnH��
�(����+%�8p`��Q!!!��~{����W�]V������������*�=�����X��U%���S���k��4����g�F�$3DFF��^yyy5k�L�fM_�<y�<��3���=�`qy,��L��Z�reZZZ�
tqN:��O�w�yGB�5�I�JOO/_�����/��^�p�����_t�i��s���7o���8�<��
����GJJJ��e;t�����i���?�i����#55U�x��]%	���kK�.��_~��I�&�G��S�N���O��;����Zs�D��>�l��m2_�V�h��������O=����g��s��Qo��-��QCuV�������Y����3IIIE�����G�������~�i��/^��3F�t�������M��;�\�rJ��AI�����W�Xq��	���AT�^����cnDn�y��V�2n���_����7��}'}��3�����L�t����%`nG�J�$l�H}�����O�����R�9~�K��]z�"�����f:��������
�')I�1�%IO�|D&$��Ht��}2�?�������u:�~�Q����/���=����R,�=�����?����~��Gs�=��d@/�Ur�����W���+����R��$��'OJ�~����������W��tc��e����1����#$I��!x��O�:���[�n�#A����7���#z�n�����-Z$�J�� �;~P����Y�l��G���JH�����\�X�N�:I��q�������bcc����s�;����ds_d*G;�N6.Ap�^}�U	`)))���k�-���a���_��z�4���e(&7_�L
`2z;w���_~�c���W��d�:uz����V����K5�D��2�����6��n��XB]�v�r�!���2W�}���K2�V,�rIb�EG"""^z�%��^?�K$%%I��������_�@��r2S�����[K�W��|��������M�AAA��wW��~����<$''�o�^�
4�����/������e�)�x�^A�%)e�����
�!�b�O����!�������m<���tIP�^$���?��,X ��O?����7�r� m��������5k������~��G����M�6w���:��}�����;���m�Y��6N�>���4�����������?/�$u������@M��lW:��i���{;h���(�*U������w��9s����G����|�����iZd�,�O�(�2�����+����l��bJ�<q��<P�zu��,Y/���?��z��%J���j����au$-�d9Td4��,B����\�2~�x�������2e����l��-GY}����0===��X�B��$a���&M����y��G�i�#�i���������{P?����={dw��w���K�=v��<��'ffr� ��_|Q�����uL=;T�\������Y����TvvP�lLFp�d�S�P!�-QQQ��>������		����	��������(���f��!�+���[�����yS���GO=�T��y<8j�(Y��1cJ�,��W/��m�����1�q��b��M�06KOO�m�K��]����������s|.��U�������-)���G=t���
9 �`����-�x�bcK9�$+J��w%H��O>����0�������a��P�|�9��+W�����b|P?���b9��ck�	3rD���-j\[�DB�0��qqq�}*�Vy�����;�sVnc_d����
��`n_BB�����(P@�M����h�)S�����7��?�-�~�'����d-������32b{��'_\�q��?����J	o��:�~�����k����b%�u�����K�XbV�{�q�z;�_��fz�
����y1��q3���LO��Z���Z�je:_v���#G��#JNNV+�Wiii9������~�'R�q��1�X�x�p����fc#��R��w�^���Z���	��\,H�-$��z��]k�k������K������lt�"SNwP�7���0�mR����
��z�����*�2���{��#����5k��������3%!����9#G�5j����w�������k���_���A�F�.]�Zsy�|	r�	�0W�\�Aj�
$%%%iOS�R��8��ROG�mwXLtn��Y�F�~�x���8�������0`@ll��\��D����U}�V�O�d��m��y�?���R�>h�nA���^y��Y�f-_������;�r���M������}�)�;(���K���6���o�
��,R�X�a��cj��y���a��-\��.w����Y�(Q"88�_�~m��u|5�LY?�����%�/^������&�L�_G�V�������*UJ��U�V�O�$��'7:��bJh�.IO������O�r������O����u���h�b����>��d?5�+W.<<<���~��c����3>(���G>�����-��X�B��~��7n�v���m����7�|3W������;��mZ�d�b�����?��E$9������o���
�9��{w	`qqq�F�4i�����v���T�j���������z�
�U������=��bf���*5�f��K6��X�b����}�������f�]�Q���S����R2���!�r�y9%O���O_�x�6����	�e�������O�������%K?��c�+W��>g��}��
9~����jn�����d�-���[�lQ�=���:j��~�$����aaa��u3^P�$�����T�pdZ�n]��zPoT�PA�\�������u��u\W/
/�[��&i����J@�<y��o�����e����0�r��c��+7�XZW�^\F�����O6Y9�$��lK���t����C�y��GeO�������_`����w�F��-nc�\/�b�����_?~���+����u�}��i���74o��q��]�v-22R[�s��)����I�p'`rl���;v��Q�J�?�0���yS�I.�������(C�Y�f���K���z�7�Le��o���a��������j�'�|�X.R��q�6m�{�����+V�o���,!!a�����6��2�v��2�n����u�2�`�dd��^h!��S������Z2��O?�t�
4����~��W�O����o�������'Nh���_~��G��`W������~aM���"3���/�`z��]��|�A�]���u��q�c�w���^�������/)���r�=�K�.�t�\/���7���k���0��+�YwM�;�sV�1m_���x������dT�|��%�/2w� �n��q���9s���'%%�h��2��E����r��=#F�8u��L:����������Z�j%��V�Z24�����������X�D�Y-����� ������>����zHf��u���k������:����GCBB���<==e�*���;'�2
,^�x������X��TL"��Y�����m���+���Or��v��M���g�Jc��Dg��bn��Y��2�V��1�K�d/���S��z�9���+�2��������x�/^�X�����,X�R�L?C3�[�����K�J���(HA(���WO�5�I2����])3������R��_]����0���+O><;����\B���U�VY/������{����]���CV��zAT�<�H�5d�|��G���/���5?�y����i���7��Y�*U�;v�O�>����#&&F"��:�������~�@�d������e���"J����/_��9u��eeX�~'^��q�r�����I��S�4h��-u���TP�@��[�$9^\b��!C�Y.\X��0�<�1c�h�V&e�'�$�,XP6t��Ey������u��x��W��//����O��P,�V��-$��9R����;)�z�av�&|�A	T���d��_�^R��7j�����;v��N�����+�t��2���)����7�|S��8�zZI��������%�=�������������/�����Jr���v��I��]+%Z�p����P�
���g�}���/W��������z.Ypp��8�td�l�2)�TCB���Z(������s� Vr\I�P��?��>�����7�9���w�<�E���_���������z����O�"���M�d�|�$q=������Z�V�\[L��qd)C�g�y&((H{��5`���M�~�����m�����"E�H���[�����7��������.�X2��O?��o_�j[zyy��s���2�����<i)5���2���,~��Q^������������-ZT?����[d�U�;)f���:th�
�M�&�uy\e��1b��a���������)�K2����;&R��BM�<Y�\
���d�l��UF��v���i�Z=z��HM,����8�f�3f�:w��)�X�^Vg�=�������OW�Z%u��J���5h� �E�Ce�����?�����+WJe�>��k��e�����m��Ys7
��
�zd�B�
e��s��gU��1m_���j��%�7n��
"""��N��[o���W+�N�d"��R��U�>����9v�Z�j��n�$%��M����E6��~�F��������G�s��+��-�s������la�|����P	�2�5��h��/QP���UV�J����-����^M�p����U>>>�[8h#�����Q!Y��	d��Y1vF��}���������D�/���i�/-4��W0���&!��I``��&!��I``��&!��I``��&!��I``��&!��I``��&!��I``��&!��I``��&!��I``��&!��I``��&!��}C�
		�9sf���]���4|���?�x���}��uu_���a�'��W�p��e������{���W�^�-�N�����:XUzz�������{�������%K>��s2B-]�tNW�t��/�����C7o��P�����>h��<y�h�N�;w��uI���-;{��<(y,�>�����h���.]�5k��?�|���k��,X��h��A���4i�my���Z�ji����K��z�e�����p�%��*oo�R�J�����L����/Q��<�g�y��_~q����[�Z�*���Y�F��~����ct�����������/-Z�q��r�T�T)G+q*_�|���W�\)R�H��Z�`������r�<#�X���_������_�L�F����R�����7�(Z�dIhh���'�o�����+�6����6fmy7�Dw��S;���
�]2��^x��7�}V]�1�������}`a������+V�X�N]��~��z$}�m�V��>>>2��!������W_����w�~����r����%J~��m��m��a2b[�n���g�����������3O>�d���������?c�	��7o���o������NLL�!]���k��+Il�E�n�d��,�PR��m�vH�Z��7O�w���������/��R���������iS�R�-��@�n�z���������TR�T�X1���|��4�-:������%��;wN�*������ydC;v�p|t�c��!R�\`�;�w����V�j�_|�P�B�����o�`/���+%u�-%x4l�P�]f$��� O"��R"Y\����q+RF9����N��'�]=�o...����?������9R�9�������^;��k��������0aB�������zH7���9��������3f��������O�Je����CeNRRR�6m6l����_���'�mr���S%}������3'M������n��M�J����=z����k�8155u�����������'k����X�t�vNdd���?.�?��q�������A�}���]�v�q�tI�@�2��6m��h���KV5j�8x��<jm8W��_��Lp;��Q�=$}�>����:G�����O>���������P	���Z���)!��W^��OOO5j�<5�&aaaj8����$}u��I�/���!$����������;�3}�t�V$���C�-Z��r��Dw������(���3��7��q��f����
���}L���p��9]��u��P��K���WR��]�v�s��r��������b9+��O?�\��tR-e��Qtt�O<q��i�i��H�R,�9hg�j�J����II�����b����-===_~���U������d0����R�7�xCF��1s,��i/^|���#G�H���+;Bb������%JH�?~|�'q��SG���9s�L�@JJ���>����������[���/!��}!#�L��}{�F�*T� ���3..Nv�����wgz:��D	0r(+VL��g������~X��;J�����X�Bn��x��'e�����T���y�f�r���m+K,X0����?��dR�n]�!���.]�"��A�L�2S���Dv����!������6!O�^�zI�F����{O"r������KKv������G�t�N�r��\����"�C*��.�r�J�����f-kf�[�l���'e�d�,����_�tI��i�[mrr�K/�$�Xre3}����KZ����dXl�)N��V��:)CI�O=��.}YU�T��Y�S������lv{d^�~]��.y����]e��Px�����-��������?���_���������7���%���c�7�$ajgJO�J_�a�����������'hu����#""$Se3})�����7o^�h��eI�g������_�u�d�7���������~[�~��^{�:R��H�)S��M��'�a���;v��~���bcc���'����MR�v��1c�k��*�w����~(An��
�r��DN����}|���%K$�;^��x�@�k��t���l��]F�E�}���?��#�:^���v����5���e�&�����7�d�t������*T�i��*##C�bppp�.�(�u���H<���2�=p������O��;�g�F))).\��7g��Gy������U�:u*44T�����DEE-_��\�r�A�w�.��/��2���K	`�m��o��Yx��)���O���W_I���?�3�<#�JrVKI���["a�r����U�������%QG����g���������'�Y�/����(Lzb���%}��Y��_~��N�H�����HR��eg�u���n�1��m[y,������7n<x������-�?��Svb����7o���KO����c/�d�v��Q��M��ZUv�Ap`r�z���nK�,)cG������g�^�r��m��?|'N��d%C��C�fs����2�������W�f��n��!Cd0��o�#Fd��B��C�h���@"�v�������"+2�S������dj[/��#�l%d�����'=j��;wnRRR�n������A�;w������>j\�����������M����o�Q,�c����{���S,g��]�V�������������`�t)	�Rm��$���7��R�������Z�j�����S�d���KJ��?��c5})��D�Y�fIT�f����?�i�f�E�2e�z�)���/��j)��`�r^_�>}�,U�T�-����H������$r,w���S_��	3���T0��B�
/��B��
��q{���d�?���7����g��/�����n�:����\FiJf��)�;�L�g��v�_|1i��:H��v�_BB��o����?J�[�h!a`��}2�|����q������W,j�-+����X�����[�����m���z[���_�5e���������c~�����<d�Y��ww��]�ZgJ��A������3]�����Q?6��)����'i�6��7����?n����4d�r�d��DAi6v�X��l��	�w�Y�*�B��Y���{���;�Rv�����2���p�*W�|�����W�X�b����,��z��%�����R��o���R+��!��g����p�������l�:�n<�tL8��I��p'��#������-�s���e�$yC���S���/�����#t�s�p����zK��7o��_��\��y��1�[%2��E�����5����U,�^�j������%}
2��	�d��^zI��:uR����aaa��%�y�5r(����8qB�@���o�sd�-q�_�~��5�!��)�]
����md�.�6n�(�fY��<��^{m����&N���gn�?���9s����~�v��De�r@�~�D)k�����g���-%��C�r����Q��][��u@w��x��b�2.Ww_V_Y�t���X{�r��;v�]����~>|���~�M���X(�O��x�:ujTT��R�*�B������$GO"#��l�t�����XBZZ���I�:�m?R�
��%��z��2�����>�m�6���/_�����D���'��YS������\��U3��#u�U�hQ;mc��~�z�>|�W�^���w0���:�������
*�������+V��H���?t�?y�������n���]����TX����2��6��j��;v�����A�z	�������g�����I���-���?k����7���]�l�mP���by��������g�:�;/^T�`T/����;�J�����L!-;�[t��Y�g�}V��s�f��D9�������?���U��V����P*��SO=�]$;O�=��L8��i��}�����������a�;y����N=�G�����Y}h �%�|����������?-[W�'O��8q�xi����Kp�<�Hv�X��j�J����~:t��N�:m��Ew%:�G�����]2h��x��y�I�6md0*�cI���!���[j2���R�>���-Z�.8r���}]~���B�
I��-/��5kVV��=zH��9h��M�6I��}�'��V��k�����|��b����e�7n�?~�����={J���>d_�|�������������w�����L/�(G��{�������u�Vi����b9}N		�����U�n��i����$r�.{N%%%�����];���L_�r���@����e.\� A�(���+��������K�


���/�Q$�+o�������Y����?��C����?�~���6����K��h����W�����Ge�	d�V�B�|���P�s�[�.U����������Oo������m����?��+�,_���>���/��e������[�)S���R���n��}�=����g�}�L�22�/[�lzzz���s�+���{n��9�*��:��
����u�������������}����s��av'�d�Kr����o���*:::�{������c���'�{�+@�_�����_���-�e���G�������52�6w�D�q7�=��y-�'�>����tr���� w��B�����_}��z��7n�`711�M�6�^LL�a���S�6i�d����~������Gp�F��~iD����_nX���6Z2��?~�5����6m�^�N��a(��W_}5���}�������#F����8�1��K�$0��Q���/^��qc���F�������C!!!�@�eg�)���s��F�wl���O?��q��:��Ry�{��v����G��"�g�6�+�����M
������j�N���K/�����%������|�����_�k���Nxx�tO�|+��&MZ�v�D}���9�5��e�#��&�]b��"+��� �H�=��������rh�*)qK�2�'OV,?�v@]�<#���;��R����?��z�!]FU����o"w�I�T�{�={v��aK�,��-Z���'���H@!��E3f�8p��7�|�y��'�|2))i��]/^����]����,%$$��x�,[�h���\R��<t��Gy�������M��M�������6:%K��A����_�����p��w������g��������_e�|��aIn����)�fud�z���d���S'�I<{��G�/.�8u����A���e�Y�n]�������$�9r�����������.]�A��R�D�1c�H����d?oo�~�A6��a��~��K�.~����%dzz��Y���'%�8�:-�zA�-Z�^��p�b�v��}��q�sV�����{���8���
.��g����^�Q�+�|��������OR�<y��)G��E��a&{���W������^6W+����c�9~��+'{A������G����-�=�keHM���[�~}�w�������'��2��b��:�]z9v7�=���"/������T@��e���6F�?RP`r��������@s������+V

4hPVkUdd������gz��I�$�es�|���?<u�TI5iii�*U>|x�>}������y���{��%I�(�6�|�
�� ���O>Y�j�$���te��R��^��J��2��������i^�TbX��-e��:����b�
�d��y%%v������j���KN���w���Rg��Rv5�:8aO��K/��|�������a�<:I;���g��W�$����O����[cbb���{��~JU3m/���e������:t���[�.��6��
*H���I����.\��I�������R��������zzz�
e)�){���.B��19\e�h���A�7I#r����/��-JJ��M��������Y}w�.=���cO�}�xxxHM�@�����_7��C�r�����`����E��s����4���_���6c-t3���N�<yR2O�H�����tUF�
�m��e��5���Iv8^\"�zr�J��NW�����\���V���u��SL������9�^��8���~r����OVC-tm$����9R��Ym(��F3���Q4��q3���C���DFw��S;��)Z9}��n��={�/�u�s��?`p;&M����
���?`p;�o���.�{PL���&!��I``��&!��I``��&!��I``��&!��I``��&!��I``��&!��I``��&!��I�����2b���'��Uk��}�6l7n����������G=����{ccc���W�\��e��c�+V���.��Ahhh�^�v�������{�������k���m�S�N���_:|G�pw�����c�:u���U�����=��������,���5��eK�
�����&M�H�i�����3g���7O���w��LW�t�
z�����!�L��(X�Z���;[��b��U�V���������v���:u�<��#�v$�\�z��w���}���������{��Ys���j�9s�,2d�u�g;v7n����3���E7�����u�D,??���k�]�k������������������������o�?>�����'
��%��/����N.Z��������E:t�0|�p�?i�$k3-��8n.sJ�.��%76n�hm9x�`oo�1c��^A��~`���i4��i����M���d��Zc�L8p�Q�F����.��a�y�����IZ����"%K�t� ==]&�}���P��_~�e�����|||rZ
f��SG��u���~�����S�N��eG���{w�7<<\����-��	

50�����:nP�R%�q����5k�
�de������AAA]�t����w���W�������'N��d����������[�h��S�w�}722r��I=z�HNN���O\\��[�@�R�����f�:]�i�[����>}z���%n��In�]#G��e'O�<l�����/\�������"E���\���C�DJJJxx���7�xC���]��~���>z����Z*##C��%�N�6�9s�t�p��r���^��������L��t�R������[B����c����g��l����������/�p'k �e���'55�}���9%J�x�������c�����)�}���Q��q�Hv�Y�v���PI�������={�j�J�}����U��KU�Re��9#�Wi��IV�z������� c�;\,>����u?s�XN&�\����gXX�n)IG����+,[���E�/��uJ�.W��z{��Ir�z���������]�����2M�\���
����������3��9�X>
����[��4��c��`ZZ���[%h������"9Z��S�����M�&�Q,�)����z#o�������Lt��u��~��O?�$IF��������Z����4���WHH�����Ef��!�H�LJJ:~����o�
��t���VAAA�������:���?00P��N>|�R�J9�6��l��m���Wo���^�pa��������P�v��N�<�^�z�Z����Z�`����z�A��[7�3f�����SG��w�}W�F�A��
N�>]�V��M�n��)��8m`5{����w:tH�:w�<g��������/[�l��	w�xn���v��b��x��u�g�����'�|R�R�/��BbX�|�5j4r�H��^^^6l=z�d��7���/88��O!;]$�������8j�(���$�EGG�n����3((�O�>�Q*��~`C-�qss�������L��V��z��/���x��111�����s-,����.A���$00	LB���$00	LB���$00	LB���$00	LB���$00	LB���$00	LB���$00	LB���$00	LB��p��)�II	�9}��3����+�Z���O�j���%�U��m00	�;�~C�Zh7�������z����i��K!vs�U"��B���$�oKII1b���k���o�>-8u��=z��=�:366688x������-[�;vl�b����"�������k��>>>��w?~����v�m��=u��������n�"���4�;v�S�NW���l6m�4�����&M�H�i�����3g���7o��-{������z�.���$@�fr��O?]�Z���;[��b��U�V���������v���:u�<��#�v$�8h�����[oI�C�i���9S�
		2d�:�Y�f;v7n����3]��E7�����u�D,??���k�].������}�0�^�zwP@6��R���6Y�Wy�u�����Lb��o�=~�x�I����~�����k�/Z��������9:t>|���4i����qUNq� <<\��.]Z�Knl����r������c���A���Ie�V�d\I ������/��i�3g����W��Rrr��5j�/_>���
��7/,,�|���U9]�d��������5�edd�s�/��2w�\�c>>>�z�\�~`���W�"E�|�����������~������:'44���."�p��R�Jr����5k�����)#7����t�"Q�w���W�vww��W'N������-��3����n��y��5
�����'��|�"�����f��9]�i�[����>}z����=�i�&�-w�9R��<y��a��/_�p���7ov��I�������n �e�����
z���Z�j���222�Y��������3��kW�pa�-}��������L��t�R�������E�ro������i��eKBBBV�[�vm�;������������7��g���,_i�>����1���21`�I>�}�Y�����)�}���Q���"�Yg���CCC���}}}RSS{��)�}������V��.U�J�9s�����2��I������(p�}���O��������o}s�7�[���k7�����Yw�72������.]:q�D	0���W���d�`��e������-(�H��X��q�N)^�xv����V�\9���I��^�����������$����K�3M�\���y���C���_b��L�0�n������������n�*AK�6������Er��S�NO�6�D�2�.�~�L��7o^���T@n�r^I�\�)"�u]�����G�g�yF;GBQ��5k��_?����]����+$$d���j�Y�fEDDH(R'����?���[�Bu��E�6����

�_�~��=�9�������Eu�����*U������+J��i�LMv]W����m���_��NMM�p����C���������z���K[O��������s���:u�H�����j��1h� �����k����i�M�6es�
�f���{��C�i#V��������ys����-�0aB�@����]�BBB��/^�N���3  �����6l�0z�h�H7n���_pp���Bv�H6�))q��Q�/�Ir���n�����gPPP�>}�_���P���/T��z9x-�E!�.R�Z��.���x����%Sy{{��p�,���LB���$0�^{5>!�:����@�R.�r�W��f��U����W[6����\G\#5]�5�nN|������H�PvF��IHuQW`��&!��I``��&!��I``��&!��I``��&!��I``��&!��I``��&!��I``��&!��I``��&!��I``��&�XJJ��#&N�X�V�}�����z�������[X�N�Q�FU�^�� 66688x������-[�;vl�b�l��"�������k��>>>��w�����k���m�S�N�������N��.�O��c�:u�$q%�{��������V�Z���+g��]�t���k�l����OJ����&M�H�i�����3g���7O���w��L��t�
z�����!�L�z����U���sg��W�X�j��]�v���{����_�^�N�GyD���c�Q�F���~���o���:�m��m��������['�3g��eCBB��6h��Y����7y��L7�t�
"""�n�*����v��r����,&&�o���W�^��	@n�Xjj�$����g�a��o��yPP�u�K/��?��G����-��������A��.�'M����f\��E7�9�K�V��7n��<x�����1cn�Ls?0�4L�2E7����)))E������h��Q�|��m6l8o���������w�H��%7HOO�Ik����P��_~�e�����|||�Y.q?��0k�,	`o������S�lY]uNhh�1�9]$55�q�J�*���g���YSnH$+S���HLL

����D���{�^������W_�8q��';��0Fwn��m����O<��;��d\\��_�@]3___��3��.�����z��M�>�q��G���i����F�)�N�<y��a��/_�p���7;u�T�H��@�!�9�d��n��U�^}��5y��q�2##C��%�N�6�9sf�v�
.,�_{��.]������)K�.���_�xq���[�h!�v��q�����-[�$$$d���k�f��p��=]!)))�}�={�\N���V$i�xx['���u
x5�in�J���9QQQ����8^�e`Y��3j����G���r�O���)�}���Q��q�Hv�Y�v������p__��������={�j��}����}����U��KU�Re��9)))���4i�$��+�mY[����lQ��MY�������i}�|�a*7o�&���u
x5��i���vst�i$?^�)w��	`���%�f��������I��?y\�lYOO���0�"�����+��t����gg�nnn���SoK��^�������������DMOOOHH�4
pX�$wI����O������n������������n�*AK�6�m,��u�:u*88x��i%J��Iu��d���y�,X0WJ ��2�r���>�l���������k�^�BBBF����5kVDD��"u2))�������*T��"NXedd��_�g������@��:y���J�*���h�)J�A�9��w����t?�m���_�^����z����C������~@@��!C�����>�����w��m��c��9x�`�:u$�|��w5j�4h�������j�j����M��9Nq��j����w�>t��6bu��y��9��7���_�l��	r�d������w��<����1����+$$�:y��E�d��=%��9sFnO�6��l���%�yyym��a�����6n���_���`?��t�l�322RR��Q�t_6����ukOO����>}��ny�mk�*�m���*|��l�������\b�����U3���"�i �/c����=��i��k6-S���M���R�u��?����%``��&!��I``��&!��I``��&!��I``��&!��I``��&!��I``��&!��I``��&!��I`�#G/������9o=9�E}�u0��1�6�X��C�B���$00	LB���$.`			!!!�7o���NOO��{��q��&pA<x���3+T�P�D	www�;.����?��1��w�1�p�HKK�O���)�S����U��k1WV��V;��F�J�(�++wA���y�����.�S����3�9���X�����_T��i_
�����#��V�f��'O�,Y��Mk����1b����j���o����������+WFFF�l�r������~�;\ghhh�^�v�������{�����N�l����S�������u�e�r����b���Ktm��m�
wK�)%���-�^q���s� �M�:�������/k��a��U��������L�MJJj���$�v��I<;s���y��l��w�^�E�ip7���G�fr��O?]�Z���;[��b��U�V����N��X����#���/<^�v/���D|d7����A��7vr�d��^nP���:�_�l��Q�/_�Y�f��Eu�9r�nw����u��y��G$�H�16�9s��2d�uN�f�:v�8n����'g�A��3""b�������j��-w-\���bbb���;`��z���Z��/����q�nN�p^��>v��r-�6y1�u]��u�_�r�:Y�l���raZ�v�v�d�	`�?��AJz�m��E��k�������R�J�.]��M�RSS�~�����g�a��E�|}}���o���C������I�&���9m����9�����7Z[<���{��1�Y�+4�X�~��s��X��c�9Zf�%6�6�p��������-���z�r���v���)�_u��������GLV
������a�l��#�T1?*)m�y�*[8h�������Np����4������S�\�v���������/�&�{���8��Q�|��i�7l�p��yaaa%K�t��|y����|���Y�]FF��'�~����s�J����Y!`����K�?�\��v=���Ajj��U�����e�|���p.v�+��3���.���7�'����N>V�Q�~��}:�n��#������-�����c}�8`�(���w�����g/^�(�B�G�R�\����p�6e����W�������:n``w��J�*)����YSnH$+S���HLL

����D���{�^������W_�8q���+w��\�*����*����x*F9�����Z�M�r���C�����4j��]��.����?p��A�g;>P�^y�\�%�j��;a/���|�6���l������sJZ�m�=���!�S��d�9�W��x�o���+���������*���o���U��;%!,'����z�iB�
�d������m���E$�o�7^;�q�v��l���Q�����xI7S#�nh�����gm]/��yGS9qM�o���u�;��1��9sF�����7<	&Lh���K��w���
�����*���9mp7�)q�^�z��Oo�����G7m�$����#G���'O6l����.\x���N�:)RD��V���W�j'}�u��suD�|J���nN���[��������1�K>0QI����q��A~�b����5�?�`����3���'����v������j�:�Z1<�vR�W�W�1���h��'��������_��f�N����T��6%a�m�=���RG�|�x��S�������!���X�=�n�g�9�b��]�\�i���U
r��F��������n��a����<nJ��v
|�)�kY��c��~�����o�W��ur��_�.
�6�x�|�B��;ry����X�{X���A�3����vs4Gz���H�N��9����������1q;h�{ND<c�g�<J�2�-��U|�z�������;Ow7G����?o��>�����w��������_�NI��v�������r)!a��/�s"F��;g{<��g�w�O9u�fRRr�u�����@���DRl\F�������;����1�W�];��S����?�w��Sh����Y��"�/���f�cY���,w����m�����U����A��+�P1��}U�Z�������i7gz�,���|���rOi��X������w���.`z��Y�f��_�D����_�vm�v����-����]�OEs�m4��u��9SJT������^{�K�.����2e���K���/^��w�-n�n��c����g��l����`����GGGk�\�|Yf:x'����|�v26��i��</����ZE�i�l�����U����p��8[��&�x�[m��I��|��C{~��{���n�s��`���O���v#�g�����w�����v��?���4��Q�����j�L��kl���'�:�Q��2f��}lL�vR��nG�[|��U�
�;;�����/��t�5�p���k'��c
d�B��W)e�['����s��p���T`��W�
6���s�����V@-������}�O�����]�i��Wj��6��e��3����}�h����\�I�E��7�l�82��������wB��7~�����m���G�Z'O\L�=�����3������Y�����O�DO�v�?�����tG��?�O����d����-����x���6���"C���N��zf�� ���
�}�:y�����������?���N�q6NW���+��^��)b�<-�������~�H��Nz��Ni���AR�]�:}�����(��IY\7���}nX�Y�d�c�u�PI�I��m��{�U,����y;/~���u��Ob����uip��%m��Y�im�Z�WN������{�x9H� %U��
�E�����)1v�1OQ7�|l0sk��C�W)B���
��<RP3����_�F���e�9~�����if�6��FDu��V��tM�G���fkP�LQ�Mv}x��7���������?�f����3��B����?���y������-��������.��d��e��|����g��n�n�X�������s���������[(��F�k���o0i���1��G��U���Nfx�S�v�������%..N�|�&|o��	U���#^��E�u���������*��|��S���5�\�KY���_���P������j��=�m���������������{yi�x�; F�:+�����EB?�o ���������l�j;�&OR����^%�._Q4��h�N��2�$�/_�
�����5n�8�0?�[]�Y�?�
��:k����� G���V�Z�o�^�E$)U���c�*U���3'%%�x��&M�d����-k��@������?��g�
*W����5�XL�r�.�U~�l�b��_�?��dsJ����m��L�9*���S�mO����m�6x�{��?��#��5~[�^�zO���?�>2g����bv}���e�����yS�sg��<mk�[��b��P!����v��5�M+\�_���������K�����mF��_���-������
4�Y�I���-m�~��A�By����<�-�e�{��Q���
����Ni�<�ngm�Bvo���]�p8�v$����8�Y0_T��������7���E��>��sc5j��!�sk�����Z�f�@A�s�n*/�]G�g�QU�����<���_����C��%uE�4gJl���=��v/q��U���9���������O��z���_T�
i��M����#KwmX�U��x�n�
����<y���+Z��/n�����s/��oQ���^T�XQ��7��/M�����6����������Q��/��	+�!)���<�{��:���VE�����.�T�m_/����N�������h��}�����g����L�pg-^�����9��k?uj]�FE��E(x�	eK��o���R�K��=��GZ��������ABh�����gk*%�h��Q:2���-������A���R�mO�v������������k����oB�eoo/��y�I�}�{���mO�9���3�����I:�k{�{��
T
9�|F;�`A_E�C���#�
�)C�'����}n{:�+Q\��.��~�H~��(EP4��hm����g������d�/���I�9����8��7����G�W8�����/��o_���=���W������W�Kh2Z�n{�.PP{���~7.��N���O���G;�����\��=:v�X��>�w����N��ee������K�Q,/U��w����S�V�\9���I��^�P3�����y����'$$d��qG�^y��M�9_����b�,2zC����W��R��	�����/o�Qr���?��)�[��uRR�<�A{���9�7������L����_�>/�vU�5.'�'k�����(���w����X���}�r�v���v��<|~��sw�?]�?;%��r�����?���:d�v���+���l���/��\�$E��dr�7�`�w����U�n�?��CR�5����m��Ur�z��
��:O�:<m��%n��P]D�"�z#o��
\�G����i�Y���k�|�7�R����/o�����|~�����;����p�#����:
���������u\}���rLBhd�u�D����J�%%��Q����N�����e���:�.`��W���/^x���+�f��Q��=q%��]����+$$d�����x��Y�y�� ))�������*T��uZIL

�_�~����=���@��:y���J�*���h�������/)o>���T�LDD�=vr�u2o����@l:���%�9�u.�sag�#���"�R�"��C��m��Z�j��J�*���|���~�A�F�~�7+��m[��������z����:����t��m��c��9x�`�:u$�|��w
�6s������j�j����M�����V�g���{��C���s��s��i��y||��e�&L�pw��	���)/�_zal�,�f�b��&�{���1\���i�d��?�p������+W�f�8v��b�������={������a����GK��qc```�~�����':m`�[������8j�(���$�EGG�n����3((�O�/��%]�������r�{x&�:o w��w�:X���GDD����.]�d���m}���6{B,n�A�j���g��u��/cq����\����y/:a7#>�o fpMS��pap_����TqJ����c�����w����w��������u	�*���t�^�Fe�p
�Xjjjzz�z����q����1�;��6�~��?W/G|�������������o�>�
�?������u�9���u+|(��������Y��.����?��_�/_^7�����M�^���������G;�k�G+�pU�wz�r�����Z��
�m.`7n�~��q��S�����JlB�wvC����vm��L
`
Po4h����]{WZZZRR���>jf�L��-[����o�~��g����w���/^<((�������s_;n�|"�	v&S�y}"�m��J`�^025���X�~���S+T���7##C�L"`����~�6�/�����itl��f�'����\���.��k��7�|����&��)	?o�^;����k*0�&0��_�\����s������v��y��e��L��O�^x���7o��W�Pa������H��X%��m�3�R���z�(.`�F��Q����~������<x�P�B�}����w�n~@���5W���6��#�������� ����__�u��U�s�+6~��^�z�1b��	�w	��<J�:�9�.�
��\���������^^^������;v����?L�4��;vs2rQW�^����C-Y��E��������cG�:ud~BBBtt���s� �����k��QQQ���o����a��\�R�p�3fT�V����9\��t����y��Y�|����c������O�6����9\�;`o���z�H�"��m�~�z�J��������	�`������8p`����3��-kr7���pO�\(����?�������{��'Nh��,�Z4��m�Aq�I)��L��S�N�:n��*U�<���nnn�w\�l��������g
,�����G{��#G��p�����q��9}��3pW� �]�z5o���52�����iC�}�����Wu�*���w��Q���'���5�J��������������M�+�����7W>^��5���'&�&�{*y=r�s����a��Y�������������������e�:���
`
�7n��\�t����Y��0�����3��������>�����I������Qc�����s���8}|G��c�Ioo�M;��?��p�0Q�R�L?�?�_�1�nNFj�V�{�����e�,X���{(��\��pa~u���'Y�^b?��kz����� ���_�t)44�o������������^�T�.]����������v���7
.w}���`�=���6)))���	����<=�[nnn������%J�(^�xZZ���]�r��+��0�y���Wol���W�^����U��:'##c��-��w:t�i���*�����b7���J`)u���;`�6l�5})����6m:`��A�Ys��o�(�~���y����].`�.U*�c�\�r|���X�B�/^��I�����,X����9\��u�6a��#G�H�9�.]��y���{h~2u���1c��������/V�X��u?���5jX����\�2222  �e��c������t�
BCC{���c������?���]���m��:uj���^^^�Z��LB�����3v��m�Y�P�!C��]�������O>�d�<y���[�b������/���a������$�!Q�]�v�j�:s���y��l�"R�S��t���=z�����l&w=�����U����u�+V�X�j��]�H_�=�LR��#�v�������E�V�PA����L}���qqq~7n��y��}����G�l�����BBB$4�
�5k��c�q��M�<9�u:]�q�����[�J�����]����p�Bk�����8`��z������S.`*ww�
���g����4h`�S�zu__���pur��E2��k�:H����&Mrss3���"���.]��z����q�����������������v/�R�����O�<)�K�s�������
�����4j�(_�|����y������/_^�B���,Y�q���t�r�~u~FF�:G���/s���<����k%p�21d����S�N�'O�\�����?�������9R�
��S�lY�R����Pcs�Hjj���*UR,���YSnH$+S���HLL

����D���{�^������W_�8q��';��ss��n�L�w]W�	����R�������o��s��sJ�.���??���r;..N�/P��n)___������:]�i�[����>}z����=�i�&�-wI&�e%(6l���.�y��D�"E���;��y��+�����po!�e���c/��BFF���S+T�����?���+W�|��g�ZJ�+�����"�3g�l��]�����k����K����O�2e�������/���w�-���;��??��e������6�v����h����/�L�d�a���������s4B����x�y���]+l� 55U;eo������<d�c���5�I����Os������C��E_����#�5��gO�U�_����c���Q���
A:�[alL�]
EP�(`e,�l�S�;�-&���+B��O;w�<n�5N��$''i_�d�e4�IK���u)>^h��`<�uE�j�B��(�*�#[�](�X�m��?z�:y���-F�M�p��`6!.��.\�Awh�� [���!!���UE�=�����|m����+�C�^��&�
/q1�1��
�h�=u��i��{Q����c��@��n������4�{�Q,���]���L6Z�"��{�1!�~G���lx~��x�I��>�u���!����!<<B;i,�lQ�c�Rv]��6�]G��!&&6��q�3���/�����n�gx�J�A�����q��+�5�c�!������%�Z'�^5���A�n����`,��"$&&�� ���Icn������)�wL�H��n]���7Tt��N*��f�����P����_����q�������NGk���]��Ru����E�N:��	�X��};t��~����G��W�=zT=�O�����<�H��]CCC��������9��:N��:k��-[���
���g���Z�j�����T�Z���T�*U������b�$����������lY�h�T���23�E��������A���+?�p
:���W�?��s��m1�IK�{����y�6)��������{�TC���W�c��pa��-O��7��n{k(�\9��A�.�}�2~[�^�zO�oi�t�}ZY�����0@^��i���j;�{?�+T����"[3[����p�W����K��TZ��x�n�E�5��z�
jV�:y=�_�F���W��Y���lU�4\FUW��������]W�"�E���~�<��E(T�P�f�X�F�U,_�:y.c��5B���a�Ic
��G*g���"�����d���"x�9�h���"dVv�"��/G��������h��i�@[�>rc�����5��Z'}���5(�W����r0'�7�=u]��+V����f�������2J���Z������yJ�h�>���Y����*�lA4�l���BW���CK^C��+���"xyz&'�&uE��OVf������f7 �>D\��j�o(v/k�"�EW�ua�C����Gi�,dx;�=����R�,�i!�_��P����96�1������OT�m�X�[e���2�+��#���
����]�uE�W���}�q|jZ�Z�Z4���p�e�)m]���(v4�A��yeV����[W�/w/W4�4����nj�������G����������]��*r������TtE����"�z�����/���J������h�8P�	�������NGk���]<<$�e0������h����������W�V��`7n���k����K��u��p��'N�+�����0�������q�e��u�H�����N77�r����'M�$��G����E���������L� W�D���[4~���w��M//��u�����>��_8NKK��u�-ml���"9Z��S�����M�V�D	��z�����7��/�\��W�h����8p�����+WVgFGGo�������G���]����+$$d���j�Y�fEDDH(R'%������CgNq��*###((�~��={�T���������W�T)G�F`S�������q������&O���];���+V�x��������f������[��3����u������w���Qc��A�N�>]�V��M�n��I��t�
��3�w�>t��6bu��y��9��7���_�l��	�z�����+�m������/�����~��'������>��c��Mk���/�����a����GKF��qc```�~�������E����������Q�/�Ir���n����3((�O�>�]w����G�q��<i������L��V��1I:^$;
D����U,W��k�`Y�ej{���:t�`����E8�H��SJ�Fv�>^��?����l08�����<h7+5�5]���`�z�R���'���_~i��p�~����o���t����[��&S�b��UD��������27{���`K�.�N3��q�K9��_�M��s�<�p����IwN`�}����c��4#���2/�-Y���m�=���G[�s\�Lb^k��}������W���[������0�yl���L�0a��M?��9���z
���3{��m������7w��m���?����]���+X�`�6m80e�W�����_��aC
RSS��s�����e^���gVwI�Z�z����7nlZ�d��)�C��:uj�%&N������rO�f��I����k�"E\��[\�n��y���|�y�L�������U��~x���]�
0�=q
"�``����t��{���X����qe���LMM=q�D��%K�*����	\����3z������:�R�J&Lh���K�&pA[�pa��=k�������(Q"##����k��m������eK������D��&=��@o���>��6u�T�Z��/wss��?~�D�q���������I�<J����}�����c����/�����K���pA�����b�/,##����9\��W���_������3%���1�F
>�����6t���m�V�VM2X�R������?��?DDD�]�����9\���i�d��?�p������+W��8����w�:X���GDD����.]�d��.�	��5LU���3� �%$$���l��9:::==]w������s�����s��X��c���?�>.`��9sf�
J�(���n~d!�z�5�tjj&� ������?��1��w�1��B.`111/������rA�Y����'��!������S�{��/���F��o\�l��Q�/_�Y�f��Eu�9r��.ej��
���;p����W�:u>�����~�zolllpp���+###Z�l9v��b��9X��E7

�����;|||�w�>~�x�%L��m{������K�s�r�X\\\�R�J�.m���o��o���C=����&''�d�f��l���A�7))�I�&u��kW�V�3g���7O���w��LW�t�
z�����!�L��(X�Z���;[��b��U�V�������\�v��a�Fs����������������_�����f��.T���3%)���2D]D�Y����7y��L��t�
"""�n�*����v��r�t��bbb���;`��z������#.`���������?^M_�|�����nnn���E�|}}���o]�C������&M�6�r������2�������q������������k%p�2�i�&�3M�6�����*�<p�@�F�����]�a��������[��EJ�,��Azz�LZ������������s%�����Z	��L=zTB��������s�NI;e��1bD�������p	?2G��:'44���.�����A�J�����gk��)7$��)SFn$&&u��E�Z���W�^�������N�8�����[�g"**J�o��E�N��}�����I�&���#99�O�>qqqro�tK�������_7���"NH��W�����7n,�p��Mr[�9r�,;y��a��-_�|���7o��n)RD��B-����///ww�����y�f�E�{DJJJxx���7�xC���]��~���>z����Z*##C��%�N�6�9s�t�p��r���^��������L��t�R������[B����c����g��l���������]���k����Os����h��[iV��^jj����={b��['�F���=/���k������g��i��������������?F]���*E�}KY'�����7L�uE����7p\��n���{�X��V�"�=5����b�~��"��T�s�����]s�D��Arr��K�PF���4]{]��������/_v\���+4��:�p�	h�P����m;~��u��a�[�
(j�4����l,B\�].\��+����A��i�>�+BB������{>���7������W�n�&�M�^�bbc�����{�����"�DE�wt&������-�S��v���5G���w��v2�ph��`�S��e�X���+B|����?��u'��� [�]�WW�(��KW���������m�Rv]��6�]��������-����
�7���/�����n�gx�J�A�����q��+�5�c�!������%�Z'�^5���A�n����`,��"$&&�� ���Icn������)�wL�@����+�q��������]��@E�@���8Z���@E�X�![�
E��h�8P�����h�X��5�@��ii���NGkw��(���_����CY=������#��}���9%J�x�������c�����)����s�{u�.��u��];44T����o@@���g���Z��~�!(O��U��KU�Re��9#���o��IV�ZkY[����IU�P!%��Y����t�����b70���j���#����T���-9�|F���w�bl��j�6,��y�n�W�3�{=t��j��=y��9�".�������PD�rR�����"���+������pE�H�f�Rv������J�����R?����0l�lE�Fk,��]�y��c	��J��o�m���u�A�5�?i����/e��c�+e������*yzx�V�+��O~�pLWy�r\�"�E���~�<��E�'T�f�X�F�U,_�:y.c��5B���a�Ic
��G*g���"�����d���"x�9�h���"dVv�"��/G��������h��i�@[�>rc������e
g��>��x�m�~�.j:-s�}�S�5Y�b���"(�k�����v��(�n�rhif��K�?t�)��y��P�g]v\�������E��]
-y
IV�h��������l��!6>Y�uT�^W�����L�q���![�������`�]��mT�Fl�"X������X�T��y��������+Wv\�B�������n��S�'*�6i,���g]y��a������S��{����"�+�����E�����j���������(�Oi�� O7E�����R�h�+���2h�������)�E�u4�����"xzyj������������]��*r������TtE����"Gk�"8�h�cr:Z3Tt�.�d�f,����a�bW��e0]����.;�`������+W���>s�LV�P�V�Z������<xP�3��oFK��Wd�|XX�n)IG��M����e�:^�x���Y����Z@1i�$�W=��./R�]r�J�2M�\����y�/-����%��;�j���������:SB�b�(����n���������iii[�n���^C';��h��N�
�6m��G�_F��.%7���k�(�2/�-^����~�|�r���?���R�J9_�E�v�:c���tX�����o��?�\�jU�(i��W������G����5+""BB�:���t��q__�
*X��x�
�$���_�g������@��:y���J�*�����O��<y��i�Fn,Y�D�F����#j��=p����'��W�U�VQQQ,���P/<(�u�&s��s���:u�H�����j��1h� �����k����i�M�6es�
�f���{��C�i#V��������y����e��M�0���@���2�[�nUo�={�����"J�,y�} ��'�T�T��/���/_�F��9�zF�����
F�-i���������v�S�N��:###���Q�F��$������[{zz���'�K�N��w����#I��������3a��#�{��� ��H.
����j�����x��4��7^lT�\�c���e�����{��Y�f��_�D�T��?�v��v����-[�t�
�rA�:u�d����k��4~�x�^���#���rA;z����cu�����

������s� �I�JII1��v/��%.`��W���/^x�I\���f��Q�F
���pA:th��m�U�&�T�R���������"""��]k~�.`m��Y�d��~8y�d����+K�
��\�;`,���#""���J�.]�dI��L���*k����\���B���$00�������;���^�L��5k�����?p��,��<y�u��'N���'���{RR��?�p���{�U]���el���=����[�+&��/_�<yr�=���OWu	�*��g�}��o_u����S�NU��:t��3L����6i��|��W�k��I�_��!CJ�.���~��������_������`��>|�O<���o�3F��+�����OZ4m���o�5�?`2�X�>�����;����j����m��'O��%K.\�������G�:uv��=c�IbM�6�����z.�
�������k����U��3F{q��2;����^�p!##�d��+W�\�zu�~����+����'����i�&I_��&M�|���G�1bD�
���3f��
��%0�y�s��O>���q��/���~���������_>}�����������U������u	�d^�d�{�n�d�������?����"E���Y�������M����V�dI�W�:u����I�]�f������������������`���k��o�|��edd$''�-[v��E\��}��V�N��������WA,U�T������M�������������{�~��O00	LB���$00	LB���$00	LB���8p���S{��1{�l���������+WFFF�l�r�����s���8n��W�;v���t��}���������m����S���������0'���7m�4�����&M�H�i��]�Z���93o��-[����W�S��q����=<<$��]O?�t�j�:w�l]��+V�Z�k�.�p�"�9�����[o=��#����9s�$����!C��s�5k��c�q��M�<9�U9]�q�����[�J�����]����p�Bk�����������w7� W���#�k�����7��_�h���o����s:t�0|�p�?i�$777���.��Axx��)]��z����q������������K��]A���3g��������X)99����5��/�v~��
���V�|y���.R�dI�
���e��222�9��_~�;w��1��x��X�z��U�H��?�855U;?<<\�O��eu��9�����t����*U�g���Y����HV�L������K�j�{�^�z�������:q�DOOv.poa���o��v���k��)P�@LL�����8�_��������_�n\��E�6��U�^����7n������6m��r���#e���'6l���.�y�f�N�$:���~��X&._�<h���^{�U�V�_*##C��%�+�h��9�]�v�����.]������)K�.���_�xq���[�h!�v��q�����-[�$$$d���k�FGGk����HJN����btT��PTT���`O�q���gO��t���}������e^�v��}�:om���4]}e
�Iy���us�����QQW��e�������t
tE�����"H���8.�tX��X�=k,��G+cd����A�o1I�E]����s��p��9p"F� 99I��%[(��OZ����K���CKWy�;.�U�E�?�E���
�](�X�m��?z�:y���-F�M�p��`6!.��.\�Awh�� [���!!���UE�=�����|m����+�C�^��&�
/q1�1��
�h�=u��i]t���;:��h��Xo��)�e;i\���X^���tQ;�l8�tE0�)P��c,B����!>����Z����u}�-�.��+B����+Bxx�v�X�b���I)���nG��s��q�E���
��@\A��7�e��V��m��_��"�3T;y=N��uE�fx��"D]u��u����D_������5�"����}]�ew\���D]��Z;i,���Q��3!5�����_�uE0Tt��8P��;������"Gk�"8���>d���9�*:Q�9���t�f��!-M?"���h�N�21`�I>�}�Y�����)����s�{s�Hv�Y�v������p__���9�z��)�}��r�S�j���RU�T�3gNJJ����M�4��Q�a-k��@�<�
*�D�5��7��n{W��W�z�U�s�xbd�z�������#����h��n[�m�A���e�7o�m��rFs���=S
������K��".�������PD�rR�����"���+������pE�H�f�Rv������J�����R?����0l�lE�Fk,��]�y��c	��J��o�m���u�A�5�?i����/e��c�+e������*yzx�V�+��O~�pLW���@�E("[���^�����XyB%j&�Eh��Q������2�+[#��Y�f�4����r�:i,���]J�,�+�����f��+Bfe�+B��r���)���{>��M��e�#7v);��X�p�:��?��A!�B5���9��������]�bE�_���N��+���Q������(���l��S2E���'�������U�g�ye��o�"4Z���\������39�6�+Bl|�2�������5���!���UC�xC�{Y���#.�"�������E�<j�;V!�����E�������#-*W����
�i��1������OT�m�X�[e���2�+��#���
����]�uE�W���}���1���U�ES[�]Q��6�A�n�b�G]����Wf�Y���uE�r�rE�gJcn�������^����n���6�b(�q�rk�k������74�}�]d��������*�#�X���������9���t�f����CF�vLW�5���������.]:q�D	0���z{QSPBB�L�K[��ee������t�X����t�H�����N77�r����'M�$��G����EJ�K����t�p�i����6o�,����_b��L�0�n�������w������n�*AK�6������Er��S�NO�6�D���2��t)��7o^�_@�L�G��<��v���:4k��_�~��Q]�v���WHH�����6�f�����P�N&%%?~����B�
���8m`���T�~��={�s���e������+U���o�0L���v������K[�=�������s���:u�H�����j��1h� �����k����i�M�6es�
�f���{��C�i#V��������ys����-�0aB����!��//�
6�=Z2�����������.��uFFF�����F��}�L�[ttt���===������s78�;As�P�B����$�Xd�H�j�r�Hv����/6�X��1����\�&!��I``��&!��I``��&!��I``��&!��I``��&!��I``��&!��I``��&!��I``��&!��I``��&!��I``��&!��I``��&!�e�������_�n]xxx```�:uF�U�zuk��������+WFFF�l�r�����s�N��8n��W�;v���t��]�����]��mO�:��~//�\-��A�DTT���?��U�W^y����K�.]�v��-[�|�Ii�����I�:����U���3g���'����W�S��t���=z�����l&w=�����U����u�+V�X�j��]�H_�=���Q�F���~���o���:�m��m��������['�3g���2d��A�f�:v�8n����'g�N��8n�u�V�X~~~�k���.\h
`111}��0`@�z��ZU�)X&����7od���K/����������E�|}}���om��C������I�&�����t�
���eN����������-���=f���y��X&�L���s������"E������4j�(_�|�6
6�7o^XXX���u�;]�d��������5�edd�s�/��2w�\�c>>>w���M�l�5k��7�xCn���K�)[����:'44���.�����A�J�����gk��)7$��)SFn$&&u��E�Z���W�^�������N�8�����[�;�m������'�x��wd2..N�/P����������u��.�����z��M�>�q��G���i����F�)�N�<y��a��/_�p���7;u�T�H��@�!�9�d��n��U�^}��5y��q�2##C��%�N�6�9sf�v�
.,�_{��.]������)K�.���_�xq���[�h!�v��q�����-[�$$$d���k�FGGk������$%'��\g1:*Zq(**J�|�����k�g�������������k���v�Za��u�����i��������������?F]���*E�}KY'�����7L�uE����7p\��n���{�X��V�"�=5����b�~��"��T�s�����]s�D��Arr��K�PF���4]{]��������/_v\���+4��:�p�	h�P����m;~��u��a�[�
(j�4����l,B\�].\��+����A��i�>�+BB������{>���7������W�n�&�M�^�bbc�����{�����"�DE�wt&������-�S��v���5G���w��v2�ph��`�S��e�X���+B|����?��u'��� [�]�WW�(��KW���������m�Rv]��6�]������h�����
�o���+��������RuE�g�v�z�~G��p��uE��������i�����W�/kvE��[!��"�������"�k�v�X�[G��)g,Bj��S3P1�t��`��v�q��{v:P�5�7#�E0��tEp>P�-}��aCr:Z3Tt��s6Z3��h�0P�+BZ�~D�+����� �eI���Q�F���/H��~<����d����Q��q�Hv�Y�v������p__���9�z����U�����!(O��U��KU�Re��9)))�K�7i�$��+���-d�E��*T��i�,_�|J��]�?�_��IW��Q������{�~K���W�?�mp��m1�IK�{�u��i��+�����L5�����<p�]
�W����E(�\9�d��pam�����m�ieM��[$F�B)�rN��X�H%T�a�K���Ym
E�f��y�5�����
����K����7�6a_�������A�����N^������1���kVi�y[�<=<t+���'�n8�+B``��"�-��H/@���Il,�<�5��"4j��b�j��s���J�,E�N�P��?R9k�4����%K���s�IE3��!���!~9���uE�=E��M���������^e,k8k����_���_���N���h�@��uM��X������������2J���Z������yJ�h�>���Y����*�lA4�l���BW���CK^C��+���"xyz&'�&uE��OVf������f7 �>D\��j�o(v/k�"�EW�ua�C����Gm{�*dx;�=��h������{�E����P!?�;`��2F�2�����M�p��YA^fuEXrd����TAy�^�����
���/B@�"�1��Z�j�hj����+��S��"��MQ��h�+��=Z���8+�����_�^�h�Li,���1�6�6���S;0�
Tt��WE0Tn�z���8P����f��t��+���8Z���@% @{$�����q���p1'�5c����"xx���.����`����t�A���/�7s��}���&M������e��
�-"�H��i��t����gg�nnn���SoK��^�P3��H�w�1�������i�*��I�����'�<Xw���W��u����[��/���m��U��zm��X$G�<u�Tpp��i�J�(��/�[O��y��5��k�2�r���>�l���������k�^�BBBF����5kVDD��"u2))�������*T��"NXedd��_�g������@��:y���J�*���hL@���!C�W������>(\�p�n�,X0f�����SG��w�}W�F�A���N�>]�V��M�n��I��t�
�f���{��C�i#V��������y����e��M�0�nT�� �e���[_
�6m�����{K�����a����%#m��100�_�~���~
��"�\gdd����?j�(���$�EGG�n����3((�O�>�P���	����I.
����j��W�x��4��7^lT�\�c����p��&!��I``��&!��I``��&!��I``��&!��I``��&!��I``��&!��I``��&!��I``��&!��I``��&!��I``��&!��I``��&!����������+WFFF�l�r�������E7

�����;|||�w�>~�xwww����m{������{yy�����nGRRR�&M$��k��V�Z���}�Eqn}_�+ED)�(Q��D{�%j�`��Q�����-�WITT���\k4*��\#�kB�5`� D�����gwagY�w@����g��)g��}����1--m��m�N��x�"N�-":Chh���!�f�T�^{���#G����o��_~y��yT_�
0}l���*��+W��3�k�����a��/_�f���>CVV��3g�����n��=�`���S�L	o����{��L;w����������C�.X���W�^m``��"�g����WWW�)zp��q~�Y�f���/Y�����
�
{������;v�hff&l

��m���7�4iR�E�����PRRB�|iWZZ�����O���Q=V�N���S�Z(�*,33��777�v�%==]�]���H����� ##����PI��aCzPPP0~��Q�FQ���W_��Uk���}���.@����=zD-,,��---������"�3P���M����w��)55�����������e��Y3���{����?�|��vvv�����	l���?�i�X�>Z5�z
�����Y�.^*��xC��mM��_L����+��������u���
[���=	|1����m!��������!������������Zur����BWg�*�Np��S4�2�j'42�Nh����`aQ� ����������Z�(l�	gP�����/����~�j'8�	n����>jt��7�}�_���	V��ZE���q�.�/:������B��j�Pd�X��	�lUn"��l��	E&�F�	pV�z�SF�F]���W��&�EZ;�i����:�����E���
[����k������f'��S�TW�G�`ee#�l�f��	���*��.
����f'�v�wv|�K��P/��O~�5��HGwkQ���^�w����V��?j�`�oQg|�p�NxZ�a��	��*#��{}�N�������,�,�x������\<^{1CS'G�N��eh��~�5��
Uj���Q4�}1mS[a���s����V��I;[[��*�.S��"���#�NP����0�bE�h�}P����V]�Tbv`U��Ojv�I�{���8Rj�`bd(�	N�
�"�~E�������Vv���3�u�c��fZ;!��Kqq��=��s'���-�{f��Ke�tZ�8�?Y���A��xy�NjvB����C0x6���}*�!��v����I�N0�))�Un'���������fa����E��{����P�)uBS��j�`Y����NP;;�Z��tBc���p�Np2�o2^%$�N��E{[�b~���V����z/F�2:�������]��F��>k��J�3�"������1P4d&�J�&&��r'�DE�����:��lM��+��P�lM#Q��U"�t)�w1�@���	���j���	F��v�UBR��l�2P�U���R��W�U��p���78�����l��!�F�JIIY�vmBB�����]����z��A�6l���e`�N�z��Iy�;t�����Ge�1?����L?�/���R���2���M��7�-�^=���R3���
Tk���V*��!��4��w��Va ��������3�����@;.����C�����{?(��X�����'�	�
�Q���G�k7t�RG�:�U���	ht���
uB-�N�����Oe��pR�Ve����J*�:����r����w��j'���:����*�������^��P\VY�j'R����W~E
�4;����{1]��	]]UVX��`��	�&�S_��NH	����@��+��uBS�@�d~�z'���pI�wQi��	F�����I���F'�`\�N(P�4����qg�d�;�@-3�N�-�	V���2~�E�J:�t��C�NP �^��NHQx���Tk2������I�N����!�Ju���l���q������N�T9G+4:�Fai��*i��j���U;A,Q��������h&*��<�D��������	Z�����O���A�Q�l��BM�:A�lMo(�*���ZQ�7]\�lE�e��Z�JOO�������W�^QQ���c{��5h�����{��5k�w�����u����B�[�w��YQzY������d�:���C�Pb�=����T�d�:� {�!��1�@u�A��Cj��P�U���������7���:��z,�����:
5j�=^�z5=������������*P�VRR����2�A�
�
366n����K����o<X\\|��*��{c��H������.Z�(66�A���`��.$����ZYYU��@%������'L��r����s-�~�iVVE����O�]�fii�����"�3�JKK����m��c��4���������M^�z����BW�(��1f��;v,Y����+~~~T�����e��3g��f�q��o���K��'O�����-[�$''����X#G���ukppp~~�_|�b�
��*�>����;�x�b���?���0u��E�i���E�q�����g����V���*����>}��?~���R�8T
0=Q]�R��g_{�5���/�����)77W����<NI<t�	
0������@u�T�d�:� {�!��1�@u�A��C�Pb�=����T�*
0�[��=�gz��1 ����T�d�:� {�!��1�@u�A��C�Pb�=��C�@�
0FP�0��`��`#(�A�UXX�p���>���7�����o���111G����tpp������~���Y�����l������~�����M�6,x���X���1c��u�BCC�l��l�����1c4��,YB]�,�c��-_���������J�����������={����n����Q#1dddP��={���;����[����h��%�Mc����_M�Mz;4�&---%���Q(//o��E�������W�^HH���K����R��`���qR�N�n���qR���Zb`3Nj�6��h�����w��.c���h�&�(��R~���#F�����l��?��Q�W�^����h			�:u�T�����p�����z�����vww�q��_|q�����O���G�Wll,�����\�;l���

���c����{�i����M�<Mv���^	���c�����\���g���w�ZYY1������&&&S�L����u���M�(��|�s��P(S(J���I�G��/^��v��s��Q�C��D�>
=}��v?%%e���t�OKK��m�0(6J;��R��`���qR�N�n���qR����c`0Nj��8�=��I��;�QQ�1G��Q4�H`��?������y���6����������7N�4�k0`@����-[v��61��3'??���3���4�Q111_}��8EEE�����������v��X��1������9<�<y2�H���j��M-aaa�������
�%K���$''�Z�j����������G�����S'��w��-Z�X�x1�l���t,�l�����;w��������7i��6o�LOQ�V�Z(��$x���k��a�qRtR��H=N�������1H=N��`��A�qR4��hR����w�GE]b�z`
@����d���3�t�mkG�
?~<���o_:����2�!000  @��>}�P`7o�d��MJ)�=J}�x�\bQ�n]���m������R��
��I���<�B�w�\���f���f��W�H����������l t�rvv~����J5��_�c��
0�Qh����	|��2t��P����+�

��8)�	��J��'u�d��I��'E`0NV��^���h�I��'E��R���� ��(��	$
0����-�We`���j-��?/,,���c���K�Zn��M1���3�����-Z�h��)m��a�]�0��w�
����,8y����y�.]��3%+++�/�a���~�����>����INN�~�:��P��&����?�����W��t <<<RRR���


�|��G!z%\�|�c��fff�v��m��Q�O	���2C��nB��R4��I;Y�qR4��I���}�W�8)�qR{�I��w��h
�F�dO Q��K��O?������e�:���.]�9s���EDD�MO�0�F�e����.'//��~����7o���Q(?X�Dg��lHMM�-^�zu������+--uss[�p��#F����CBB�v��l�s��9x� ���5k������C/���kGEE�	�r;###�f4����������&^fffII	��������*I5j"�J��'9'���'��w�FEy�3]`!
0xy$&&��=;00p�����^�n]��:l��/��������?���o���?��%4����q��k��7n|���
6�92??�2�����G�tZ�6m��V�^�����'2@���k�O/^�r�>>>III�
z����WW�'N�	�V�Z�[�NNN���t�����m�����	C���G���j�����`Ru �P�q�$�$�qR��.��(oz�K�#D/���w�3��3:������N`������_n���m�66���wo���C�������)22r��)�����>|�p??�y���=���T�
333���������E��7����@WPP@yU����Xn������gii��u�������6n���{����3��y��9������/�V�}��a�����^��^����HU.��'1Nr0N�'u�K7*���� K�(����Q#::z���4��I]�s6bbb�g���������).zQN=���C�
i�y��f������)�N-�[��:�:u�
4�oi������t�e������7''Gxi/���<HMM�or�������r;:��9����o���~�!���Y��y��%
��� �X[[+��L�k��}uT�����I��
������,GE���d��l��;vl\\����W�^]�V-�#Rt���������~�������:z�(
}�Qaa��;w�?�>y��&��$
@��5n����+jG����K_|�%��?h�~>�|��������%�������/���)S��5��j:���C�V����d�v������4o�G��e��7�U���$�$���:����;�QQ�1G4y#D5�m���j�*f7��{�n���[�l�m�6a;�U~~~��|��7
�������[��?\�b��1�)m�����]����U�J_)�k����Kt2��?--M����A<��N�>M�R�_�(����Z;��
����ER\\�%4�dff&�|#G�d����q�����Ao�:u���9s�^�j���M������*��R��Z���FEy�3]�7B`P���������3�z{;::�i5!!a����}��_����_[XX4o�\�BCC�z�-a
�C�������S�|�_�v������������|����g�R�<F��a�����.����������5k���x?��#��������SW_�|���k���\#���D:�3x)r(�]�n�w�}��������p�gK�����^&LX�r%����~����h�"�BbO������*�������w�����h�G��Gc���G��EEE������s����g��WO���3i��vy4����H����Eg�7�|s���4�S'���������777�z�>J��F[����~�Q�V����w�y�m��C�qvvNMM���R����lbh��
�k�����v��?���c���!6�(������>�������(��{���-[�+6o�����Hg�����;b��Q4��?��x�"�������(4f�z1,Y����+~~~�x����e��3g�d�qRtR��H=Nj��8)�	R���0'u|�K7N��`��A�qR��.���KR����@���?~����$
d����c`�o'������l
�N�:��������.\��o����k��5<<�w���^M������3�V�:v���{�����}����HOOOf1��is�6m��+�G;v�����<�F��\R��_��g�R?P>���C1�����#$$�Y������'-ZO�5e������J�E�Q����^��/�����S�N����H�qRtR��H=N�~2�%��I]:A�qR�!�8)�qR4��I������.1H��
@��o���p����7���{��Q��n���tK�����+���$���+��uN`` ���mN�Q����J��`����c�.�(�8Y�N�b��%I�I]�z���@H7N�����.1H:N����tT�%�F�dO Q�0��`��`#(�A�
0FP�0��`��`#(�A�
0FP�0��`��`#(�A�
0FP�0��`��`#(�A�
0FP�0��`��`@
3t��={�dgg;::�8����]\\*� @ze.###�.�8��]�,X����r�JIc���a|}}sssMMM�-PI�t���7v�X33���h???�������//]�yO�<���h`��8WI�-�� T����Y"���VX�h�������`��qT#5e�z�,w��+��caZw��$!����5
c5��
�<�}�~8���yFv}]��&�K���D�>[����������D�^*9����������Q�A��^���������o~��};g�
�'O��_kkk����@P���1b���;���|�������w���-,,,<<�������{w��E����o�>""�u���������<y�[�ntLw����r���������8p���������/>|��qc:�'N�f2d���{���?x����$z=P&������������J�h��#G��9�V�Z�t���e=����u������TKK�>}�Pi��GZ����;Jz�Ri��	�|�	MfffFGG���t�h�����i��[a���������s���������6l����7o���G�Z�lI�?t�
0���.b���tV����3=�%��O���z���+� e6t��<y�����;w6m�D��':t��f�^q�A��]����=�����w��Q:�4M���}�R�E�znnnLL��I������GO��������5��R
���E�����g���.��S�?g���(u��/^��AY.������@rpp���&�������:v�8�|*���J��}�6�ZTAM�:�y��7n�����7���D�S��Z�h���+W�PE=p�@����'$$���O�6��wZ?�1`@
���


)�Z����I:�j�cD\�p�o������>:b�:��Y�������D��U��;F����W���(
���\�l73w�]\\��I�N�\]])a�sq����M��]��={w���'Xaaa��edd�������j�A��L1P���XXX�r���u��A�v��!�O��>����o��g�-E�Sc��M�����Ie���*�Z�j5{�l���eS��������j�N�:x� U�\]M�^JJ
=���o�^��5(�j<a�B������+����{�����}��]�����]�v�������]��e=�����u��%&&&??��]RR����p%���������o����K�F�%��%s�y��������Z^��{��������@��U�{��o_��u���l�*))ILL�x���C�,_�^ii)�'����|c�-��;�-R�1�4����Qf	����sssN���Vf����%'''��n���Lj:�N�:M�8q������9S��q<==�������\�kQK�#""f�������W/�����4hP��Z���nhhHU?9i���m����{�$����K6p��

�������*UGyyy~~~j��j��q����1�G�:u�l����j�����y���+���NLL���M�4�os�;�Ahh��M���YXX'�+C�>}����[W8��Y�Z�lI+<x����;)��t|������ �q��Y��(�,�{���dwC�o#�����I���E�JI�ky��1��vL9�5��[@(�@����B�[������+J�CPRR2e��������&MJLLT���K
y��sBo+=����s�������������R_j8��$����^��G�����WK-wL�@M��Qnggg�������������������1�W���`������OHH��o��1��������\�v������*����@��[J���7n����?H
����������T�V&<Z'����JU�������hR��F�YP�@�y����7�_�>**�k�,���[����2D����.\2d����}����iRx5��-[����]�O����7o^�}���;G�����a��N,��W��uW�v���9��w����H*����������ZRRR.^���s�2v5B�^�������/^����;AAAYYY�|�����N�*wh�
�����d����ds�z�2�1c��={��ZAAApp0�pO�<���-,,���,o����666���KJJ���---�t���m�(��I��j�A�����^W!y�9s�$&&���3,,������cO�>���Lx���<r�����7k�,==���?���X�v-�=�����>~}��o��G�3H���!99��C�Q6fkk0o���m��RM����?��cY���~��[w��yJ��;�yzzFDD,\����3fp���m��q���<pww�����oN�dbbr������S��k�.CCCZ��%K>�����@D���-��^I��,L��k�B�<fFe_P��G���w/[������u�����YC2�A=�k��-�u������"]�v�#�����@5�@�[�yK�%��%�rss���B*��lR�/N�[�����C�!�����$l177�XIs
e�����)�3��v�������\f�u�x
��C��-�n��=��� ��<WW������Xf�h6F+	[�*��Z�
0FP�0��`/!��3���A�P�0��`��`#(�A�
0FP��������/\�����v�Z�`AVVVxx���+%�M
C���gOvv�����3��}����BVC���~U��i����B��x�����;���,::���O�p�������kjj�l���%8��6������b�qDD���K���k�|||����;F��f�Z�f����o�>))I�^n(��qt��[I���w�
G�fU��������Q�F��;��W��\%��m���3�y�4UXW��_�]C
� :��O�5����p*��_�~��������CQQ?��L�2����ki���t��P��#�FF�������)6���_�����o�����LLL�4��4j�h��A�W���5��A��^��<���l�B�p������<d:���JHH�R��Q�'O�<I��U����$�
�U���9r�Hdddjj���%%I��g�{���E�>L(�k��}DDD��������?~��T�0a�'�|B�������_�����i�����i��[��!C���KO
<8))i����@�1������;����������a�����y���������-[���V�����rqaP��|�������w���-,,,<<\�[�XPKO2��}�*����]�v�������'&&
0������;u��_~���������8q���}���K|||FFUe����#g��Y�V�*�;�2Y�^�h�)��u�r�Q�hll��K�}I����a(M�\�2Q��(��Ia^N�D@@���'O����s���M�(=q�D����:v�8�|�M)�����}�6���XO�:�y��7n����7�����&&&����f�����zyyQ#w%����[�h���+W�P�:p�@����'$$���O�6�bZ�_�p�0�O����+���>}�������_����D�������]�rU
/zL��������ti��B�������C*�rsscbb&M�ddd4n��������>���w���4��9s�P�J5g���2�|P��0��-+..>t�P`` MRIi���~���p���~�-99��:b���mS�|��EZ����i������f����L���|���Z��={6w�=.�����d���+���)$z@��S�<H�.��R6���B�i����/sw��Q���XXX�r�B.CCCJ���\�4iB���LtA�=)X%�@��#M�Z����cTS]�z�VK����''�����������+U�|���{������s'7FZFF�'��<d��AP����$&&R��%�J�������������w�r-������;~��������YZZJ�4e�}���[�hp��9n.�5j����
�?���(���D
e��k
[�*q�)
L[wk-�333J�+�`E{�
�@���T����u��%&&&??��]RR����p%���������o��J�����������~��\Ku�\
j4`5IvvvAA��������?C��������n����)�������S���VKy��7�E�rh%���:u���RXXX��R��ON�4�m��������E���	'MMM�������UZ�}������W�XAU���3�%+���S8����L*���������gS�����J����
�!�P��$�M��>�733�S���|�������\��;Gs�p	�����c���
�w�����P��oQf��E���Ewz_zT��z�d��VTdCCC7m�D��N���B8�]����S�Em)��-[�
<�s�N
�j����s��T
0�����
T�k�������odnii�P���{��:��KO��7�K������*���yKJJ�L�R�~}�s��I���j_�q�,��BT�m�����;w�j��������Q�{�������p�%�;���P��$�������	)/�Sjgg������������������/o�4gjj*%d�l���~�I���^)z�d��V���k��=�|BB��c�����
����k����$�P���O4:o)���n����~`�?����EWFF����i�F%��%;;��
;�@P��k����3�}�������y��w6o�L�QQQ\%���������l�B�����kIII�x�b�����5�+B���*8��}�~����CBB�B���o�?>M
/��]���w�
�i/\���y����x��9�hLL�����H��"���~���%..N��P5K���U�:t�@]A]||<�s���P��0s��ILL���gXX�����c��>}jcc��}�������s������O>�����S�N-o��t;r�����7k�,==���?���X�v-�}��~�KG���B8�
�},))=z4��`����l��1g���olXPPL���'Obcc###�����?u��q����|}}KKK/]��m�6*�i�2{��~��Q	:m��e����]�����r����5�cT��C���#Gh��i����R=Fu8����<z|���������*�V
=z���{7ec����<�w��k���������Crr2��������6  `��ym��-oC
4�E����n�z��}Z�k��.�����>�tz�������y,����Bl�g��?O�#+KOO����#*,g���5RU�q���K�>x�������?��.+��������/_N���]�

i�K�,���t�\j�������u���g��^��
H+++��8���]�+�hG�x�9x� ��������^XB [7���1DI�r��-�$eW���\<((H��sWWW-?m��$��$l�T�j����%����2g���
�������<���Vh���Jj��J�ss���4�P������S�;f�V�-X�!�$l�w���5Q�Z��g��������C�$`��`#(������(Y�`#(�A�
0F���IEND�B`�
bench2-10gb-duration.pngimage/png; name=bench2-10gb-duration.pngDownload
�PNG


IHDR��mr	pHYs')�/����IDATx���	\����EA�[QQP1�L	��4-�,S��*����R�#��4�L�$o-;�M
�2�����<�DQ��������vg!^�����wf?�;;�}��3�YYY��h���L�f��2�!d4C�h��	�!�B&@3�L�f��2�!d4C�h��	�!�B&@3�L�f��2�!d4C�h��	�!�B&@3�L�f��2�!d4C�h��	�!�B&@3�L����U�r�K�.�;w�������������������]������-[�<��#r�������.@��B�U�VTT��Gf����l��e���[�je����������{�����O<�������3g��!6��a���;Zv���Y�f�[�N�HKK����y��_~��������C��y���������>v�X�c222,X�d���G�&''���Ix������.�o�����/��y��}�$�I�pww�^�z�-z������^�@��U����x�b���I����	�W�L�r��)�SRR�����s���������:u�X]0+++111*��U�:w��z���e��U�J�*]��zA���)����V���?�t�/�]\\$z������6l��V� �����3&55��0	�:t���_�����+�:u���>��)�N��zCb����%��;�d��7o�<y�$�J�������U�o���A���������������-"�5�����)�N#d@����+�f�26�������r���J�l����5kz�!�J`;t���I�~������K�{��w���l���<v�X�Z�
T�d�'�xB����+	�i���0�|��o��F�c����qk8y����>��/��������7�xC����_|��c�I>�����.�����:q�D���-W���1B.T�Zu����K�W����(���,���i�<V��������y���G�*%d�o���������n������qc{��!4����P�!C�t��522�G��Hfy��e�Jf��'����U�V��
$<<���R��u�|}}�N�pK�,�"������r���,	�g��,���O�����_~��\���J�\�h���}������K��pC[�n5j�\�l)���URp�l��%|������aaa��{����d%����g�O�{����	��W������+W�HR�U����[��w'�rrrj����fL��2e��i�FB���'-�A��g�}��/X&�3###((�,�J����k��&�r������Y�fM�N�j��
;s�����c�=f���>�7o�����d6n�(�h���2>  @2����?��#�#<���;d�����[���K����-��������~z����N��s�����o�?~����+�h�b��A��U����m��*�h����f�:u����{���m���]������_�~K�,y���o�n��JKK������#�~�j����Tc���������_�V�R%��o���<����������y~�F�8������e�k�����JII��I�&To�����<�+W>w��0q�D)���K�������4iR���-<D�<2���]��*��/^����?vuu�e���$�[�Z�;Q�k���JIf�37�u���S�)����WI�5d�)$������={���w�y�����
��#R3z�m�A������/�?��\$71m�4�T��w�!���-R����r�'N�([�l�����//�Wg��%!M�d*	W�/��qq��2��[w���CI�������-�T��-�NM�<���~���{
qw,����$�KD�WJ��u�������w�-X�@��f��I+W�4doHR��x��aI�h��)#��������1��$�*���3�k�����KR��n�Z�����H���$�z���/�B&�)O=�������;vt�����������'�x��������%a�/j�������L����dL~!3""���{{��a��������M��~�y��yI}���%�H����O�~���>��3C����333S��,�R_��1/Z�H���Y�$n�������?In����s�����nnn+Vl���dKI�������+_�v�D5	]O>���;��3�H�T����g�v�*���wG�_�J��/I��?�������Y��W_}�����JdK����K/=���J�=z���!�������)9��o����S��x�iY��f%B+����<}o������+9�����:�]^�p��o�Y��%!����+�*22��0 s�}�����J8�i�2���222d-XnW
h����/����%���\T�����r��-.�J�V�^]�O�
��:u�����+Wn����a��-KNN��4w�\%��8*�����[�n��]r�W�X��R"���G�N�:m�4%d*I2�li����e0`@XX�t��L�������X�;%aO}��T�"w�^�z��SJ�gG�����?�vvv���e�T�}�����������x/w��0E��}#""$6O�>]	�
y-��Q����3�H=m�����s����_(��p��������+�/_6���lf�*T�T0t�PN(��cG�c:C�����#	3�iQ
GR��_��M9��k��[\9����w��233o����_�������+��#�<b�����-|�Au�D��������Vo(7���m���}r�'�|R���$�U�T��/�����^zI�� yU�b�S�����}W�x����\�n]I�,���Pj``���Ks�����|������t�{����>��<�2O�8a�����$�S���L�3�lA��;�������e������il����g���cbb�L�R����i��f6L��T�������t��-����������,��ZHn��{�����a~6l�`�]����!��0�c�<���A���L%����[�	������$u�6Y�f��~���~�����!��~�q����M�Z(����W��m����*d��������4���*���
���(�M�J�9?�U���G�U���'R~G��j,#d�����
��N1�j�����8�����9n��O?�t��5�������I������=���������)�$''K
����?����k�����{�7jF^JJ���<�U�-�G��������6a��[�n5�2�^�*��������ugS>�=���������A�$d.[�L�����]Y�cWn���"�{Z y�����'$$���W�\������`�V�PA���p����/��?�S899�j�j��M�7>r������x��;\���j�e�R�Jhh��!C�w�n��������t�R�_q����/��4h�@��9sF"V��U�Wu����cR	���s�*�#�{�n�S*�P��������H��[*�<y�����U��]�����;w������������7�)S�_�~��v'���R%�0@n�S�N�F����{$�*B���cccz���y�c��oAn!��e���?Ni�����Hz���$m���p7������y	�III���m[��6�W���C��>P5+���c�Gs����%h�f1fl|�m9��B��y~��f���m&22R��������Q��)S�H����z���7o>��Sy~��f�N����?E��G}$�/$$d��5fT9�LAU�PA�i�(����$B&���mS��P��('�7��NCO<�DLL��r[�x�<	YPm��Y�bEDD�$����3���S��'�AAA?����3f<���ff�>[a��i������G�#����o����####55U9=�����5j�g6��n��/�������.�K9��r�I�,������)������>j�J9v��1�=��������+�U�����@�2@{���k���%b��[w����/x��M����WF�u��
�a��?��A�/�����,~�h�n����������~���d���_�7o�!����� ����^	�;w^�~}�9S����S�����G811Q�D�|��
����u�����C�R��q��mf��T~k*�?�>���?�l��s��],X����j�j�gj��	�=�����n�6C��M��o�q��9s��
�k���R��w_�w��_~1����w�%[*?`V3�v���5����?�y�������������5j��R�_��)v� d�f�]�v���/��B&�iii�*U��Y�����w��5n����G�w���#G�����d���K�>� 88X��			�}��rd ��W�R��o�r������^z�%GGG�LrC�N���L�����jy
�j���Q���C�$
�������S���Yb���-[�H�'O�����r�57���[�J��tg�L�F}���GO��^x����RIz��������1+L�MNN���t�R������,X�vm���;vl�����}�������n�������r�J�^��f4h� 	��'O�����r�8���{��S��Z9�H!��M�6���|����~[�*�<���
���5k&��1�J�����V:��'�&�\��
e��gGb���[���[�b�\3f�-�
��	�'s��*�e���X�-V�Z��W=�*���^9$���)S����6j�����3��m�����nnn��#JZ�\ga����o����$������/�(�B�8q�L���_��[7��s����,_���?�h���z��Y�fMIS�����3���3w�u�{��'I,����+�������s<Jm�����a�$a	H������B}��r���������[�=�e��p�����=�Pg������+WJr�<S�y�Of3d'��_x��K�.U�T9{�������,R�F
	�������j���<0i�$c���)$[~��7����K[�ly��
	������O_�����}����G)`�����/^�X�mttt��S,�?���;w��^��$U�������Srmhh��x}��Px7������*�7o���O�����+����L�eR��M��^zI��w���_�]�vs����}���%9T�XQ����e��t�j��r	F"�������$	|���_}��L�%�Jn��D�����I�:r�������~��}g��IOO�T���������-�����#l�2#F��5��=���rg$IB{����FJ�$&a^b���G%$�R��1c�!��������{�~��'�W���2����s���?�|���tdT��dI���g��l��QAAAR�_�%wJ7n����+����)����l������[�l�����y��1�~������+yu��9����=..N2m~��}���5k�?� �l>>>���������P8�L(�j���
�	N/a�
(?�,(�*�i	B����$���f�"�������.�d6����<&C������������ln�I�&V����������W^y��H3=��u�����NY.�y��7n��_�R%�~�������{Q�/_>4[~7j����YX�B&�es��U��������@�@��?k���#F��aaa����G���&::�G��.]RN�����s��n��EEE�����[w��!�5&���	�1'�]n�f�����v�i��2�!d4C�h��	�!�B&@3�L�f��2�!d4C�h��	�!�B&@3�L�f��2�!d4C�h��	�!�B&@3�L�f��2�!d4C�h��	�!�B&@3�L�f��2@�0f����'�����w-��#d(�v����?����~���U7o�l����C������K/��<�[�a���;����w7k�,�13g�|��7,�$33���?���/>��������#��4�Z�j�a�.]


]�f��s�*U���C����kt=��/���O<(xPPP�>}�^�L��4?��]k��qTT���SG�U����)�o���������O'N��r����G���������{�m�V=2�3[�T)�]wu��y��!���j�o�(W�\��U�����U��lrrr�*U��i���?[X���?��?��y��Z�0z��I�&Y(����sjj���+V�h�R�-���TnQ+��W��������`�k�p���Ld�;vH%��_wqq	h���lu��-��������<���������W��U@�B�P<|��W�f���!��*�1K����{QH�F���?�p~�J�Q.\�zU���U+$$�l��w�ma���.K����!���;w.X��������?k���;}����S�N5o�\�Xdd�L���_��o�)��q=#G��6m�����O�}��w�}W������0o%��
��W�m�S�����_}��7nH�h���lc			�6?�6`�If�{����_�,�\R��l�����jS/.���.\� 9G���_-9�]�v��Z�d�$L	B���o�ppp��AJ����}���d����
�2b�������{L�n�~���$��i��5U�MZ����>##�^�zR���W||����:o��/��r����;w.�`������t������^^�����l�����{!d(*T��t�RIA����Hi�������?�H`�
��,_&�V�]�rE��������/��e�*���������������>����9q�D�V6p�@	c�}��/�����3g��!|�������={��t<00PR��������t��m�����W^y�@��u����M�4�5tY[����%w���K��0a�o�!yC�OOO_�v��PR������3�KU�\y���������m�;vL�����-�{qq����������yK����H,�2{�l	!2��$�F�8p@��$(��$���� -��r���������j?�������W�X1j��J�*l{Mn�NHHP�Z�re��=�����������l�111��Jh�"��!��l��Uw��a��M�L�!@���U����1c�<���?����$&&>���K�,)_��zpVV�_|�|������W����LC=<<�c���>�����K<��U�V����;��S�Je���%nIb;v��]�n��q��w�zz�����R>u1+������2UU��([��$���?�Pz����y���������*S^�G���G������27dr��Yu����#3i	��Q�Iy����EJ��	`[�n5v^�tI����s�T"OeA��-w����(��k��c�lE���x��z���R2%sZ��V��}��b�������HN^�t����e�����V����������l��!�N����'CBB$����;d�v.��?|�!�����'����o�������_��`�����4h�������{��c�����I�����{�_���iSuh4dkZy��F����H���Z�jz���~I�������(���i����k��Q&�C��i�Ly%���	����������m�6��K�������233�v��a����k<������������eN/������$!V����'ON�<�O�>2���S�S�
*tA�S��fy)k��*M��y��c�Zu�e=���_���I�����C���?/��L�f!s������g�QwJ$�{-A�pi��;e�mITKJJz�����l[�l�����W�J.�q|n����$&&����]%[���-Y��D�i����g��UK��;w��;|�A�U_}����e��������b���*[�pa�-�~�ic����,���GK`��q�1}�����I��9?������P888H,�`�F��l�2���{���!d(Nd�&��F�
>\��_����1c��
���k���$R///C�G(C��9q�D���?c��y�}��tS�4�q������~{������!����v�2���\�rn%�h2/^�(s�_������*U������c��kA�#��T[��o�^i��������?�x�����...m���0aB���m\�d�����m(�����c�����S��1--���I�V�y�z��a\D7��aaa��sO�B��w��m)1C"P!j0��{��������$����/zU���Ott�DM��[^�|y��U��WW�B����������2�{�9	�R�:d���G���a�
]�������>z��
	����c�������/y(�q������l����M�6�S��\��{�I�&5h��Bml�<��{��mx��-�L�!@1���+��S�N�G�._���%Kr��M����<y�2�5d��d";�|��*�Y�
�_�w��x)������)�L���.]��� "���	,�y���'�|2��d�/sk����>�/���2+���{w������K:��}{�&�����#Sg�TO�:e��N���ke".�Y��y����r�-[�/�%���(��.]�'Bf�k����f��KRMHH�����C���X���Z�z���l�_fl�SVo+&&F���R[HQR���������{O9�LAI�,4b�y��/������/SRR���� ���w��s�M���
~��7�g�6�����2d��G���<�ua�����y�Y��f��V_S�l�y�������u��C6��<���q�+����J�H6.��`�L�O�&M*T�p��e	���>����������2�������e��w���c$�$���C������i����t��u�E&''+?K�M������G}T�B��$�8p��e�+v��m�V�v����O����_���!��k����c��r)�Q&�/���,b�z$��������MJ���O�>2%�C��we�����_m�����N�r[����i�/��dcu���Od����rY96�l-~��������_
�O��j$5O�>]�#��&w����N��2����y�G��7�xC6!y@����f��I��0d�ua�UY�z� +��a�SO=U�Nu������t���>���?��;""bI6C��'
$���O�
�����`�n�B&�bF��2����E��;w�1b����2ATrH~?�������������>5JjU�av%!X=��t###������{��+'�A2��={�����5k���b��qf�o\�x��/�(���[��'��g���aL���~���2�>}�t��U��G�D������W~=�L�q	l�����~*�+�dN�wwg���}�v�a����-w�����bbb���h��������r����.\�P�#i��O>2d��Y�K�O�hv
�3g�H`�[��<��S��M�$��j���~���_�uy��M���g����9r�_|���������+��,TUz]���,h�T�;x�`�~��)%[���#[`�l�������ok��]�n��1c$O���/�
�@�-8��!�{��#d(fdf)S�^�z�D?$$���?������dW�J�s
��Z�b�3����!���
J���!1I����./K�2��1cF���%��G*�Z�j�;%ZK����<y�2-�GV"�<ON�L|�X.���]�.Y�D��,���$	6�GI�=zt��=���-�w�������<������{�2���3��Q��T�T)�:�|���w���9�dv�
I_
48z���c�r�,��?�7o�s�\�ti�������b�����W�F����+IYZ�plU�H�e	��$>����W��d��e��E�l�<��,��������/�T��m6���G��0�/B&��DfZ���N�j�d�-�b�����7�$s��A�wD���===^}�U�<�#�JB�����\�b����l�e�!����>JH���!�4h�g�}���O�������^�z�����g��������e=e���Dw����������%6���O	��~��L�W�ZeP}WV:SSS�3wXz'��������X�S6�V�n�$�}�����5�?�\�������s�v��I��(�>���S���[���%��l���d�������PC��)������l�"	3���z��UY ?�����7s?2_S�o��%%%�y \Y���v��m��lAJJ�r(2�1��(#d(6{�����.�@9vH���������J����1*H���y�/��b6'���W>��M�6�H��o�u���8@2�L=e�_�����"����3������=*EZ>@��I�/���D�<c�#�<��_�t����3v��WV^�T)�QL���}�����Y�F�����{O�>-���2�b��?��������][�N��Z[�l)�b�Z)c���<�@�f�l?���;%I���z����V�*�b��)�G����������#�B���c��={��T<r��O>���/2##C��?�0�Ru����`��=�Y����G)00033��#���We�(g�i���Y���)7i3���Cv5�:u�}��{�/�4����~[��=��cvZ(����A�EEE�D�M�6��#F�4n��
�������lhhh��Gv��m��me�|YQ��2'M�$��x�
YDBl���m? ��P>K��o�����`������]{��o����[�<����q���3���7/���v�*I�������|�#�������.K	�����W^��#y���@)Ry��'�0ddU������>����3^�>��j/^,��s��������KNx���<<<
w�l�-��/]����3f���g�{�=�'l�2,�gF�����.�������5k��M�$����K	� H���}�W6r�������Z������,O\�5,�n��^8J|�|���`��J�)_����^S6n�fd����*�l��Egee��h��r�xL�
����'�}��e�����d��~�lG�P<|��g2
���{'N���/]���_��Q#	�2�V&�2c�"3�����4���]9������o��,����~���k��i��������m�$v��]����������������|k������������[����)))����s����.��x�;v�!��rgs_+�V�TI&�!:u�$sk������������R���hI���n���'O�x&�g��e�[�l�"{��mv��>}��"S�L��p��}�?L����k���m���/��r�l��H��0,yc�����s����<�����3gd�lo���6m�^���4]d����eS�;wn�j�
~�
R�l���$�I�-W��w�}'7��U�z�����s�=7z�hyQH\����od�'N��\g!�X}�G���u���=*S��l��*m$9-**J.�y.Y[^S�o�j������G�.�k��z����xyy���9rD6��&L0��
V�7-)���S��;�r���9�&���	�����e�-3�%K�IhT�f�?����^���{�n�#����m���/��t���&����o���dHe)���^�Z��$Y<##�F�2/1b��<~�C������V9��!{��w���>�Hf�k��MOO�U�������[��K���;w�������+?+���g��W�^�H���/K��TS��H�����g��)�L+y����+������|������
z�P5��8�z�l'@��D�o��&22R�lf��t����'��(�;�����l������u
:488��
<������A��<�J��'����
w��u��U�-�}�U!�D��-��O�s;'��SPP���S��,]������*mt��5Y\^����_S6n�j���rw�fy�v��%����]]]eS���Ro�PoZ�K���G6�^�z��-��v�(#d(���o�q/fS�����l��Y��l�
���S&���_��qc�'8Q�������E�g��q�<z�)+os=Od�<F&�1116��_6��'NHf��p)j���������z9�����-����*_U����VW�~�\�����z�|�I�a�<���Q����M�c�U9)��JR��'����-�tny~�6���E
!P���������G�-9x��#d��������4a;p����"��_�w	%8@s�L�f��2�!d4C�h��	�!�B&@3�L�f��2�!d4C�h��	�!�B&@3�L�f��2�!d4C�h��	�!�B&@3�L�f��6l���������			����W������������I�|}}-���"�X'#�L��={f��m������m�}�����#888***<<|��m�w��p��z�.R�u@�R�Cfzz��/�X�~�������'i0,,l��JO���{��=e��3f��*��b�P����)�N���
:t���_�d������C�=�z�3f��O�>���!���.R�u@�R�CfTTThh�����5k��OMM�����������Z�
����Y�����.���_�u@�S�C��A�*V�8y����tulllfff``��x�':::w ����DA�	�N�
�.��u��5k����^���*))I�J��"����7111���.R�u@�SBC������Ow���������o�~<iu��]k�
@�I$y��G5YU	
��������>�(�k===
y}���(�t�B�3�,��@�,��#��27l��|��i������>}����w��uizxx:::����--k���{�V���+�:��)�!s����wD6u��l#G�|����6m�w����dWWW�������	������du������2��Mu��^�z�o�~��!������4hPXX��	�1���?{�lhh��LII9v����{PP��cu���+�!�n6u�rt�j���8`��E�M�8���!!!�'W�X��Q����+"##�����k�e��:���2m����q��	&H��i�����!CBCC��t-�"�X'/��[����S��I����"
4(�"��b��	�!�B&@3�L�f��2�!d4C�h��	�!�B&@3�L�f��2�!d4C�h��	�!�B&J�ki�]�Mz��d�*k�j��B&J������Lz��"d���	�!������W��*��������!d9>�|��#������d;�;�L�f��2�!d4C�h��	�!�B&@3�L'�b.�L�06}���Wt�c=�2P�t�������^-�>��~�0G�h��	�!�B&@3�L�fJn�����<y������9�����Y�1c�4h�@�v��������eX~�LHH

]�zu\\���w���'M����k��Q[�������;u0���c=�O	
�{��m�����7�z���������+W~���?��s��-e���W�o���������3%%�m��������GpppTTTxx��m�v��-y��P����9b��������|P�����{��S���������a��5i���u��7OdXX��\�i�����)S���1��P������e�����x������bbb��2���l_��%K����j������1c����V��}�+�!s��If=�N�JKK

R���y��I��*U����������n����Y���U���p��������Y�v�r��������f��sv,(	Jh�TKLL��w�������F��t&$$��Y�f��7/>>^.K

���_�+������4�Wz������- d�	����+������=�M�����������{�\��V�ZJ��I���K�R�F�'N��3��g�INN4hP��$%%�_��f������ku��w�����W^y������_�|��S�����O��;x��:ca��}CBB�y������-[���gee�_���0`����-e�*���7n�����k�^�0^��~�����������������zP�C���S�;v����c�n����W�t��m����W�^���W�^}����M��]���i��I��3���k���K�5�n.�����-�5$���j�������;�������w�s�(c���%�t�������~�^����?SJz�4z��%C~���'N��[�n�c|||���ky�WY``�������F�����}��������Jb�<w�\��5j��W�����,1r��E}��U8r�����1�����i��{������JgFFFDD�����(��2
+�1�iS���j�j�B)�!���Wb����_{��f��)�'N���y���[�����-;e�������KS�n��;vH�������c������z���A����M�0A��?���gCCCm�.3�c����i����2�g�}��}�x�G���9�j������?��\�r2`���={�l����O?��������WK]�`���������v��m��E�0`��E�&N�x�������+V�h������m�]	
�=���]��M��s��o�����E�������c�)�u���l�����+V������ck����:���d��	$:n�����g��!����/�Z���r����'���JJ�2Epp��e�,h�-�k4h���SM�bX����:���2�#d4C�h��	�!�B&@3�L�f��2�!d4C�h��	�!�B&`7��l�9{���X����,�Uh��	�b�/>���dN�|���n�B��s�[~36�����c9��(����g��uN����~��!�!B&@3�L�f��2�!d4C�h��	�!�B&@3�L�f��2�!d4C�h��	�!��_����i�)gx�}�U�!(��fm�9w��|���Cs�v� d��!d�����C1���
��XP2�!d4C�h���������'o�����3~~~��53fL�
�BCCW�^�����s�I�&���ZX��E
�N(FJh���wo�6mn����SOEFF�\���������[�l)RRR��m�o��=zGEE���o��m����\��E
�N(^Jh�1bDrrrDD��>��H�������S��Gi��7O�`XX��T�o��w��S�L�1cF����H!�	�K	
�-[�l���1a�����)&&Fi.Y����}�����z�3f��O�>���!�:�.R�u�x+�`�z����}�s=;U�����I�&���:u*---((H.�������u������1�Z�
� Z�fM���.���_�u��s�2�8d��y�N�:)�!S-11q�����wss=z�����fff��Tz���sB�����t�P���������� z���r��Z�j����$�+��l����!;��^��E
�N(vJz�|��W.^�x�������:u*<<��'�YYY��@?�����k���o)W����qC��t�������j:>�Z��y9�l���W��L��?22���K�,�(>>^�L��p4�r�����)����L�L���a6/��k���,5%=dN�:U��c���;v��m��}�����>]Tz�k�X]�����K�5�n.�����-�5$����
�r�uu��i�]�\/_�izW�>g�R�wI0]�����Y�V-�S�w�|n��blV�PA]�c��f����>�Kcs���X������3L�7k����������X%=d=����;w���oO�8!�GGG��f����
�;���Z^�������b�$��s��u���Q�F����~������NNNM�6��w���[���.222"""$L�^�-�t�P�������{���������k��5S:O�8�y�f77����K����
�0a�2`���g��


U�)))��swwW�zb�"V@qWC�������o������f��g��Y�jUrr��\�\90`��E�M�8���!!!�'W�X��Q����+k���n����-[���X�"�!=-���]��tG�����;��v��W/����"�����zh��]��M��s���~�����E��_���S899m��q��	�7m����3d����P�7]s��H!�	�r����Pc��L@�z����-��]<jl��oy;k��2Epp��e�,���-�k4h�����El�Z�
��2�!d4C������kB��y�]�[6y���V2��+b�����76{vD�DG�h��	�!�B&@3�L�f��2�!d4C�h��	�!�B&@3�L�f��2�!d4C�h��	�!�B&@3�L�f�@��Z����O��K��,�_9@�@�Q�9������SiO;���	�!�B&@3�L�f��2�!d4C�h��	�!��Bf�������D%F�.]�:u����ccc}||BBB����aC���0 �R'N3fL~�LHH

]�zu\\���w���'M����k�(�t
��6m�������m���r���;Z�����7o��K��={�<yr���k����m����/�^�*{���^P�6����m�o��=zGEE����
w��-y��P���u�o���A���<|����;d������s��}��W�����w��m������7�/d6�I�&6�s��y ���F����o�^b��)Sf��a�(�t
�AAAe���q����w�''�:���K���]����9rDi*!�����u.Y����}�����^�z�3F��O����`u���'�?�Bfdd���������\���?._����zxx(=w�u��x�}���f=7o�LKK�X���T��.H�T����������u��f_	n��UxxxLL�����5k���{����e���:u���_���zK�O=���U��B������;���������o_���� g��5o����x�,!044T*�s���������@�~�':::==��B&���C���#�\���];���?H�7n\�6m�2q����\�b���o��v��-_{�5�G�$s���RX�5N�81g��g�y&99y��A�����$���������obb����#��C��-[$L�eI��k�

����$m�\�b��eh����5k��)�t�;v���:t0���}�������;�������YYY����--X�vm~KY�
������������[?�2�|-Y��o6������L�������UMn�l&�|�`�|	�(=#��t�m�������yaB�����M��33DQ�w��|����P	W�7o6~��������:#5�?~��	�>������3�m��lp�z�:w��z���6m���ZOOOC^H*=��,�]^�.]�,[�#�]��Wny�!)�����m8�sm��?Lr������9M�
��Q��.	��ww�P7�+��j�\�rLgb����p)���P�����������8{��z|�!:g�c���������~GGGf�����[�w��T���S�^v������;u�������/_^�J$a���_~���o�9}��R�JY]���G�^�v-�U����
���1�������U���h�
w/�H�;d�k�n��q�3����V���CI��+Wf����eK=+�l)	��>PA�&1r��E��)���>x�!��(M�6��w����2>  @�V@q�w��4iR�n���S�B�
68:�*��W^������/t+c���}���a�r'L���2e���������__�\�n��;�G��oJJ��c�����G������A����&L�����?������Nm���!�Z�j{�������f<����3f����V��#���5j��U#G�,_�����{����E���~Z
;r���R�y����������v��m��E�0`��E�&N�x�������+V�h������m���!Sa�{�f���\@T��_{K��}��/�,!�[�n|����/\�P�b�>}��;�v�������IO�0A���M�|||�j�r��P��2�4ibuLZZ�_��C1���8��V����A��W"q1,[~KY��N!S���!���qqq���U�T����������������V���)d���S��}��A����/88X������m���?������E��d���[����1a�?�l������>|�pcGz��C�U�Z5w���u�A&��;dzyy-]��m��f��V����������x���>,9���Gz��?�u����w6L�b��;dN�4�\�rs�����?��^^^#F���t.�-�Cf�����7f��������geeU�T)((H�u��9�C��T�RA��r��;D��y�������[����gff�]{��1��h����7o^PPP�*UJ�*����(�C�w�}7g���^{M���@��y���'�xB��C����q�'N����|��2g�����o~����5���w��!s���.\h��q�J�|||��=|����4�w�LJJ�Z�j�j�t�]������������!��������spp����Z����h�!��/��0a����k��]�������[7��hH���x��^x�q��}���R�JVV������]��G���sg��h��0�<�j�*c���S%^N�2��	���!���#�&MR'LQ�t��^z����������/���r�K����������
6���O}�QI��N��s��i�������w�5jT���4h 9�j������O�������=�v�Z��hK����[�e���=z����:u�H���?P���<�������={����Z�j�������B��7""":u�(�������?���...����!�����<�HLL�����	��{��_������T��s=
�2�y����/���{$X�_�~��r��P��27m���{������S�T�N�:������������w��z�j���s�{zz^�rE�b��;d6l�p��eO?������355��/�h�������w�=zt���CBB:t�P�r������O��wqqq�W�b��;d>���~��DM�/0���;g���]��\@[v8Of�lg��=s��4�V�������!d*����U����^5�e����w��7����r��?�h����|���#F�Y��K��N��~����X�������7l��8 !!!44t���qqq����;w�4i�����uZ]���bD�����?����A�o���|�t����9�B�
/���>e\�|�y��111]�t������'�/_�v��m�����JIm����o�T.����[�a����H!�	���!s��)��u[�reZZ�1dJ�����7o�n!s���r�s��}��W�����Ka�'O^�~�4�I�aaa��W��o��wo���y���"�X'/z���J�+]���Lu���?�x�b��prr����K/�d���������#G���%K����j��W�1c�H�����'�4��H!�	���!S�Tfff��+W��Y��~h�s��M��+V��������o������zL�V����cbbj��i���E����N(v����{���s;t����~���Y��4i�s1j�������o_�+I800�l���;Z]$==����bG��9v��N�:5j��s���\�x��%KV�Zu�����7�\������~���-[���k�LJJ��������.s���"�X';z���������#G�T��3w�\�{�=�,\��m��:�X�l��6l�f��2e�X���e�����+����k���o)W����qC��t�������j:>�Z��y9�l�u��'%�����K�=�����LL�,�(>>^�L��p4�r�}�`>>=�l^�p�����&�������y2�w��i	W>>>��a�x����0a���|�r��������>]Tz�k�X]�����K�e�~$�����-�5$�B�����T�����1Mr������9M�
��Q��.	��ww�P7�+��j�\�rLgb����p)���P�����������8{��z|�!:g�c����^^�����8::23�&4��
;�LC��0�e������]�|�Ay��Y�$�^x��/�|��7�O�^�T)�U����r���1[$:����V�Z��fu��]';z�����N�:���������SO=�j�*�P�r��~�-((H�J$[J�����J�����6m�w��[_�p��/\dddDDDH���6[)�:���;d�9���+�����?���$�q���i�f��!'N\�p�>e�^����>6lX��������A����&L�����?�������J3%%���c����`lu����;dn��E�dpp�\��Y�vm%b�����6u+c�����I�5��*�����0`��E������H�\�bE�F�������{!iY���cu����;d^�|Y9!dVV�������������?^�2��n��{�����z���%d:99m��q��	�7m����3d����o��fu�B���Cf�J�N��u���~������:uR����$��V�r��$��e���
�^��El���!�]�v�����^�j��zH:�\�2{���-[�\@[z��I�&u��m��1*T��a����^y�����/��B�b�*=�p#�������`�jpG�2�U��g����x77�2e�(���
�1c���������m��O���x���a�jpG�2k���a�����KiV�PA}m�f������S�N������yk��/7�el�LY���SR������P�����h([�|)��N!3***55���2R9�+�b�zj��k)�fJZz�?����|�Ya�?I�9�N����+Z����O>�����-#SRR�=:��:h|����L!�;H���q�F}n`Gz]�F�h��	�!�B&@3�L�f����_��uk|||ff�����������o����y�����T�R�T)�opG�2����9s����k:�.@z���W�>��:�(�ba��O:�����c1(�Cf���O�8������(���^�����Y!�����p��3g�|��7?���F��|��;M��9~��.4n��R�J>>>f�>|X�z�;d&%%U�Z�Z�j:�.@z���~�M�[�F��it���s��988���W�Z�^e4d����_L�0��s�U�v����[�n����!s���/��B������S�J������O�]��G���s��:���2�Y�v��*�F�p
���V�rpp0vN�:U���)S�@�r��!�ZN�z3��m�2�92i�$u��K�~����{�9��hK��)�2---w���������bD����a�O>���G�Ti���9g��F��\@[z��Q�Fu���A��3�V����z����������k����������u[�l����g��a��S���L�������+[ll���g�U�������!d*����w�N!�E��z�z��7���a;w������S�LOO���T.�s���2���cv����o2;v���'���Y�����={��-[t�@�u-����$c����r��v��C��M�s����?�� 3--m��q��M6��u������������
BCCW�^�����s�I�&����>��~X9>b�|c�V�+��o�z`�3d���)����R�J�����HII���{t+F=z�_�~n��������w�������?��]h����}�z��!�5***<<|��m�w��<i�(�����~�����z����P���*??��^zI�bCBB���/��A��(!s��aM�4�q����������1B�i�����)S���1��nG��Y�7��=����r(c�zJ&�Bf�l6l�9sfPP���YYY��g��������N�:���)�J�����}�K�,qww:t���W�^c�������K��:�p����|��#&Y�]���
�UO���o2�;�������FFF�SF�
$�Y��.\�X�R%�SSS�����ukgggu�V����cbb���-�}0$(v������^�z��S��]fdd�������/&?			�w��Y��������CCC��������X�;���f�JOtt�r�P����I���>z��M�����i���\��'�K�.2dH�5N�81g��g�y&99y��A��'%�:n���FF�������Z��}��2����Q���}��������������9�����\�c��<xp����o��!!!���N�����-k�z����G6*���k��������n���n^�|Y�LNNv5�|-Y��o6������L���������.���������/��gd8�N��>]0��a6/L���C=�����">3��=�n^5�;�����:��e�'T.w��)�)'����`�����;���h��C�����g���W�����;u��A��7���������m���Gj�������<��iS�k===
y} ��xf�< w
]�t��6���w�^�����4c�����T����?Lr������9M�
��Q��.	��ww�P7�+��j�\�rLgb����p)���uU=��K�����q����xC��PKg���4=��i���p}�&���x��'q&�.T�un�+9My�������:���W��L�n����B����;dfdd�+S����d�����{�������<�����k����*00P^111f����v�j�����<��T��;d�u�]��-���S�R�|}}�������~���W�Hb��E�<<<�����?r�����1#��i��{����
�����$��� M����;d:����/_��aC����}���/�/_~��9
4�������L�2EBo�������t�[�n����6%%���c����s~��4hPXX��	������={644��P��2�{�9GG��'O�e	W��4i�\����={�nel��]R�r9==���3�F�R�o��������g�-Z<������G�Y�z������a���������3��s���-�8q��BBB$��X��Q�F���qwv8O��;�+V�����X�vm��z�������0c���s��/� !�[�n|����/\� ����g���Rg~�trr��&L���i�&�!C�H�6~9��(�t
����O>���a�z�!cg�?q��Fe�<�U���m���r�5��a��[��(�t
�e�����?�?������.;s��)S���[��tpp�����;d.]�����M�6�+W.S�������\@Cz��K�.�-[�u��:�.@z��?��S�[���0�W�2-�$==}���z���!���kf=���?w��]�t.�-�C��rw���_/�����cu.��"���F�M�:u��a�����k^���v��y~�	(F�J�\�zu����]���������������<x�����w��z��YO�R��V���s�����:���!����:�"@7E�7����Bf�&M��IKK����t(p��2������bcc�T����������������S�V�Z��Ct
�;w�T.l��}��A���Vz����m������5J�bw����|����}�]c�4d���]��_}����,
(�����Z�j�������L(���^^^K�.m���Y��U�<<<t.�-�C�������K���������o��u�����
�������&M*W���9s���Oc�����#�*��hK��Y�t�q���3&&&����YYY�*U


�~�+hN���(U�TP6��:��O��'2�!d4C�h��	�!�B&@3�L�f��2�!d4C�h��	�L��iii����6mZpp��={��MHH

]�zu\\���w���'M����ka�V)�:�)�!������������6%%�m���������D�������m�����[�a�)�:�x)�!3111$$�~���4h�{��y������#F(=��������)Sf����:�.R�u@�RBCfzz����:u�T''�<,Y����}�����^�z�3F��O����P�E
�N(^Jh��P������MMM�����������Z�
����Y�fA���/�:��)�!����������@�~�':::w ��HzzzA�	�!3III������������{�B,R�u�]�6�
-\��v��
u�����frr�����k����x�������d21�|��gU�[7��)�<���xu3=#��t�m6�3��a����W��W6�^�g���g����w��}K�4/�>��p���OIM18��7^6��o���!-�`E��2 ++K����V�0�K�.y."������+�<���flV��6�����U��Intus�|5��]���!J5�%�t�����wE���+W���L��5�.��*TP��X��Y�g/�Q��7D��w,�a:���K���~GG�">3\��p0'z���3 w�����u��+9My�������:���W��L�n����a!�/I4��
Bf<==
y}���(�t�B��Bfcbb����o�'S�Z�
����_A�	�!3NNNM�6��w������������	��[����b�������4(,,l��	J������=�4SRR�;���d�"V@qWBC����7l��\NOO?s���Q����o����=`��E�M�8���!!!�'W�X��Q����+�"##�����k�e����"V@qWBC��fl�;w��|��$d:99m��q��	�7m����3d��������2��H!�	�K	
���Y#�/,[��6h�@9�����2��2w!�B&@3�L�f��2�!d������i��{���.�l�z��L@Qw#���#A����������2E�7?._>���~�i;�
��	��~88w�������u�u�����kW�������w�8�)B&�87��v&��b�J����;��C���fz3��tE�h��	�����YAm�=O���J��v*h��	(�V��t�~c�����'?U�����D�2�H��>�G2��w�����jX>�dDpz�Vx����*f�e�Fq�����U1#���t�������A�4S��(�!�B&@3�L�f��2�!d4C�h��	�!�B&@3�������	�U�|�������v�g
��������t<��7�F�v��WY����*@IA�,���R�?������p�lN��6���x:�J���f�,�s��)�A�JB&@3�L�f��2�!d4C�h��	�!�B&@3���-\�p����'N�8f����JHH

]�zu\\���w���'M����k�(��y�z������w@@�������o�����m�����G����QQQ�����m��{��I[@qG���2�
��I�7o�����#F(=�����:e��3f�2�*��!5%�Y��P�����Bf������e�"K�,qww:t���W�^c�������;88X�Y�
����e9M�J��5�	41�yC��9��z�Y��eff\KNT���z�*U��+!3o��y��I��*U�0>55u����[�vvvV��j�*<<<&&�������5kj|<�gW�4]�2�"���}'����		XX�����������jlzU�Z�V��}��S���W~��V����?�lB�������������}����fo�5*��R��V�M���%$$��Y�f��7/>>^.K

���_��ccc333���������t������L�{|��'3+���"�������J�\�3>v)�n���z�uO���}��������o$�{���6��_�;l�U���n.J=�����nm*{t��%����i����X��N�Bf��a�_�.��J�$s���C��Q���'�����3�$''4(����$����f����.���>�:w#�����=-3��0>9�����=/=7����)�������+����4{S�<z������8�������z�����=YYY�fb����s��&O�-Wn~w�����!@�7���4��L��2�����(��V�t����a��Y����ZU��vg�,��y;v����;t�`��}��
		y��w���_����B�����[Z�v������N^J1�LMMQ?��/_�V}�7w����n^�tI���pz����=5��r�����!��R7Z�W!P�\M?{#3�-�l)�
��,�?��k�9a/�SA&6n�����u����<�n��O��r9���M�0��';������rS����6%�|�����;�^-X���*}��g��k��R)Y���#g�_�f��^sHV��^vZ�}x��y*��gGM&y
R*��foayn��Udddd��|�dQ���qC��d�����1�|�t�o6������LfM�/]��jr�f�4��#�KpF���Sn�Y�����yaB�����M��[�4��g����w��}K�4����r7���bpr�o|�=�����b�M�E����}{��+��^���Z�������5����3���`���
~����)�:a�Y����A��[��m�z�����s���W<x�i��f�zzz�
rJ�g6�r���K�<k���\u(��a�?���e�
�r���E�16=<<������j��3�b�d�k����?���s��k6���w�@	���!�E}olWk��#�X?z������=�=��i�����S�<�E�o"{rv ��&o��=�9�~o����'�M���L�d�~6;������}�����������6��b���_���c&�5k����n�w^�O��R���`��4���\]��,�D�!��u���IOJfN�V�Z����%|����tw�P��������XCR��*�s*���
�$7���^������}���b����/�����+�����+��t�����
����P�������~�=���g���
�9�K������P������������X��p0�M��AOL?��`P�Bo�T�G��+�p^=���s��x��{���[{8746��2"l��fw��!�6Y�%��������k��N�&e��G�gE_�j��f;
����Y>>>����k��
��GLL�Yt��]������YpG*h!!)���}����*|�E����a�J��
���I�c.�36}=-�!@G�����E�yxx���W������c����i��{����
����IFFFDD�����}�yr�������:��0�w�;7�s>��V�OE��v��?o��&_���c�!sdhou��������$#d����e��)����7�_����n��;vH�r����c�������W����?h�����	&(=���?{�lhh�����M�����PE�)����.e�-F!�������M�r�	�ZJ9bHXs;+�)�u�Y��K�"�BfJ�*5{���={�h��������?r��������,X�����n����-[��,Z�h���		��b��F�
>����s���Ss~��u�d��9W��2�e���Lu+�l��a��{Z�|�����x=�RB��@J�r�^����n��i��`��\�v��3���w=�X��N�@��dC�j�M��p���G�������w����|�����!3o��u������6n�x����+���g����k��o'''<a����6m���2dHhh����V(:^��~����������$��
��,�?�N]�i�4u���&!3��6uB�d���~�����R�\k��:E�U�u�ir�6��Y+���q��s$��\���o;u��g��������e�
��������x=�z�O�=��l�t�����B,�����{~��q`h��N�L�!d��U���m����I���
���RV��JI7ifr��;��!��v�I�#������������C�T���,�g���4S�?4������6��I�}�(������)^rO9�(#d������==��3����������9�ap��~C��C��3?)P0�����s���S��w_�q�L�7]OM������G�jyo-K�X���n��:������sOM�N�����dD�G�gS6���i�	9g���n�����J_�c�vC��z�B����2�]��o�q�X��!{�����oJK�\������{���r��
�&g�y�����3iC<����<��������.����<��:9���vmU��_,�P�2Q\]N�5%-��t)P�������M7�5�������]���m9�m�:jBe�]=�r4d��N����llVt��j�[�{W��0�q�P�\~��S
;�Lz��)�C�Dqu���������i�����i���v
xmX�k�9'��~������{Z��Y9EG���H�����m�;�G�\��������_l��z����g��_s~����c?������B&,9y>!!9�����nH��su�
���/�u)9�'*��3���66}��0<|�*P$2Q<$_O\��|uO`���
FI������sV��e�:���,1���'���������RhV}��E�@�LI���^���g��`C){���(�������Kuix�Q���\�?��z�{#����Y�����w�L���	���vm���=o<4�f�{�U���O�>y��|���C�\�[�����2���_�i�4c���_FK����~tA��^n�6��5���S/$�kr}Fj�eP��9�>Y���'ww�2�hm���@��P0�L�%a��|�M�,7���N!dB�/%����i!ww����p�^���P�����������s�������U�� B&����u�Z�����e�3��f
�`i
�����1c�F���+�\���d����	�!`.%�\��Y����G9���O5�X!d����x�B���F�W	���Lz�O�y)y���T��F�W�X�B&=\��w�;��K�Bf����IK��ml6h�����b��	0���HL�bl^O��c1�X#d�#�}��:���v,���vb��3;��*�AO����%!�MF|����q�f��/�h�����1���Ykl������{����/������.������vm���2��zZRrj��y3=��� W0d^�if$�?W�1��2��gV�I�46K�rj���������w�����tu3���P��`���26�h��e��&#��i95�C,�0%C�iff�?�1����\N26K�rhT�dD�C�6c�`r�/����t)��4���/�`���r����'���J�-�S��\���8���+/������2jG���RS���'*5������I��`n>������k��`����uCA��`��Z�����������m�����[��l���2$�4���1��r��4l����kkC�|�;\7��`������+�s��,{����	�P��\t$6�g����5��<���w�YZ<qsd�;��e�jE|O= #S�JP�2�*�z������ig������t��n�Ym���{t��������������!��2R������^���s���gee%]�j������+�fF&����B�(���&o�������j���|=���>���3����� dX�u���F)|��2@�v����?��0��ct�������4d.�if�|,)�wG��3���
���W��L���������+K��76������`�r���OJ4k���W�fC������
��pb����5>��t���Y*M�J�x dET���o������AO��ma���)��\]elz�����ey@��@��y��o~T������$c��w}�!����.�16_{��cy��� d:������n��N��iW/e�[h�������O��\w�]�;wSH�����s@���t^���P@'a+v����?b8�cN�����,-~���#�v�����|�I�����Lw��C�T��}
�����~>�\}��G����#G���(���e��z�����fp��^O�v�!�%^O��p��tL��|���f�
�9��9����w���{�����zh���f�I�%-�����u�0u�B&[���W?�dlVs1�k�j�!3_			����W������������I�|}-���"�X'#�������m�v��}=z����
��m����%n�B��Bf����'i0,,l��JO���{��=e��3fn�B��Bf��,Y���>t�PcO�^���#���Owpp(�"�X'/��<�������u����&'*l��UxxxLLL��5����A�	������ll6u��6���c��R�V�7��z����Pa[i��wC3K���_����5�f�v��<�����R&�UBIC��Clllfff``�Y���;Z]$==���
jy�����66��Ml{��UP�N^�8w��t8���z��K�R3s��/]<cl&_��|3Z=>++���������$����f���~��d�H!�i��k���Q���}��FBN��������H+��F
���������������N���#mLN�]�����q�
���u)�dV�M�6�����=�������tjQ#U=�Z��>9I����]�,�bV�W�JN�����.���:9�2|���+��}�<M2�&;D��+{{W�)?������z��7����\���JN���Sf������i��1x6P_�4�15#�Lw~�V��^��t��cZOV�N��r����k��^9���Mo�`hR�N��#N9z�<U'���<M�����I��[�f��9�g�����8�<rW����Y���j�cE����U�y�xz_6x=�su%w�g�z|�T���Us�1������K{xL�qi������Y������!��Wu)������������4�w�W�p���+�V*�3@=��i=����9������{��/�`��{k��7�@�k�'�.>��9OP���-9��W��=�R/���Q*�?��d�^b�U=��L^���\����+����-�P���*���V�R�-j�<^I�.=M�������A^�~��%�]����d?Y���&T���/�,C�i=e������NRO��_&�L�������^^9��U,�����nZ��L��-g�]�r�&d��&#X�G�{���R�ds��v3�e��S����rN��[��W__�k��9�/��j��4T4�����C���y��
R_[�������0�t�5���vrO����k���l��zM���f���ar�R�����t'���rJ������-���_��9�~3����]�K����}������2�;�U��\oafo���=����������i�|"��\oa�Tq�R>g��w��[��\�N����oafo��oa��2��zy���(���y4���=�7{+m���TIK�P�7}�U�����-5�[��[��oa�.���	0��e�~+��~�1���w��t��[���y�oa�)��=SL�/�V����y=�f����x�-�6����2���4A�,���[s��x��"�]�6�����ml��bho2�B�?�Zfky���O3\({����n^<f���&����ax�d����,�����u=I����n�����z���W]���q�X�����YN+��aVO������S����9a����1��V���S�`���E�&+��Y=��;��i�.��eZOI�UrJ:g���������T�������Y����4��������������o�-�r��0�����B=���2y�5��`ZOm�&�/�}�p��i
k���fh`��U�\���W+�Ts�^-������
�������P���M�1]���2��9�A��)��c�3�g������y=Nk
���]OpN��y=�~+�j�5�~�b=G�����y=�-�c0�'-nw�8u=���\��5���������zn�p-����9���B=��o^;^���cj��a�\0��\��[�������5�iha����Z{3}���v��z4~kdpi����fV���[������=y+���t���H�I������[X�&�$�V5	9f�xe��Q��h��W��[���0��T�oa.|��]O���s��4�h�Y��0����oa�o���2�1�E�~��'�[Fg�*w��4���f0�'+&��-��[��[�ca�2��[��#d������v��tQ�Q�-�"�Xg�.]�,Of~W��XF=V����2���z,������V����D=�Q�e>�*(Bfcbb����o}��V-��.�e??����Bf����6m�w����dWWW�3###""B�d@@@�)�:��!d�����
�0a��3���g����*����c���������P�2�6`��E�M�8���!!!�'W�X��Q����+"##�����k�e��:�;Bf����6n�8a����6m���2dHhh�����X�������/�~a����A���Gl_��P�2�!d?E�t:���z�*j%Q�e�c�XF=�Q�eE�C�+�z,��4���	�!�B&@3�L�f��2�!d4C�h��Y����7n��i���{���o1�.]�:u����ccc}||BBB����aC{�=y������9s����Y�fc��i�����Q6l���3��������0 w����Q������L���~'''�~�������gg����<�����^�����r��Iyvv��q��i__��M��=�Q�F�Wb�G^��7o�����|�Ii����Y��`BBBhh����������;w�<i�$y��U�-��G�=��z��c��t����P�]��V���J��N��C��N�j=z����at�E����sm��"5�&d�8G�����?��c�Bn�|�r���eW��K��={��l���k����m�����={��m�����7�z���������+W~���?��s��-��GM�\�g��o
W�^���{�P����R,Z���g������x�
�+H�}�����w�}����o���Y��+��;����=����L�2��U�������'���E&ym����y�K�W���%�����?����e:%�M}j��LII�Gf��}=z���BTTTxx�lNR��f����z����r=���m:��c[�G�=���G�=�����i[�G����zt�i[������e���.�j=EmRM�,YCBB���//������������������*=��w���������_�=#F�HNN���0��������S�������c������/�w��A;��LY�
��I;�at����^{M�i~��W�y���7n�x�b����'������|���I�*T��=�:JJJ�w��zH�y�������	&�%d������}���TzF���g��w����y��*)IvJ���e�>e��3f�_��{l�7���j=:��m:��c[�G�=��z��c[-I����zt�i[�G����=���h������ZOQ�T2Ky��-O��u���2)�C�/�����k����s������e�����������K�111v��H��2Y��a�<\v,C��xyy������Z��e{V�+�f��			�-L!/7yc�����z�-�p��I����5l����=66�.���������?o�����h�"}B����%K��:t���W�^c�������k�]Y�G�=����y�m�����?��������j=����
��;m������Z��;m�{�w�V��ym���6�&d�,*T�������������y3--�b��v�g��If=�N��z����R�"***44t�����5�c�)��d�^�R%;��e��r���k�N.�f���("	S��3����������:u�����?O�8a�=��K�d���U+��INNNLLl����	���V�Z������(]������P������n����Y�/Wxx����Y�-t�G�=��zt�c��t����Z��{l�����.�+�N������N�r=���-�a��E[������ZOQ�T2Q���?_^}���w!���w���������=���4Hv�'ONOO�c�����Y�f��7/>>�����2�����]�9r��p���!C�����YYY������S����('�����?l�F�������3c��:u��>}Z�d���{O�bdr���(����.W�jU��R�������M��_�����|��;7���)�{l;�\��N[��)
�����SX���2Q�l������n���k��f�J��������{�\��V�Z��d���[�n]�f�������#���K���F�'N��3g�3�<���,�*���|��������%�����7}���������+��������5a�;�P�n�_���'�|��G��j�����O��7���R�J5m���?��)��?�cbb$��k���_����$�+/4�~�8��a�PS��;7���=���v.v�i��a���.:{<��z�^0!E��e� ;2y{.S��}��7��/?~|����N�
���.\>|��O?��K�o=��c�<�C���|��}CBB�y������-[V�z���bcc/^l�_�=z�}��R��/���h����7d2w�����c��G�{��G���f��t����s�v��q���v���#Ft���k��2�S��"=����o<��P���a��sc�mY��c�i���;m��0�������z�B��L��� ��?a����!�S�o�����;v��]v������7cf^�uyp>��#�o7?��nW�^���;�����4m�T�z\]]����|�IcO�*U�����o����g[]�jU||����v1p��K�.9r�x�>}��DA��2E��]��'�����G�)/(C�H��~���R�]��k�������+=��0���{l�����N;v�i�����.������St
&d������/|���o������K�*e��L<����������8q�n��z���
d�0m�������O��'�~��4=��YO~|||v��c�58`��(�(�����+W����f�3���n�Z}�<www�Y�x�����2�<x�s�='@����K=��{���_Q�p�������L*�)�k�o`)������"��6�����;m{������j=E�`B&�L^�b����u��s��u���Q�F����~�����:��u�VC��U���R,�6r����_�z��o��E2O2��rh������}���w�^y�S�^%**��������)��?�,o���t�����SW������}�9;�d0ddd(s&�+��g�y�.��qrrj���lQ�bwuuU:�������Ng_b���{l�����N�"�w��0v�E�=��j=E�`B&�i���}���a�������W���/_��k�=�����7�����__�z��Mu��X{����}�!C���������)S���7nl|4��[�c����/����?g����GK��C�����O?��W�z�����8|���	���/Q�R%yR������:u�(���m��]f�o�B��3g��������eff���D}N�i��
f<�������=j���������h��
�����N��F�]t���l���L�,YdW�a��rzz��3gF��4�~�mooo��Q��W*1�a$������\�g�}&�x�G�����g��U2Q������+�s1u��{�CV�V�._�)U�����{����E���~������#�G������G�{���3�1c�L1�1�|���E�J�.-��]�Q�4W��w���GF��V�Z����2�=w����.���y���3��~���S^b�=���m��Y�{�ny/����Vw��Mh���		����+5j4|�p�����������Z��{l������������Z��{l_A�������N�j=:����at�E[�G�]��z�����Y����aaa������^xA���|OF�s_%{X�_=���]��M��s��o�����E��_���{L�J��n��EDD|��7n�p�B�����3v����k��$)Fn��O>��fyn���{��g���)��/
��z��'v��!��)�����&M����s��v��a��[�l	

]�x�$����i����`u���$���	d��i�&�!C�H���f�\��{l�7���j=:������zt�c��������)�m�m��w�V��y�mu��.�j=:���S�&����eT6{W�C��L��l�2{W�7///�?b����5�������f�w���l��"G��-e�`�[�e(���lE����VoN���-w_�=vA��;����=���������L���-������=w���^��E[�G�]��z�>E4C�h��	�!�B&@3�L�f��2�!d4C�h��	�!�B&@3�L�f��2�!d4C�h��	�!�B&@3�L�f��2�!d4C�h��	�!�B&@3�L�f��2�!d4C�h��	�!�B&@3�L(�^�z�X�"..�������N��Z�j�����B&P"�{!1=#���������G�������\=z��I����c������C��7J�����1c���������k���;ie�C)�o@����_�z�l����B/����0���2�����	�Gj���-�qvr�p����>����x��dz��/Bv���������8����x�DB�"=8(&b���<���6�
s���pt�����P������������n�]���c�Z�����}ho�����F��OO�O-P$�}��M�Iy��:uY��5�		�$���$''GRWW���n755���w��������K����Qa�`����(��
7��Ti�|'���x���j�
�Cqe������q��]�Z��#�S�I&tv�2##CJ�9O���v�%���������"��������hkkwwG@}����F������o��z�uH2@������������O�}����"000$$����[[^^s�����j''����;88to�U���<��p�7o�������K�A����1e������2���]�={6-hzz:W���3///??������;++���*22��������G���]�f
�������Io�E��e�?NLLLMM-++�$���������{�������O-P$� 
���������!(���q����W�XAOUTTP>���lccSZZJ�����)��������%�R���X__�v�Z�P������d
d�^��������e�����}���G����m������ZA�C�ZZZ�8�|[[[�I���������455W�ZEOikk�������#E�����B�FN�8�x�b���[i�����������3����ST
I&H��gZ P�JF�miiy��9ODFFRH�������*x{{O�4)<<���[��ku�9K
7���z������'O��*���S2z���������K)���[ZZ(������{7���w������777sss
��|�+++)���Y�9s���)--��RBRVV���W�RdP�ob�KKK�m���\����<������L��sP<���K1m���eggS@3�|����kjj�����%�RWfff
��#F�y���hiiM�6-//��Mo��9�������5+..�������@OO�???n��������WTTP�����K���IIeUUU�������S�_t�*���/9.�����>��,>�@E�d�l�]���f
��7����'Onw
����)�,--�S���YR�aee�{�a��ul����>5��'������Y�f��=������NNN�jZYY�w�r���S��J�%����&�;w.e2��W��@�ob�%r�nPP���S�,Y�v)�����A�	�I��aCC=8�]9+�����;��(|�H��kgg�����v�"���\�299�6�@�O__���.i���W2d�~���0[[[:`vvvZZZ�~�(�HJJ;vlW���&����������_"?|j�� ���@�c2���A��s���6�]�|l[ZZ�����}��������u�����R�������v�����]I�5�����/_
)�HII���|��~�D���]�O-`�d������Z\\L�"?�z��1���&����|Xd��������8j����BX##��O����??���������>B��OHH(**���hjjZ�|ybbbHH�8O�<
��.PCt��Pv1CDGG��2<��@������L�oo�c��egg/X�����w���;3g�l�}0�BJJ���]]]���������T*gw��v.\x��������hVB����������������(OOO___�=}���m�h���A����������[�n���H��gaa!�h\\\�/ajj��lu��w>�@I&@����?����"_Xe���q��	&<��������			b�{yyQzy��e{{{��7oR�I	j��o��Q2*��QA�bbbhz����/_R�����G����wc��=����QGK�}J��kk��e�(�`��z��������q��whSS������wcccbbbsssdd��^�����p��Uvvvmmmw��=u����3�*4�>J[S�d��E7�s�on����d�Q'|j��L�>�fB���<|����oGGG?~���z������QQQ���b��.���3;;���fff[�n�����>�������	M/�k/^��������fl������o����U����������;mZYYEDD�����7m��
)�>|���]�jjj��s��IvL,mm�������R����N�:8�_��_���;�f����)���E��
$� �1�v�uuu�]ss�����i``�OD��B���
H�G���B*�!��e��r�j�.|MQZ��3���H��H~����A��G�`ll|@�K��.����O-P$��4H2@i�d�� �P	��l�G`�4�d�!��A�	J�$�I&(
�LP$��4H2@i�d@�ijj�����uK�������o��uHH���{U�����f��_~9s�Lee������+**F����=M_[�>��K��o�m���=�L�>������&�u�^�Z��L������_uuucbb&O����w����Q�?���*y�>3����������Q[C�|��x����:��N��+��{�*�>5W�k(�^g��?8�+T��ijj~���mGDD����6�<ybmm������K�aaa����rgg��c�H2���A��/^K������`��_���gMMMK�.��e���ug����#�WM���gF[D��P1u�5������k�oN��G�/�V�U�t���I�cn���"�]�z�,$$��������Iu\]][ZZ�����w���[�N �KKK���+�d�j566�����b�[[[)����Vj�z�;3�F������o����a�;�'����drb�(322�$��D��k��Q�������t�L������������
�����~���+�y�f���.]�
�����#""�L�BO��3'//�6���^������[^^s�����jj����}�vv@__���Lzj��Eiii
����F}}��-[����;;�C�Y[[o�����3>|���MLLT��13�K+Y7(@���=}����o-,,CBB�M�
����a����2���g�����s�===i����...���YYYUUU4�������=z4-��5k������4������2�<�I@@@hhh����>:>�K6w�\;�|��!�e�ZZZ�f�����?�($� 
�|XSXIA���	�����)%ptt��w���B��������Y^�z���5::������m�#R�HM***(��(988������������S�F�TA[[���-,,�)�?~<������&N�x������S����?������fdd<�|��
����p&3��
�����
J7n�8x��+Vt����T�p���1����L�������gsrrh��R2F��������������� MM�U�VI/��'N�X�x1�Eir6o�L�9��JZGb�:I&H�{���_�^�x����v)(������\����W�^��}�;���O�3E�w���V��������b"##)l����J(��4iRxx8�c'�+++)��N\��~���%��p��?�����������w���u���13��Ju������}}}y���!(7`%�[ZZRF$=���P�L��XW`�e��v���sss)o|��!��K+++�O��#G�dgq������yll,�dv��3gh����y�d`` e�eee4���� v����d�D����������h�Iff�P(�����7�DKKk��iyyy555FFF�����F�1������
'N����XXX����t��������m�;Vl	���e3C������"l��C�6<�|��GWW���.6��L*VY�1R����2k�������Z���===�A����mCCCj^QQA����R�I)eUU���)+�i���H2@�������1c������
�E�
����/:�����O�<���mtX
�KKK�&�b�"]n{���bK������z��J$������S�.Y����e�����������*0���U��nnnk����ge��������������.//�$S�x#""���iZ���K����������z $� ��b�3���\|����!����������^�5a�0+���#W��c��]�%�D
z��P��'����(%���O��%5T`&�����1�\�299�6���O__���.1���W�n��=[[[:`vvvZZu�����$v�z8$� ������>|hkkc�����j�����3G�c�X�L3,�e��03j��L*VYC�1����[�����j����;U�2v��d��{�/_�R��������������F�+���-u��2��I&HdffF���g����q�S=}�����C���������%�jSt��?~L���"�d��Q`&���!����222('_�|ybbbHH�8O�<
��.PCt��������9|������5|�t1?�,++S�8����Eh8�������; ��455�M�������_��*����u.\x��*���f%}��H�������c�����{����sg���b�"�af�I��T
�2#s�%%%QQQ�������{���m���.�2K��y���}(o�u�������������u��--�
�(�����611a%)))
�2������xWWW�
�ZSSS����@o�$�O������Vz������7����������#F����������!W!&&���K������/)Tz�����Gkkk���%��U�����7N�0�������OHHPx�
��u
AK�o����Q�,��(0�����~����L�;b�5d����u��e�2�2	=K)����o����0�������������������HI�hooO��j����;;�����w��:u�R}�����Z�FY(���Gy���Ei��
v��=`��.�����������8�^^�|����p��M�9,X��s���$�O���S��?������N���(��������O$wK���oSz��E������u���S�J:�����Itt�����������{TT����b�������#V����C��lg������xi����1��Q������*""�FD���M�X!e����kWMM��1cN�<�N{����}�����XJn���|����������!z�F�W���O�g�>q���}�(I<x0��YYYB���Wf�@(A��dgg����h����	�L��W�_����.�J�"b����t��~sss)�7;&"�0F�_�����*f&CDJ�����V�TC
Y3�RXe
�ciW)�/���;(��b�kll|@�K�V��%[&�/����������}�W)gG���pH2@i�d�� ��A�	�"�E���d�� ��A�	J�$�I&(����u����ZIEND�B`�
bench2-10gb-pct.pngimage/png; name=bench2-10gb-pct.pngDownload
�PNG


IHDR��#1L�	pHYs#&�&�.��IDATx���y������k6�1f�0�		�-�S��%e�(�6(����f�X
%�"$�B�O�$�B3�2c����^3��{\�����s��s;�}��u�����u��9��.���,�y����I��$�9$I�sH���$�!I�C�8�$	pI��$�9$I�sH���$�!I�C�8�$	pI��$�9$I�sH���$�!I�C�8�$	pI��$�9$I�sH���$�!I�C�8�$	pIP0�������K�.�;w.$$��e���?��S����A�s�������������b����9N��m�O<�\�o�,�$��Q���'�%27-U�T�*U|���;>��#.(�����-��Q��]�>���j��9s
�`�6l���uk��.\������������4�L������|�I7$:��{��������>v���:�}����K�=���X�\9��:�����Z���kK�,�����o�>�s2�����Z��<��K��{���S�i����/^���Agc$p��������%��)]��z[�$������{>���=�$w*R�����z;999:����>s�L�o}���j���`VVV||��+W�l�������-*yzzzyyi�����r�P�V���]�v�k�.&&Fn/^\B���V�z����O�nw
��3f�5*%%�F5���Z����_��B�h�>}���?�`)�N2����od�)SRm������+�"9S��y[v�]b�����Mg���=z�����,��(]'7|���B�!����������e_dC�����$���>��C������{��X���/��<y�}��]�V=B�����:4a��~�a�����F�!����.h9B���c5j�p�����}�Y���5�l��I��o�����~+��Y�f�������'O����;v��\��<;	i��|��7$F/X������9����,�����������K�������
�+V|���%gV�ZU&���D_Y��M��[Z�h�s�NKh�p�3�R�d��-�\����o��%J4h��m)
U��s�R�=$�/_��kW��v�$	����"��A��y�����N�:8p@r���-*�L�������V�\�`�q��E�.\� ������-�Jx[�t�4RZ�x�b�IR�����{���>���OsK����.����B��_}����}���i��IzT��l�2|�p�!Rz@����H���!)W������3e��O3o��������K.����nB�R�:�P5�"I(����#i�q��W�\����*�����5k&�'::�F�����e���6K�T)R����$y��I�k����������v5I���W7�Ri��^{�5Iw�$)1233�Z�jR���Zo�����g=<<�~�i���p�3�m����*�c�\,7n������iiiU�T����;��c�5�����C//���t��={��H��/,_�\�������7�WD�9s��?���������%�J������o�.���2e�<��o�����>�V��c���m������8p ������
��]{��������KK���������c�c�=&����s�����K�.]���E�	&T�Z�F�}R��?���U�V���?�<i�<�~��9��pAu���y�?���y+�>����j�J^���9���%��V9��yCp#I(�j��)�I"��%Kf�������R			��R�J7�I������	�L�#�eR�� g~H"������&S��{�J�������oc��������t�G������W���X|�A��|��O?�{���6O�f<I&��{
��Y�������+��v������_���w�}��gj�o���4c��JN�J�l����K���W�H�%K�<~����z��������W�^���?$��vk��!m[�t�EY����:��N�:%�,OD�r�=��z�'%$J���]�!��u�$�i����x��Cqqqj����{>�l�1�V9��gCp#I(���yI�iii���K�6m�����d%����8����S�
�'Nt����\%K����L[�����$�m��)99�S�N�6�6g;S�b�G����������2/��QQQ�<��L���N��#����{��1t��%J�g��B�F����o�d�5iK������_HK��$-������[�*#G��qN������;K�x�������r�����x���S�����Z�%qk��!#F��������U�V������7�|3O*33S���0�U�/������J���~(�+�_�l�t��q��w��]��K/i������d�:t�g�sk����U��@����H�
�
��),,�F5� e��}c��=s��L���r�edd��SR�lW��E������/\����
��/��Kv�-�]�����U�����)y����O���?w�qG�z�lT����%`|���j�����tQ�N��5X�2���"�z��C�D$x\�xq��I�/l�+6c��)-��}�S�tX�z�<Moooy"�D!$GI��l<m�4m��r��w�=�R"�i�������=oO�����?�����o�W[�p~��Qy�S�N�-�l���~�i�x+W�4$I��c�����g�s��ka�#/P�lnI$I�����\�r��e�C�0M�2���_w�e�[�n�~���7g������������;��L=����W���C�opp��Zfffjj��\"�����w�����l�'�[�>��c�qk��}���<x���l���a�U�TY�l���*	����=�$"�����O��sg	����-����k��%A�p�����������i�h��AR��d�e��1���;D��$Iy�,���[�	*�C[����������TP�[I@�v��5��A�%J���MKK��1c������'��;:���"oEr�Ih�V�5O�8!S�|�Q�Fy��AVV��G�����zU����[=�������LK��]M�n��Q�u���g�l����ryA��9|��<������q�����&���[��U��z�����Pa�N���_�!�����^��g���Y-y���ml����6m��z��[g�Rq��U����*U��0�m6��ka����
9���[I@���t����������J��t���������~�v���~����C��4��?�hKF�=f�C5���������{������L��F�=��Q�v���IIIVU��������G��Y>;Sf�[�lQH������pv�6����/f-Z4x�����|�\u����6d	��s�����-���~}&GnK��U������s���7o����$��7�(9����(�m�*��Uv_ �7���n$I���;��}��I�#�<�i��
9rd��K�,��
����i�����;v��A;v�}UG�+W���KV5���Nm��l��[W��={V��+V��l�����M	��q�v9��{���&IK��"���w��~ff>�X�m�^�d�m��>|����+!V�7U�V���tv���
,�{O��R�/��|���
�C��\%In������2���?�}�v)������q�k��n$I���_��|p���;��D���~Z���K�<P������{K�LHH�X��y��m��N�:�2|�ah�z���R/^,3�|n����t���*5c[�B���
*9?�s��G}$s����]�����8+((H����_�)���.y;����;w.�x��Gy�J�*�-?���/��r���������V�Z������p|C�w�-�>���������;/����[�S�;{&�Z���_�g�}6""�W�^������Qr������o��f��m2�7|��^�C������W��'%�M�>���_6|-��t��W���U;z��z�Y���U�%d�����^�����|�d[�����2���[2�S����������_��,?�t�����_���yX��;D��:��_�4i�����$�����g�s���"�Z�h����\������O+91����P��$F���k��]%G��]{����/����^�Q=��`%%%��q��y���SO�j���R���
��C�o��fdd��U�:w�l)�v����s���Y
��Q�F���m�~�z�aR"������8�������� a�������z�����_����c���J�������������v�Kcu����V�2�,_
Y����s���OK*��kWDD��w��}H���q��V��R��y���>������n4���q�����c���V�-�Q���K2�6m�$II��>>>�Kz����5�e�E�7t�w��=���o%l[��7�,��ef��!I(D�^�z�����---�L�22W3d������?�x����?.wm\�=��y���~�I�L�v�����6l�P��qqq���z^
�t�/_>����L��L����-q�������Lg��+����[*��QCzL���C�$��C;v�U�V�b�$�Ik7o�,-<y��T�)����f�w��-[d~/�@�r�m0���U����_|��$S���J�
����Gy411Qb��e��`���_�`��5�~�i��I	���/:t�z�����zKo���<AK(�� /�Nl�%/D�z���_|�E�@�AI�WO33j�(G������_����~��r������{��r�J�.]r[��;Du�=���__^���{/33������# �m��1.{-����-[��]������({���X���N��W_}�@�	�G��N2���/��2��X��X�ren�kjT��|��C����������7o>s����~{����7�xS�D	�a�~$��X<##C{H��!�j�����;v�G��?^&�������C��%eC�����Y�T�5k�N���s�U�VM��aaa�s(9�o�il������G� ��Og���:�#Iq��wJ2|��w����a��]I2c�5k����N�0�rl����o����Z�J����elH
z�����Ju�(b�K�~�mdd���|0))I��t�O?��x�b�%�}��lI��:u��[�N�h��%�`����+����?������{��U%}I~��������{#F��D�+VH�Ko� ��"��d%'����(���q%I��/�PL�����*sc�-���"�/�<��K���C2���?���a9U��9
���z$I����r�X�b����^x�]�v6��hXP�j2!���������j��Q���E��?�x���2#� T�ti��2�����k����|�ID�BK���������ev.�V����O�y���H�	��#G$'|������;{�lzzz�2e���?�:Gn?7�Og:�#I�����W�>k�,	���T������1B�T����$K��p.�������e��N�>]�9���m���m�6��v���y��>}�H�O�"
����~5���3G���o�EGGKp�����������~��?� �,�"YH��C9�	�T�r�?����O>Y�z����O��e��m��w��;�x���QI�zd���@�W1�s�UV���"�j���t���7n�%;:y-^y���h�I�{8~���ZP���O���#�����X�Y���NmZ��}r8X_�}��'j���3��'�]�����rhK���a�9$���}��g�W���~����%c�%��g3��m��*Ujl��6j�U�s�X���*??��9l�y����+�"$�����#m���1*G^��}���!���~���j���Q!�{0(($I�sH���$�!I�C�8�$	pI��$�9$I�sH���$�!I�C�8�$	pI��$�9$I�sH���$�!I�C�8�$	pI��$�9$I�sH���$�!I�C�8�$	pI��$�9$I�sH���$�!I�C�8�$	�f��Q|���������@�Px=��3k��y��7g��ax(55����;t���y�BCC��<�4l��v�
6�n�Zn����i��V���9��7����������/\�����iii*T���#s�J�*i�]�ti���k��=w�\�2e�x�	�S�fMg��|��O>���������W���~��"E��~���z�j�
N�81i�����;���'�����?/#���~����\�R�d�;��������k����5�������������m;h����`m�m`���V�XQ�%�)���lbbb���������������o��?X]�t�<*7F�9a�M5(V�XJJ���K�.��R_}�U@@����R�j���������
����6��m"K���/��k��/^�r����5�P�v��U6��%JHoK�SO=��K/�K`�U�^$I��_|!a��?l�C��L�%Fv���0�H??�'�|2�G%��7bcc�o�57nl�s��w�X��?y��dC�.d�������g�}��������N���3g$�>}������&��������S]���y��w�N����/!Sjn��}��idU��y��x���$��aAG�������/_}����$�����1'�r~�^�zI0L�e�/�{��o��{r,Z�H���Z��EVV��$�H�]�x���-Z��Z�t��HI;��m���r����e���7�T�-�naA6l�<��M�O?��Zs�<kyed*���6��5���wFFF�:u�1���111������s.\�z���m�����			'O�������8z�h�2���.p�$��+((h��euz��)��2_���_f��Q�re�����2��Y��jW�\���:u�<y�S���������Kf���������^xA
��/������#����?����Z2g��A�����U{������W��U�T��V�B)INN������e�p��������>Y���:������%+zyy�7��7��P������[�NV(�+  `������������kK����7o~��1I�#G���x�����ko�����~*�[��4�PA����Y�fI��j�&Y��_����i%&�&OJ���V�-,���h|��g�6J����o�^�L���T��t\\����+�{�9Kyff��1c��"#3""B���S�U��!�\���V�Zm���0	��"I(�y���c��5�w��k��������_~���c����J��V���Z�`�z�fjjj��U;v�(s��%KZ����}��'K�,� �+V���M�w�}�|��j���%SI,|�������������[���k�yR��'��;b����W��j�E��#���k�Z�o���������$.����������#���$eF������?���Z�jI����$|	���<����FJt�IY[�l�^�tI����{��D^Jg��#O��mI�x�����,-�H�������>[�NYJ��K���J����K2Blxi[���%/[����32b%j�B�a�n�Z�n-�S���I�����qc��2��IR���'�|2�I����s���V��r<�����������Y����_���G�m)Q����i�K�������4i�M�J�A��!������u�T��T�TI��<;�/�(=~�8��(�H�
;�N����k��Ug{�
����k%dj��K���+W���������[e�-�f����WO����<���
j��9p�@??��~�Mf��W����,��d*�+)H����.'O����^|�E�C����'AAA�.(������+u�,SU���{9	9�:��6q9��=�k8O��Lp:t��y�I�Ir����{���B�����4��H���rd[��}�QC�����y�f[u��)�+����f������������.e$���<9u�T�X���Q-)���?���_{�1�C_|������s-��/z��%��/����x��,i���2F�)�l�������{����:�,_6J?[�*�|y�l�;�����_���u�#I(�dB&3��������2_\�x�$�Q�F��|K�5h�@bg``���e����.Aq���2Wr�-���C��R����_*:��o�Qr&|J�������7W����`%�`��x��L������2e��n�����S��
�S��|Z��l�R���~%�����g��gaaa�������w�=�8�	6����������'�;��s�I��Y�&--���G}T���N�:Y�~��:e��{��7oI��'ew[j�����6X��={�����e8��_y��<���������'
���|����+�V�����w��2�?�����d�=$IJ{�Ir�����z��<7O�������JJJ�$)}b9��#�Jg���_������v��{��!m5I6i��V�Z�h��'L�P�n]ms��m��]�v�1�y�f�$���$	�&P�lY	�m��9rd�R��.]j�Q�����V%g*&��y����V����W����#�dH	�}����ef��k�N{�	�J���v;��;��sg��_&��m�H<y.*T��g�F�~������K��}�S����G����-�'=}���s��u�d�-S|Y�������\���zbbb$�X=��Zx��%y!d*�v�Z�g�9������.]�X�n����'��#�2���e���������k�����F)ooo	i�G�V���,�<x�
&��O�}t�������z�R7*QGF�o��&�B�ym2����������5���/��B�I�G��C�r�}����Y�����D���B��)G����������C�?��\�����������l��+�����$I7����/((�����*�sl���[����������/��*U������:�yd�~������[�������]�f������O����t�^��SO=���xb������_Kx��g���X����>�lJJ����-_�\�zU�JJ9v���g��e���Y���H�Q�}o���Q��`����/J��cI��C[��������
�9��'����Rr��i(�q"X[b�v���;���3��h�1c������-Gr��D-����M����%h�S�����P�$I)������G��o�!CH:D��
Nn7m�Tbs&Ig�v��U�Vu���
6<����j����}O98���m>|x��5����m��J����'[��g����/^\q`��B�p���L�%F>�������a�f���� �@5l��C������`�M�4����P���K	��;�`�R
2�
��t�������JH� �w�����W�V�pY����p��%K����+2���e�v��~[+)������c���/��3g�T�X��z��fSSS��W���q��o/��������Oe���,CBB,����9s�����,W�G��#���EDDB�x�������\n���1/���_jK$�~��'�
�'+���	
W9{������k�+n�R�6m��)�����/<X^��S�Z��[�n������$��w�]�rEB��V��S�G���&I��4��}O���������9��S����s��u?����Q�$4���C;��l������#2��G�p������t�"������=�u���3g�3Z�+���,�1��^�0�o�\Cf������!)B���"��.\������y���
4�W�JmMu�^�F
m��g�-���'OZ�����Jd6l�"~��V��2�~��g�.]*���+����I/��B�9r�s�=�=�j��}R����lK:v������!�k���^\�n�<==%�|�����%'X����p��Xu��=z���c��QJ=�����?�r��eV�,���+����������
�l�y����A�*KB���Gu���=%���!��j9�w�.>�������������5ldq.F�P��t��w��T����%<,Y�������r��A�!������{��WCBB��G��$�k��]�r�������J� �al�%���=��������?�����E��_���Sg��]QQQ����4%�w\���H�"�����	-���o��������$W�Z%3��+W*�C[�0%%E
������O?��������V�$�-^�X"t���@�&�B��������i�FZ%y[{
���O�������
K%&&Jp�7o^n������$Iy5�~����7K�4��J��+���?����{��{��!m���`�4���Ws������lCrr�z0����P!I(�����t����.���
43f��#$L����$^�����c�a��~�%5�4i"���;w�k��RA���/er������i���g�m���q^�x�����H�g��� �/44Tr��,����g��2������Pf��rOOO�9B���e���-k���~�����9sF��r��T+]���5k�M��n��Z�jY~k����V��f�_���Gm����W����$�8�����W�XQ����G�iu[��}t��%Oti���s�='���w����O,�322dl��1��T����%��w�����|����+K/U�R%333��,pv��NQ/���Y3C���)�����c��F���Q��x�����l���C��{���+�@�A�P�������2�~���-���
����
f��m9!j�>}d�:v��V�ZYN�"S�����,S=�P&��$'L� ��r�YD�j��=?F~��
���o����}��z ���W_y�����:X=��j���3g��g4w����R{��g$N|����(�oo$�2D2��(5�;��H���n���4R�m�5��S�J"��|��GR�[�n��Z�0�v��%����m�=���E�$<����]����rp[2�_�l�O<1j�������Gk�+;x���)S��T���Y���o2l���t��~�i�&I�]�tQ��t�f���1�2�%`�"���7?*�ZF��gy����NW����y�f���/kl�]�8�hO�gLUxO98�
�����*+C�[���,yM�>]n[���T���<yr��_������K�{�=�@�Px}���2�l��������^^^�/�_��$L�.�3K�K����=��#s5������7�_~��U�V�]��A�RG&�[�n�lY�f���'�������o;
d�b��_������/���e��?����k��s���u�]�o�r��{�)9���5?*��)SFf����i#h���-[v�����+_���4E���v��|��d0����[�j7o�,������z�/���,2q�D�����K������^KLL|���s6�<)=�����$�J��7o����[�\9������={V*�x����I�R���H>��u��)��q�J����4^���[b}}}���;��#�<R�N�����c������Lb��U�0����W���b���F��l���gT�H��+$a���r��5WyO9>���}���G��Sh��E��U��	���9r��y������v�*��CK�}���C����R���+�sEJ��H�
����[&�2�^�t���}��U�1cFhh���={��_�,Y��y��.����&	�g��C����.%3���WK��X"�gdd�y��2�6l��zw�!�D���=�^�@��
����}��L���[���^�F
y.o������$U�����[}t��i�O=%!���W���m�bcc%w���_��D��#A�����9s�D/�+��Q�F
0�Qd�.���'OJHs�T�Z�/b�I9Nf�2��<��������,_�����m�>����W��p}��E�V�PAF������aCg`1p�����`�'"��f��~������g�Y�r�W_}e>���!�N���
"���uY��^���I���,[�����+t��UY\�������{��!����-OG�,���!�O��~~~2�eAy�����*�����������K���/W�
I@!u�=�����+9�%23����R2�{=Gn��0����%@4h`�!Z!!!�p|%����S/����<��v��GDD8��n9�����3��)������*00��+q��ujq��������
�=`u�����%�;w6Ts��-��P9��x'�����rB-QIkm����fV��g�|-p;�$������r�������:�$I��M�6-������p@��$n������	�:�$I�sH���$�!I�C�8�$	pI��$�9$I�sH���$�!I�C�8�$	pI��$�9$I�sH���$�!I�C�8�$	pI��$�9$I�sH����I2--�����:uj��
���k��q���'�������q������c�=fy4..n����W����n����	��-kc�v�]!<<�_�~;w���������I�<==������������'
�W�@�n�$y���n��I����W_}���/�u�]o��FJJ��m�����[z�!y499�y����:u�$A����-�G���#	��
�.b�B�>}���$d�C�i�����{w��W�Z��?����	���M�d|||�������m���.]���k�I����_�/.%���o����%K�$9w�\Yv��)��
S����k��'N�>��F�.b�BTT��m�$+4j�H��X�dll�����i���)0�M�dzz����:i�����[�xqBB�TPc��V�Z\\����zw����������e�.]��5J��M�f��ew�"##��R�J�Crc��M��C����?~|�:w�&��� �f6*l��Y�Y�-�vJ��%KZ������f��+�]��GY�hQDD��N�
�.R�B�233���
YYYj�����.\(�������g��I��#G�H<t���A�~��7�mU�Ty���{��-�FFFJ���RjIxx�9I�]$==�v��5k���'O6h�@nH��\���HJJ


����d�����Y���������:u��7�/��G��������M�6��u{��7����M���O����$$$��%J�0,��������B���� ��i���g�~��'$�n��Yn�C�G��e�O�>b���+W.Y�$55U�]�ti))��=��uiii�����^z�%��S�Nw�}�{����+���TVV��9�v�V�;w�4�T�Rr��^�����}�f���|�����e�����_��<��k�����d\\��;o�[�$���z*��!IZ��������sgKI���[�n����=z4  @����Z�>j`wG���Q���p�����������}��k�N�s���:u��K��]{����
���H}�Oy��u�=�� ��YI��;������������%�8�Z�jy{{GDD���'k��a^a�*Ul/R�\9G����Q�jU���i��Qu($&&�____�!�������]�k ?H��=��C����}����~K��'��/'}||�4i"$�YN�����m�6I���pY��u?~|����f���(9_�*��kL�F��EK�,Yp]�I���={��3g���?���D2)��w�O?�T�N�+A���_�)S��7N]d��yQQQ�������������^��e���[�"+++44������Z"[T�:t�f��N�bt�&����o��A����~�������w���Q���zk���M�6m���������+///�t��W�^R2~��4n�X"�7�|S�~���~[���a�-Zl����E�V��?����<�����w_�`A�V�W�X1y���ynw�i���k��)S,w��;g���o_I�r����o��5?������k������-����l��q��q�6m�2h���c�ZL5����������;f��2%�����o����;44t���U`t�&��9l������[	xSrX}�n���<_��
�\�r����r__��9l,�w�&I@��$�!I�C�8�$	pI��$�9$I�sH���$�!I�C�8�$	pI��$�9$I�sH���$�!I�C�8�$	pI��$�9$I�sH���$�!I�C�8�$	pI��$�9$I�sH���$�!I�C�8�$	pI@a7���{�o��,���_q75$I�����g�#�%YY��j�$�Y$I�sn�$�������O�:�a��{���Q�����9sf�>}���o)���;v������������m;a���e��X��ElW������;���z��=i�$OOO��;v�x���}�������G��o�<z�h�n�$w��)!s��Y��������Kf�����'N,Z�h���{���hu=v�[A������Ly����[�n���-�_�j�?��k�.b$��6M�����7���{$�I�Q3==��W^������;W��2e��a����-[v��u�����O��*�����m�6���5���,YbI����<xp��M��1`�m�$%�����&M����D8��6lh����|������������K�.�F���i��yxx�Wew�"##��R�J�Crc��M��C����?~��yr�&��� �fv��8qb���4|�������f��+VL[��#�,Z�(""�Z�j�U�]�B�
�+dff_���Q�������?/\�P�����C���6M����_���?�����tmydd���*U���%����$iw���
5k��'O�l�����lY�re������G�����_�f������??u�Too^_����/��r��-k��-Q�Dll������+��E�����a��fw�$76m�t���O<���#G6o�,�����G����O1b���+�,Y�����[7��R����!IZw�����~��^h����Keee)�Pdm��s�v���T�Rr[���G�}����1c���AAA��-����6m���]�.^���$���v�������[�x������d�����r,7���$�<x�D��>���������Qgqd��5
������NOO����d���;����l�N�:�R�k�^�`AZZ���B������H�b3�2?����p]I���K�Yy�������$i��
�/_>u�TIbg��Q�/�]�vM��,Y�J�*����%���5j��iw�r��9�N��U����M�&��C!11Q�����I�����[���$I+�l�"�������w��<yr�&M���O�o���fddl��M�z"��8������;v��Y������"��-�E���[@]��$�������?�-�t��K��-[4H�z�g������2e��q��:�������t��MNN>v������������`��������W-	


		�-�w:T�fM�~�	�M�����7l���NOO?{�������C���C[_=wk�J�,�$����W_}5~��4n�X"�7�|S�~���~[���a�-Zl����E�V��?����<�����w_�`A�V�$��X�b����ap�m�$w��5e���s��Y����788��|||6n�8n�8	{�6m
		4h���c-��a�-qw��1�dJ���i�����whh���p�m�$��p�~``�z5-	xSrX]�n���.�HQ�\9��-U���s�X��6M��<#I�C�8�$	pI��$�9$I�sH���$�!I�%�\���a��w�T�]�.@��������|����Q������� I�C�8�$	�6))I�����$�L���G��=� �$+�S����^[R���uk7uW{�V����z�|mI�juI�
?�$+b�.�3Vw��6-�~0j����B�$	�p�uN�wAW����� $I����+)���,75� I�C�8�$	pI��$�9$I�sH���$�!I�C�8�$	pI��$�9$I7R������w=�)�����$���%#��]����$I��I��$�9$I�sH��R��uw==�"�nj
��E������L��+��t��M���H���23���jK�)V������5�$��E����hKz�8l�+��=�[I���:I�������S�Nm�����{
�^�ti��I������		i����1c���g�7v����WGGG�m�v��	e����E������_��;w������[����;�B���?�o�>���X���\M3������$�=��[7�]V�|�������]���{������/_�n���[~�a������ys�l�:u� z���E���{���hu�v�[�O�>^^^2���{�n����w����U?����]����z�}��n�*�������\d��\��LNpSS����I2>>�q����s��6�c�
c��	����_}�U��c��:t�����_/w���+�N�2e��aj��-[v��u�����O��Q�����m�6���5���,YbI����<xp��M��n�	W�w�^�wWK���m�$���%"N�4)�����U�V�����g�y�x��G�Q�.]�������_�T�����Q��|��i�u�]�v���H)�T�������i����!C|}}��������I2((H���
3f�0��������.]Zn�������Y�f����y��G-ZQ�Z5��v�P���
���?E�d���,�D����.�`����`�V���m�����o����t�&�<�7o�$��^zInGFFJ��R����ZnN�vIOO�]�f��r����
4��-+W�,7���BCC{��!����k�����|����N�����{[J9����+�cI
^�E%~������[�M��"i8d���C�}��_{�5����}~�%J����+9?�4���"v+Hnl�������x��#G�l��Yn�C�G��e�O�>b���+W.Y�$55�[�n�K���x����H%J�Q[fI�m�$i��_��W�z���]��H�"6jfee)�Pawm��s�v���T�Rr��^�����}�f���|�����e������M�6�h��]/^lN�qqq;v��m[���s���0I�7uW��nz�����ca��{Fq	
%g���C�������III[��$�D-����1���:7n,V�c��#�H�RJwf���/����?#�����u�JHkmI��vS��
��b��/�%}{l�s}���h(��?��&H��H�3f��q��z�)Ik�/k�=�%��vqd��5
������NOO���o�v�:w�s���:u��K��]{��iii�S
�z���'+Z�=t�{_�]����+�+����D�������+�P�B^���%��=___�+�zF��+	4�i��u	?+o4�@X���
���G
6l��f~b�~�w�o���O�.U���R2�C�t���A5j����r����J�Lm��m�;�����q��Jn��!�[A���$�+����.\���oN�6�����P�*U���#""�H�Sr>E�k��H�r�Y���G��U���*yT
������i���|eff^�v�j���b�.^H8�-��LwWc�3�d�$@J����;d��C>>>M�4���?%�YN�����m�6I���p���S�<~����cg��U�|y��.���R�Q�h��%KHW�#�w��v]I�575&<.��c��$�5p��d%5CWR����/�p"IZ�z���>�����2�HU��=���7e��q���%�������t��MNN>v�������\�n�������x�o��jIPPPHH�lQ�{����5k:��M7��v��&[�-R�A����8++K�ML���xy������~�������7�i��6�V.h��g���8l]�r���dh#����Z���6M���o����_p/==������W�:488x��a�C�r�w�y�T�R�z������������K����o������o�����6l��E��������.b������w��}��AmV�����Z�j����b����'d�(dFLx����G9�
����nl�-%���'vO�_c�����pJ��H�L�]oo�;�Ttc{�z�i���k��)�/�w��9���}�J�<q"{B6k�,������$����q��q��I���iSHH��A���k90���"�3::Z���1c?����}{oo������{[^���jb��n�juW,������n�$9<��
��7l��7%��G���k^��E� ��+g>���s���9����6M����9=3.�r�+����x7�p� IP��l\|��1mI����,�
���+��y��b���$.@���m��j����%�?��F$I��������w��R>������A�n]W�����wr�
8�$	pI��$�9$I���Q����M���*n{$I����h�H�x_s_SP��$q�IHS�3���fF��mgu�r�����H���$�!I�C������J�.]I���nj
n}�-�p��Y��bE}��������r����$mI��U<=<p$I���_TRO�J�2���6o_~�r��_I��i�T��eK?�F���L�%j�����R����\(2A9������v��^[���K��-���$��u����w����$�bYJ�����k$������o������a�$����p���P�AYnjJ!����WW��\����B{�+��W��go=u�+����TS���l"I(8Q����E����[��D�h��$�(y��KO2��K�$�I��$��[�����$1�MM�a��a?l�R[�p��jUj��9
5�$�%�\�O��-���|��#I�C���,-J9�����c����
�Z{����ym���-�$��YF������D�ng�����������p������E�G���%D��������K�
;�$�9$I�&���D��+)r�MM\��e%5���
�++��]I��nj
��I��E�+��J:��4��2pk������F�&��+���J|�)����5���B%Y��E�$��$	���PRO�J�C���IOSv��+	��x��1�n$I@!��$l���K)~��Z���t��ymI�2��*��=:)I����'(O��1����'^������f�z�8�]�����-!9�~=�<bb/������n����gg��CJ�e]I��"�
�u��I���kS�L��eKLLLf���-��sq{�B�1%j��$�I�6����v����x��'�Z��=���8e�%]I|�9\<#-�����%uk7qWcn����;�G[r�����@I9��~�+)�L�{��u��&.FU���������IW���JHE�6��N�C��;wn�����/��������������~��*mA�:�7���+[WNI9~��OY��F���Q��(G�_��d��)���F*?��x�t6I�n\�$����9s����k.�.8+5�x}3���V}�������H����%#��]O?�5p�I�M�+q��g1����Z�+W'����g�}����C�%N��q����$IEi������[�BoP�$�+�+�J�z
���kW��g����;�V��]�����Ir���o�����~Z�~}o���4%Mr�,7�$9C�N��U�8p;8w��C��%}�H��]�N�c���p�B�
��)b�����]��dBV�]�~�^E�)�57������u%�����]��������*���
L(�F>��h���TJi��:��T�bu%������$e�?����)�o�3#@����LBBB��+U�d�*`v��nF^��'�a����d+��EI����\���8���2�*[t�KQf7tSSnn��Y����v��o2�%757��%Ss��������\�$w����-@�[q\w��k�k�;����'O�;w����B�
+r|	��1���X���e�+ws_snTu�I]����"�iP��!I.X�`��q�N�����Ys���:tpqK�������S�6l�p����G������z���������m�N�0�l���W0��:�������s�N??���{O�4���S���;?~|��}>>>���������)��*�Y^�j�����3R��%{�.�;e�������$c�+��u%��nj
P��}������m_�9��rc{pS��rZ1���P����0su�\�dI��}4h���/�/_>++���3�������������=z�[�n���>�����ys�d�0��'N�X�h���[���#��
7b�}�������)=��cu������e��V����v��E��k�w����us��w]3�G��������iK��������L�?FW2��r� ��5���r��}��}W^�xYW���������(��u%O�W��2r����HLZ�r�����p��I�!'N���$��q�{��Gb��1s��s��CS�L6l�Z��e��]�J#�O��H�_gTT��m�$+4j�H�XnI����<xp��M����"j��/����|_�����������t�����$	��Tbu%���*aW�"ct���_���%8��u�N�G��0a�6F
//����=z���������$����[�t�������n)�����Q��|��i�~�
|����Rb9�����i����!C|}}�����$���#����$<�A���]�A�������-y��k��{�]�nv��)W�OiK���&c/)��Jj������
�=���!�Km�
>�
�O_��[T��:IJ^JKK3�K���r������$���hJJ�����5kV�X1m�#�<�h�����
*��P�Z�_gff��:��*������y���,�������.;������j+�W�8�$c��]�M[R�����4��� ,�J\����v���r,b���rP��5
�i7���k��t�O?~��7dK������w�22��l����|X�qmI���*]���l];u�����F-n����o���Y�;�����W�r^�|���}�$
���]w-�z�Y���W���
[�hKJ�=!��|��f��$Y�^�O>�������h)�l9g�������1������V�JC�Z���n��9I��5k�Tr�y��A�!��r����$%%���J������5k<==����S�z{������W�����x����4q*�b�U]P���C��n����������<u
w%�7�n�qw��$���������-�z��g�������^T�O�J�J��%�3����>�-Y����[��/S1|�V�RLVs$�RR���RI�Z���l|s��5��%EV�O�8�����$Xd���'K�Hrj�p\FfV�5����x/z��"v��_�]�9�Uog���=�����-����-�-��9�����������<$I�:I>�c��u���0Y�b����3g�|��wQQQ������K$$$��%J����O�o���X����M���=��'�8r�������<4z�hYv���#F�X�r��%KRSS�u�V�ti)q���s�r��+�%/5�g\��l/���w�������{D{�����6������3�����W�[d����\[2����n�$	 �v�Z��1m��@;A%&%����hKj�4�S���:��2��C�O�Y��r�F�\$^�d��w8����:{��$�v|U�S �{����W��V��q$�����kK<���A�����������kK*<�M�t.I�$$�y����\LAP�B��I�C�_����#����U���IW��5o��o����
�\���s;u�T�T�?�_x��=z���o����/

Z�lY�����i#�v��u����$�c����%a������Xm�����[g%k�\1��7|�N���U�{�
Z��k�lbb��p����C��l(��CJ[!J�y����Yz���
�	�
�q������/����oa>��%I�[(^���������={��-aa�ubc��n��zkf�III[�+����a%���7k��q��bE������_�p���Z��jZk\��Y'�;��HXX�aC�iC���4����32������8�"���:�[����J1���
����;nk;VK_"�(P��-[�$���F.�H�RJwf/���F��s�{�\kmh�i��\6�Xd�W����0n�bbb�vK��g
�O���h�j�f�j(%t�k����e�oE{5��&}\�N�HHO�0|�82n�
n������k�J1}������-�����j�z��Y����c�e�.���=�O���}�5����0^�&��O^G���O���5�6>>���D���;}��	��^_m������C����s��i�~��
���6�-�
b�c�����;rR[b���{��)�������h�uK���ow-���##!.��o(��N(s��D:�7=A��L�%���<}2(�	����FB�7%��/<��C������V"�n���l�~Z��7����^���x�;�_(��-�4�qd�$u%���y�C�<}2OH��^�`�>���f�PPC��S���z�]r�,**JR�J�*T(\'A
��o��ZTKr��p����Q���p�:���`yK����]�v�;w��u��Q��]���������H}��ZF�<����e�+�T�R�];;�T�����O�� 
�m����[�<����k����U���EG����*Xko��*�	hv'�wt�����%�W�����6��������nn����~�+�}j����){u
P��2�k���}}}
+�����2��Z��*�60�����[����F;u!^�B�uJHH��E<D��������P/y�i��)Q��������Q���Ow�T�Saoo%��������4�4��'���3mI����_����k&6���"����~���HwLc�-��6����/�d��Q��
������xE�m��qdN�����V����jk;AAA������n����2/Y���6#-=U���	~Q��X���eC���������~9������Hc�������P�_^���|E�S4���}�n�%K2��_��U�����Y����u�]��%������������;v//���f��%K�����k�+����e�5�,)�L���P<���e��rAE��NH�|+i�)��c�t�>e[���TP)EW`�f��e)�a*o�d��f�����?���C������}��(�6��rT[R��.���&�S?�����t>��,��R�tB���~�O�J)��x�H�V��%2~��>��)���[_�oe��#�V�Z�����F�%u��^�xI.W�M��������~h{%f��SQ���'��L���9��fv'h�9����	���������(��w��|���D�~jfk�TP��qC�TU�����&
��zDD��\R���\�\9�n�:%{W�ZU�=m�4yT
���d����933���kVc-n����4���to����@\&-1)������.9�UBZ���u?:Y����_�z�����;SR��}
�;�x�����zi��61=����/���O�+Tw�_�/�T���C��kJ������E��-	���]���EI������o�!7lT����]��|||�4i���f��������m�B�<7v+��u?~|����f�*_>��u�q8r�h����\�:P8��g�/�Y���N
�h{O��n�51K�k{u%A/)^��uR2�~�����+
��������wn��D��Z��"I�k�?��<����F(�?�J�J��)p�rQ�TOL�X�1@���g�~��M�2e��qj��y����$�9X!99���c�����W/�uZdee���J,����g��������z���C5k�t�����T���L��4��.-���3�5�I8�h�+�QU1��
�#�-&�����<�&��5��xg�/ ��i�*`����?�u���jDEw5���(I����p���o��a������g�>\�;t�����^�z}��W���?p�@���%�}��7�������jv+���5l��E��7ovp�,����{���j�b���,X��U����+VL��<-[�G;F/��-���A��Hq��KOR�=�+J
!I����g����T*��auq���~�;�<�e���B^���"V�}IW4��b�-����k��t��,�l��r���I�n���O>1_nq��5�f����m��]S�L��=w���n��}%I���l��q��q��6m�2h���c�Z�;�[����-qw��1�dJ���i�����whh���_������������=����`nwg�q�s�/f���Q�?��M��W��8����s�V��?��:pBw�����7��3\�$% Y������]�#��9l���6%G�*��[7�t��|�SU�\9�)�����,�acY���#����[�_,���/��=�v.~��{�Z.�
X����&���I��/������x��q\����N^�K[��])�&����~��y�FE)�[��uI�D��`�C=�����qFFFrr�������.��_s��^?-}�R�H�p�����(����JL��O��:���|��njP�����������S���Ir���;v�2d��O>��.���G�r�BCC]��)kv�S����z<�R�{�Z�����?�-�����3G��y�U�>����������\��1�K�Msl��a������Zdee�'w
��I�������D�O	��u%\w5���.!
�������2�����M�1�E��������
W�N2�s�������_sq{�B�����'mI�����+��u�n}�R�������W\���P��]$I��$)������W�>}��%dFF�o��v����G��?*�?�=��K]';���m�jK���N�@a���$�z����TCy����N����yV�����5�����- �?���8]I7��
�:I�3�~��_~���w����w�������>������{�vqcp���]����
�GA�Tu������J2�s�
�dde]N8�-IL����+�:I������y�:u,%e���4iR�~������'��=�e+��+I��S��|/+q{�Ew��%��\I�x}����{�
�O�\�$322|}���7}||��<�k����u#I��r�J�Gt%W�?#,�z�N�w�u��_��MOO��e�����q��R~�����7��N����z��=/_��a���-[�1�����J��3gN��u]�@�:I����������r{�����0a��.W���Y�\��p�^RWR�OiP�=��Q��+)������8�
��|�����K���}{ddd|||��5�-����PV	�}u%���\�L:�\3����{Z��4I���t������z��',�U�Tqe���$Y�h���w���?�$	�������3gN�8�v���=��������?W'�e��/^���/Y��w�Q�H���vq{�ru��t�R��E�5k����Vr�B���k���Y^�j
p�qu���{����[��ov�]�O[W%���Z�~�p�M��I��G������������������W
%���?w��]9\�@�:I8p�\��_������{.n 
��$���?i����z���~sw[�jg�*�o�=������$)j��i��J�����
+tE>�����$�z��R�J���������������8�������dll������b��=z�:t���W'����x���UX~'	�Y�(I�w�}v�������_.hp�I�;�����%U+�}G���jns.J����C���������/W�\FF��S�bbbj��U�F
�4����y�g/kK�}c�s��sW{p�sQ��������o�����}�6l��deem���w����wMc����I2d�����|K��E���������	(�\�$:T������V���$����$�l������W�\Y�dI7��N��z��<y����%L���H�����l��g����z���������	|}}����{�nKa``��a��!7��N�^^^�����Q�"""��?���U�L����K��[�W'I���g�n�: ?��$�Yqw7��GW����P97���F�����'����/��9s�l��M�49rd���-������z���������m�N�0Aj�X��ElW������;���z��=i�$OOO��;v�x���}�����hg�u$I�:���)Rd���5j�8u��'�|"ar����%L�����d�N�:5l�����-��u��={$Z]��E�V��������Ly����[�n���-�_�j�?��k�.b$��$i�|��� )��'�PK�~��{��w��qj��;w�D�)S�6L���e��]�N�8q���V�iw�����m�&Y1  �Q�F���%K,I266VB�����6mz�z��(IJ�����#�<�������'��C=d)�W����dd�zw���r���_�T�'8j�()�6m����y�v�]A�t�J������M�,5����;~���x���&N~���0m��n)�[�]������'m��-y�gM>����N\�$?����u��DI�v���w����%@�%�.]JHHP�BJJ�����5kV�X1�R���E�"""�U�fX��E*T�`�Bff���d���,�D����.�`���W`]E9u������%���j��%������$�\sWcn+�j��a�����n��M�>�V�Zg��9rd���G�-�FFFJ��R��a)�$<<��$�.���n�B��5��/K4h 7$[V�\Yn$%%������C2g�����Y�������O�:����@�#iXW�v�_��s�������J�*���O����NHH��%J�j����������]�n��M�6�={�O<q�����7�myH��,+�w��+W�\�dIjj�d���KKI>��\�$���������#��5������O=�TVV���3�W�����n�z���O>�dnKI}Es�#�.��0w��N�:�*UJn���=z���o��3�/_�l������i�F��������I2..n���mk��u'/%
}��rb�W��s���R���$�J���)YWVn����%��i���&&&���ll��������h��
����'��Z��d�%KZ���{�Z���eE�b���������?�.e�X�t�a����@{�5��#9%Y��������p��YC����3n:6.D_"���\������8_sk���������qc���[{1!���"���2v����'�Vf��.��mzF��~�+�`l�i��\���W�����$CK�D_�K�� �(P�i��������EL�5�Vv�I���i���Wk�������0n�bbb�r��E�j�T��d�[4���q{����y�n��%���(LL1g}�V�S������'�#�V���:))��a*[1�����H��t�n�vY���;ncL���+WJ��gw�&8�Z��5|��m||�~�/�5�������E��6��Z����C����f����K�}k�����;r��j�C��
2��Z'�d�i����(C�+b�`	�Yl8�}�tB��l7��1d�>Y�[�������5�)��Pr��!_/]��7mw�d��g��S�~�:4}��Z��'��@�O)Vv���OR�P��	��{��Z��a�$��b����>��6�\�$?�a����
�>}�\�t���#����_���{z���X{��%��vqd��5�������?88X�}��m���$p�k�H�S���T���,X���f�"��G�[}�2���C�e���M|���Y�-����~%{\x��	��UI�s��
#��W��foo%��|4�w���lPp��{�Stm+Y����h�����V6���6H9�[�d��0Z�Z����w�����}�J�&��Z�%d�6m��mu�]�����fw�~G(���Z�G������.V�X�f�k����P���[v^����m(00�����X�\m`@@�����`�'g@`�a���[����F;u!^����%��WC��c� �KS��$��P	4��F��n�t�JE?6�[o//�JM;
��
*U��-��x�,�������a��HmIi�]g��HW$�������K>&���>���a��mZ���<R�~o/���y���������������
FAAA�n9|u���n���J��
9o��������
3M��m��E����0.1E�wD�Z��6�X������2$TG�����(�9_�������(�
�,i��Kk/���l�������y�eaw���h�9�Q=�-�;n�K�4L	���!��-YR��n�\Z������q+�������b�:��O���v����dY�ym���a�b��f����VWW4��q����~�w�A�~���	���:���U�R��-�#6)u��~El���q+��W�����`���0n���y�d���!iL�E�?q��-n����u�V�z��2e�WJ����;}�Q��"��V�
�5|&�x{��\������1dw�������P ����Z��td�$u���@v'�������a�$�4%S3!)��!����<V�.IJ6��m^�r���]�v���#�����,Y�����U�����������Oh�:e�g{�r��9�N��U����M�&��CA�o�L%-�����v���X���$y�}�u���e���(,�����ojj���O�&M��������f��m������,��:�?>v��Y�f�/_^���Y���E�5��
��3�XQ�L�j��������c�j�Rcbb�o�����=����={���o��)���S+��7/**J��zW��,.��W����]�n�������x�o��jIPPPHH�lQ�{����5k:��MpI�����w��I��F�5��;7����/��;W=R�W�^_}�����8��qc�p�|�M����~�mu
aaa
6l�����������`!���{����Y�{��,h��Ubb��+&O�|��	�m�EI�_�~�Wy7�g�}��_~�����g�����,Y�����5kV������>>>7n7n���M�6���4h�����[�]��uFGG:t��1�dJ���o����;44t���+��EI��O?u��
��9lT��7%��G���k>��E� ��+g>���s���9l,���$�|�rG��,�����QN��+�L��*�[���d��]�F��9�\R���/��zM�"%�����5�h.J�|�x����-ZWR�W�+�=��O\��Pj�]I�`�$p�rQ������r����z������x���i ?\�$W�Ze�����7o�|��w��=�<s���s�������<>>~��-�z�z���~��G���u1�����iK��?��j���p��'Y�d�:������n\����}6B[�W�$I�)�(I~����<���
�����sMc���$��o����f����g?���i ?�t��a�f��Y�|��S���-���$[�l)1�g���K�vw[��-I���9r��;�l��]�8�mI���S
6�����}�Yw���?�ps!I�C�8�mI�R�J{���Q�����%��E��w�}��: �\�$�]�6e��-[����dff=v����p�����!C���[�z����{zz�x���su����������k��x�����$�����x����$��A����B�
.�.���:I��9��7����O�����M
�����1c.\���A�2e����=|����p���dBBB��+U����
������;]�E@�ru��8y���s�<<<*T�P�bEw5�,7$��7���S���5kN�<�C��o�Y�N�K�,���o�
^|�����gee�9sf��u�:u��m��uq{�r�U@$4�\�����R8i�$��'N$I@���$y���	&hc����


������W'I��iii�r	�YYY.n \�$�����'�<��S-��-���S�~}7��N������c��u%LV�X1%%���3�}�]TT��u�\�@�:Iv������9r����-��j��0��v�����Iv����Q�R�
*����qC�TU�������I���kS�L��eKLLLff���c����=g�:I2d�����W/_����������7N�8q���>>>�7~���{�1��qqqc��]�zutttppp��m'L�P�lY+����
��������s���_���'M�d���;?~|��}���	���I�����3g�k�������W_}���/�u�]o��FJJ��m�����[z�!y499�y����:u���a�'N,Z�H��g�$@�+����
}�������)I��[�n���-�_�j�?��k�.b$���I266��g�u�F����Kw%������������7h�`��%j��;w�D�)S�6L]Drf��]'N��=-���ElW�����m�d����F��C�K���8p�����6mz#;\�$%�������d��/NHH�4i�#E�j����<<<��K�.������-�t��e��QR>m�4K5-����)%�*UR��6m��2d�������� �N�3g�|��7?�������x�N��y��-Z���%K���C����f��+VL��#�<�h��������]D���
�	�,m���������^�p�K??��������1c.\���A�2e����=|������#G�H<t���A�~��7�mU�Ty���{��-�FFFJ�3_�D-	7'I�������P�fM�q��I�=�!��r��r#)))44�G��9����f�OO���~�����n���[���FBBB��-�hZ�/_��m������o�=m��>}����0@��<Z�D	�R����7>>��B���� ��i���g�~��'$�n��Yn�C�G��e�O�>b���+W.Y�$55U�]�ti))��=W'��;w�x�y���)����^RK:u�t��w���{���JnKeee)�Pawm��s�J3J�*%�_x��=z���o����/

Z�lY���%���]�v]�x�9I������#�m�[����dCaLL�����������Y+1������+��C��z�����Z+==M{^���D���1�M���l(�nm�1��+]�-��O�i��
�jK��%==]{���D�����`�[ck�����K�+�V+�`X$6.6��j�/YrJ��s�;���#�����n	;g�tl��Hi���R5�������[��n>.6����������	i������S����>�����0C�\�p�P�0n�32���^�ckM�6F�2�m�6))���=�W��i$�3
��m���32t�-gSkM���F���y����������|���3�[3���������^��/���h��C���%C����eK���Q���a\��q[�NC���3�(��[y����$k��l��3�F�#!{�!�f�e�.���5�'H�r���6�������c�<n���;~Y�q$��mv'/z}�����>�2����5���__b�#������;r��j�C��
2��Z'�d� 3C�DFF��_S�H��b�)�c���e�1��!��O���4}2o����<J�����4��uh�dm���O�=p�L�R����O����$�<�����2+���I�i�4�YA}�m�q��u~~~2�:w�l))_�|��������G�(���j�����EYg�F����eO���,-���o�v�������Z�Nu���k/X�@���� ��o�)�(��E\T���KFUN�j�D���d��Q��-?�����������gh���������GI�>��]�n'$m��=����)'�5���{
-�/���I���-gtK���F�[���z�n���Z���T� ��:�o���i�������v���f��	�]`@�d+�j�=������X�bi�]�����B�
�n�ya��W����C�gbms��)�&�5|r��7c	��o�S��/��[�5���0�����4��P�>1�@SKj��a��Ow�T�Sa�����2�$���0���R��"����r}}}
-���������N���s���H��U�����|L��	0|��m��
���5�wy��	��^�O��5��KE+'
�M�M�df���Ww)���[*��������������-]�0�4��-Z�
���S�yGt��>n#�ul�[oo/CBud�~}x����-ZL������p�������~���
{9�����Yvv���c(��������/Y�0%td�>����dI�f��kppi��������tBJ�������?�Ng�S�����qk&/Y�r^["}k�����Y�f5����:d���s����{����dw�b���q�zU�T1t���M�A���_[}`e��g�U��,(8��v6�[��1�����1t��OS�~�D�^X��'���!��h%��Z�g���wJ���M�LCv�O9;���
2}**���IG�OR���	dw��yNHHH�O�OS25����[C��3��uw�y��<==���;j��%�<""����<%���B���^�\�r������j����i�����PP�[&SI�!y3gff^�v�j��� IZ��C�����������-�'Nd���|��>>>M�4�
������222�m�&�Q=��#�8������;v��Y����ug9Gn-Z���7�?��u={��3g���#��G�dR�w���~��N�:�W�R�_�~S�L7n����y����$��w����;���_�zu�:m/b��EVVVhh�<��o_�$((($$D���=t�P��5���&8�EI2%%������S�����p5j��[oM�>�i������|��W_}�����.U���KJ�������K����o������o����6l��E���7;���
�����{����=��{��j�*11q���'O��}�v��$�d����~���w���������5k����O$O+V�Y�f�G���*�x���������i�&y��
;v���vqp����C�3f���Acbb��o���:`�������$����~�z���'N�OS��[���r������[	xSrX}T��z�q��(W�����J��v���,����d�V�>�!����00G/@a��$�l���������9rd���/(�\�$�)��C����_�����7W_d��m���'O�;w����B�
|E	77\Or�����;u����f���'OV��r�N�K�,���o�
^|�����gee�9sf��u�:u��m��uq{�ru��9s����+WzxxX
'M�$r���$I(�\�$�92a�m�^^^���=z�pqcy��$)2--�\.a��I�M��I�^�z�|��SO=%��R(�r��9���wqcy��$9|���;��[W�d��SRR��9��w�EEE�[��������d������#GN�>�RX�V-	��nn
n��d����QQQ�*U�P�����7$IU���: ���$7)�$�9$I�sH���3I8p��������+Wn������p�{�������}����H�"������w�}��%K���>���8�$�����?���m[��e����O���O�����-�8�EI���>8p����z7,,l���j�!!!���3g�k�%�i��}��W�}�Y�F������8l��J�*yzz�9sf���<��k�%��G��5��|��W��/�����{���-Z�h���_��1��pQ�,Q���~��{�~����SG�����/_�Y�H�
*�*U�5-��K����q���w��3G"e�-$O��n"�>w�������;u�������Sg����3�
?�&�����g�feeU�Pa���k��4h��L<���EI���8p����%F�%��7����9����?��C?~|�%\�@��(Iv������8qb�r�233��9����?���aaa��O�GCCC���s��)���g.J�w��m�[�R�&M�/^�����K�n�����������1��pQ��P���n���]	��������xzz4�5��������N�:
8�X�bYYY)))U�TY�t)gm�����d�������������b���5���t���uW��x_�mp#��z��[I��$�9$I�sH���$�!I:�����9sf�>}���o)���;v������������m;a���e��X��ElW������;���z��=i�$�59;v�x���}�����h�u$I����;k�,Carrr���%�u���a��'N�X�h���[���#	��z�.b��DY///	���c�=V�n����[��j��~�a��]�H7I�����W^y��{�9x���|�����L�2l�0��e��]�v�8q��������"�+DEEm��M�b@@@�F���%K�X�dll�����i��`A��C"�d�
6�j�J[�t�R��_�R��K�Q�FI��i�<<<������
���RR�R%�!��i�&K�!C�����?���7��$i��'��;p�@�})))���o��Y�b����<���E�"""�U�fX��E*T�`�Bff���d���,�D����.�`���W�l!I���_���K���������HIqU�T1�WK����I��"�	�j��)7N�<��A�!��r��r#)))44�G��9����f�OO���~�������
I#W_~���-[��][�D���X�C			�W�
��������x���.b�����M���=��'�8r�������<4z�hYv���#F�X�r��%KRSS�u�&XJ��� 7$I�.\����o������s|���,Esj�,��0w��N�:�*UJnK�z���o��3f,_�<((h��e���o���<��k�����d\\��;r���u�N^J6���J._�	.�+����J�\�b(9t����:m����������MLL4�s����������a��������Vk������[_e_���;p9��}kl��w)��j������[��%KNIV|�wgr�q$�={��-aa�������Hk�5��1�66.���Z�w�q����7+z���L-1."�
.c���y�}bo�aaa�n�����a��gdx����	����m��e�+�hmRR��%{"���%�H�g�?���Ygd��[�"���V����$C��w���5�[�����}g�f�3t��cM��RU_��o��K����K�:�q�e�����01%��Z�����:����g>Q��7�III�S��af���GB��Ct#����]��qk��O�R�t%v�m��5�[���y���'�w��Z�H0���N(^��j�M�5}:dl��qk&/�����G�qC��o?v�����?���d\��N��\!22��-��Q�:�W�T�8���p����2w�n��c�����c�M����;}2�R�3��)M?t�>Y[����y\ ��+;v��'�c(�����kn��
�0}�}Z1�kVPC�q�$I�,���>��h@@�b������:��#�l��Qxx��I�������-��o_���;w�����:u��K��]{��iii�+��zr��2���C�e����Q��������-)Y�d�E�,D����a���a�z���6b�|E�k���QR��Gs~���I��o����s�	Ck�oG=�^CK����l��B�t��R%�w����z��^�[���V��+U*H7���[�%d�6m��mu�]�����fw�~G(���Z�G������.V�X�f�k����P���[v^����m(00�����X�\m`@@�~�Ik
������Z�n]������x��c���_
�o#�u�/�4/M�>T�OC%���5j����+�T�0n���+	4�4��6�T)C�Hk�5�\___CK<v�)k#�%���o��g�+�g}U�i��%��E���q��a�6-t��]�h������<n�o�RAA��ICk�tS#������]�o���
*�7���2�$;4nK�6�4���E�eC�����e��j���Hc�������P�_^���|E�S�����7\��q�.�����i�^N����u�]��qk���9�-�;n�K�4L	���!��-YR��n�\Z������q+���u����(����Y��m�ajw���K�����H�v,�ni��Y�juuE������7�q���'8�����c\�^�*U��>b�rP���W�VX��Y|U�.
6��
�V1}96}2~������_)Q����IF��o��6Z	7���������r��C�'�����S�����B�L���j�c�����9���`s��������L����>�,��n��$i��
�/_>u�TIbg�d�5�]�vM����}����������Oh�:�.R�\9G����Q�jU���i��Qu(��-�������333��Vc-�I��-[���a9��_�x��w&O���I�?��3������YFF��m�$1�'�1������S�<~����cg��U�|y���ug9Gn-Z���7�?��}��y����%���t���e�A��_����_�~S�L7n�Zg��yQQQ�������������^��Zbw�,���BCCx���}��%AAA!!!�E���C�j����/6�A$I+j�����+�T���@�^�z}��W���?p�@���%�}��7�������
aaa
6l������\�n���������������{��j�Jr��+&O�\�]$�<�����q��q�$�m��)$$d��Ac��5�@��E\gtt���C��c�A�D�������{{{���0�F<q I:$00P����)9�.R�n]gq��(W�����J��v���,�I��$�9$I�sH���$�!I�C�8�$	pI��$�9$I�sH���$�!I�C�8�$	pI��$�9$I�sH���$�!I�C�8�$	pI��$�9$I�sH���$�!I�C�8�$	pI��$�9$I�sH���$�!I�C�8�$	pI��d�.]�4i�����GFF���4n�x��1����T���;v������������m;a���e��X��ElW������;���z��-�������c������o���O�v\G��������DDD�v��{���'O._�|��u[�n}����Brrr���%�u���a��'N�X�h�<�g�I�V�iw�������%!Sz��������{w��W�Z��?����	��"IZ7f������?���W_UK:v���C�>�`���rw�����L�2l�0�B��-�v�:q�����[]��ElW�����m�d����F��CK�,�$�����<�i��7�W I�:�V�Z���ZJ�y�����9rD��t�R��_�R�K�.�F���i��yxx��iw�"##��R�J�Crc��M��C����?~|�<�I��3fJRSS���J�.-�SRR�����Y�b��i�<��#�-����V��aq��T�P�v���L�k��YYYj�����.\(����/���!I:j��y�$_z�%�))�J�*�:jIxx�9I�]$==�v��5k���'O6h�@nH��\���HJJ


����d�����Y���������:u��7�/��G�p�����������kr7!!A��(Q�P���_������`w�$76m�t���O<���#G6o�,�����G����O1b���+�,Y�����[���KKI<y�#I����_����^�zk��-R����YYY��TG�]D[a����:u*U���~��z���o��3f,_�<((h��e���o���<��k�����d\\��;r���u�N^J6���J._�	.�+����J�\�b(9t����:m����������MLL4�s����������a��������Vk������[����w�]K����	��5���?����ic��	�Eb�b�����%�$+>��39�8��=k����s�M����K����K��W�kn������X�R7n,V�zk/&��Zb\DV\�NC�����j����r��C��M�����{���5��y��W�����$CK�D_�K�� �(P�i��������EL�5�v���I���i���Wk�������0n�df��c�.�V{���${�����K�u��v��-��GabJ�q�V�me;u�KO�0|�82n�
n����������1���M��F�a�%�����1$� ���J���Zk���!����O���e���`���P������Zk�:t��Z���L^2}���x���o�~��I�5��7��Zk�`��Bdd��["#�u�����q$�g����1�	e������c�'���
�>�7mw�d��g��S�~�:4}��Z��'��@�O)Vv���OR�P��	��{��Z��a�$��b����>��6�H��H�3f��q��z�)Ik�/k��D}���"���Q�F����'�����D��}��k��sg�k�H�S���T���,X���f�"��G�[}�2���C�e����Q��������-)Y�d�E�,D����a���a-�����X;_�����}���������v�A�6��38(��r��Z��QO������+�t�,�rF�T��a��������/.����J�
�M����x	��M�>�@[�j��h&������J�2�V��#����>��-����~�+*T�`����){u
0��!�6W��a�Z�'g@`�a���[����F;u!^����%��WC��c� �KS�U��P	4��F��n�t�JE?6�[o//�JM;
��
*U��-��x�,�������a��HmIi���9����Y_�|�zy��D�~��g�y�6l��M]c|�G*����e��1�[���TPP�r���4�T�H�`�n9|u���n���J��
9o��������
3M��m��E����0.1E�wD�Z��6�X������2$TG�����(�9_�������(�
�,i��Kk/���l�������y�eaw��?�r>ANjK��[��%
SBG���c�<nK��h����V.��k�i�J'�d]�k�)��c�t�>e�n���f��e)��%�����[�5kV�Z]]��C���;7��k��)�	Nv'(��W�W�JC������m;���V��|_������
og��ULC�M��C7h�4e�WJ����;}�Q��"��V�
�5|&�x{��\������1dw�������P ����Z��td�$u���@v'����������>�s}������ZZjW�SJ���joQ�%���jMbkZk��E��Rm���T���_m�ZBJE�Thl����s�����3'��������g��s�<��w��}���4L�$�)��������M3*�G�2R�����><""�����"�Lz�����V�2O1������J����y�l���-[V�-Q��jWP�-����������o��m������|$) ���5k��Q������[����G~<����=x�`���R1��I�*�����3������+Q����������9r��}�
��J��M�6}��#F��-#U�{�0`@xxxXX���d����/Ku���{���S������+��*���������A�}��U[
*���/[T��<y�B�
���	N���o��1����c���z��w�)X�`�>}V�Z5e��'N��][J�u����Qc����bg���Y�f�-v����h�������K>��O?Y��={�\�lY�V���_��{������}��=�f��y�l
�J���w��aaaR��������������_7�\������=ztHH��2����k�����O����lPI�����cR����}�Z�j�O�xg������b���r�� =�$�PI����C%	��J��$@*I�>T�}�$�PI����C%	��J��$@*I�>T�}�$�PI����C%	��J��$@*I�>T�}�$�PI����C%	��J��$@*I�>T�}�$�PI����C%	��J��$@*I�>T�}�$�PI�]|||hh��M�bcc.8u��b���g�DGG0������'��o�9c�///�������3g�;�����]�J2������ys��:u�T�f�s���X���o�9r��T�i[Es��� ooo)2��&M�T�V�g������q���~��!�H.E%�F�/��/<<|��1jK��-�u�6}����g�m�\�|y���R+����V�Z�Pdd����q���!C�
V�^=��9���d�^��������2�t��u��	��-[�4��x���i)]�������s�y�Q�F���k��)��`�J2-���w����M�������q��+V�8���O?�w��%K:^ 99Y��k����E���g���RX���'c�lQI�ELL�Tqe���jW[���m+I�U���/P�B�q������!���O>)7������^�zI���_xyy���k3g������xTiq��-��7o^�v???�{���4����������?~�f����v��-�����'���g�7n��
"##�����G�"E�HKF�.�B%��RRR��f�*�,^��S�N��]�t�����c�����v��B�
�Y�&88���^�G�u��r�J�J2>>��o�}���l�"�|��u{�f�������
u�)u�S�������%�]?��#?����W�)J�_U��,�~��
=��Hu��R�C�T-���H�J�V$�l�y���]G��@���v���a���y���
�������`����yS�����L�4A)k�J�v��jZ�����a�A���40�:������*v�������~�������e��nl���N}X�_/�����*�E��Z���J
��\?Wp�T�8�oS�����O�}��!��G���D���f�R-q�:��y��c�6����a)]�A�����u0�Z�B��*�/�~J�~�S���[��s�����g����H�7��ooJ}Xl���?��(?Y�h��d9,},\�o�U��V-U0;�Y�O{������V��N�o�:�D�E:Y�_��*����H������[�aH��z��[�~{e�����Y�T:����RDk:uA�Y��9AZ������N����Z����9>��f�b�v�}xXR����_���e�m�uj���6����O�4/(�,[��R���R��������OGb;}��pj�8����������SWM��+���^%v��s�o��=���t��L����+���QmQ���3�Y�V������??���'%%����M�6�;w����z�j�*U��*W��l����D�_���������G=d0��D��`<'���!�<'��D��`��.�	�s"Q<)"��s���HO
�s"Q<)�����J2-��)���s��y�v)��o�����J����y�l���-[V�!��]!!!A����K}HJ������o�-k =�$�����n��G����|�����W*F�B8iXE�s�9s&44t��y%J<������eK�F�9�����;��G%�F�{�0`@xxxXX���d����/Ku���{���S������+��*���������A�}��U[
*���/[T��<y�B�
���	N��L�>}��Z�j��)'N��]���p����Q����#���=[�f�-Z�����U40[�t������'�Z�g����-k��UBB�����{�=��#*�4�����cGXX�{;w����:thhh����iX������=ztHH��2����k�����O���L}
(� T�i'^���G�U�������8��(^���7l�s����D;tH*I�>T���}��"Q<)��D��`��.�	�s"Q<)"��s���HO
�H���`<'�����HO
&�"���C%	��J��$@*I�>T�}�$�PI���D�HLL�4i���3k�����?�+������1c��m111����k�		�^����DGGO�6m��}���{������7a��j����#F��;7((h���o��O>����m��)S���j����O?~��������'6i���r��y��=��?�l�����\�pA�����/]�T�X��u��?�F���F"�����J^��"��������3f��sZ|||hh��M�bcc.8u�T9\�G���cdv����S��� �3��112�:������~5�1&k�
���3��|����x�$����������3�
��?��_����6m��������]�e��o���Q�FFFr���^x�������Z�r���=�~����7����a��FFbE���y����7n��n��=�������U�V����<���o�-3	���eK�-�=���a�=ZF&��u��]�r%_�|FF"N�<)�#{��C�)_��o���h�"�����y��FF"/d����Z^�R9rd��9�9��;]�u�9����r4�;��S'�L�;wn���s$H���3���q$g`�O��3��H���������8#3��HN���1,k�
���3��|����x�$�^7o��]�v��U�u���s		���^�p��A����;v��a��i��m32�1c�$$$������d@	f��_|����XJJJ�������~��-���#F��S�-X�~�����eX:p�@����%888   22��Jr��)V-��5k���S*dd$B^,�n����Y�fj�+���������\I�7N����K������c������G���h�����C������}����g�62#�����������?�������5#12�jcX�������aX3o�o5#12�j�93^*I������e�6�?
�Z�j��sK�v�d����28��
��_���:m������?op$�$��f���r���:�)P��[�ne���2fK�U�1���������-�{����+V5j��[�p������U�^���/&&��Hd,,Y���o�in������W�Z��JR3��^�Z��[o�en�����	�="""��f$F�_�m��5#12;
\��5#1,kFbd���q]�������aX3o�o5#12�j�93^*I�W�B�����(�3g�U�����)bp$S�N�j�x��DR�\9�#1;w�\hh��!C�����,�1W�^��h���
f����r�j�����g�/_>���b�������]����L���>|��i�w-�_�.s���FBB���7,�������;v�����������&]����M�6��3�e��+VH�"sbc"qf���-�2�f$Ff`'O�X3�2�f$F�_���e`�H�L���12;�F�[�fd���sf�T����,Y"������1I�G�9rd��y����0 �e��iIII��!>>^������/���SL�C���G��%[?y����C<���R�L�I�&Y�k<�����/���[3f��������=�R�J�.]�N�;w���'��2}||de�.�elll�R����RLLLrr���v�%:::g6���l�3�����!�Wqw���������4�qW�T������7z���
<�]1(P@��u��~������%�O>��������/e.��-�����Y#����z����,���gBB�L���?���/����o����AAA���8p������3G�RXX���\���:w����Cm)]���]����od^^^u��=|���5�o��?^J������[�n�_y)Y���4���
1y$2���g�_���C����l�7��o=!�9����D��������G2����gwW2(^�v��_]�v���W�Xa��W\�zu���]�ti������2q��!C��j��<*t���v�����n���s��ad0���111����7�:u�T�bE	�_�~>>n��w����]�F����u������_~9%%e�������|����[�n�i�&���3fL���k's;�"%����OFGG�U�$M�z��=��l�����s�����|�pu����d0���JY��������0��2{�}+�H3f�Po���_�����s�W�l
6L��|`�F����\�*Ue��Q�n��F�'O������;�[J�(!��_����n�
�
6���Y~��xAAA��_���2�N����.��h���!�}�������w�U��������G%�/ik)�����������
���_�2���_�����a|�����'DK%�,E^T}��]�|����#""�����4i�D��7�>}�r���mw����\f�����x��%�������r7��a����������O=���'�z���q��_�^��n��9�j���������IKdd����j�o��!�z����������V�Z��wo�V�L����K������l�l��_������b`v�7����4���h�$����I^T�f�r�/(��\���u�5j�X���]�0FBB���|�����c*�bR}j��;����{�D"���U�d�d�up������w���{����2FZ~���s���q��QL���g���n��;w�(����j�Y�b�.���<x�@�H�wcbbd���gO������[�n]�<�Z��'��(����W���o�?n��V��vyZ�U< {Z�U�������2���xH�T��:6m����1��/�b�����v�����/�~������*o��U�V52����^x��E�q��][�l9t�P#��$w����O���0��[����_Z���R���,X0~�x�A����?��k��*U��-[��`��?�,3w}�KU�hQ9��?u�T�J��F9e�������]W&�s��������%''��)���L��yn�2��%K._������l�l���_�2�G�_����7������s���DzI���}�z;))���;v�zw����6,�M_��������G}$����S�N26�1��a�L ����+W.��PL����(�z����K�//�y������
4���K��%���$����������j��%)x���2��C����Z����[����(����u�,�L�t����4���+K�.���x�b���r�=z�\S^G�z��4���_9rD�L.c������#�e��)'N��]������[W�F��#G���Ws[�e`�H�����12k�2�f$F�_'_#d`�H�L�����5��a�V3#��f0�3���Dz:t(<<�|Wr��n��}��$����`i���e#_W��5���f������o��1w��2x6��W^1,��C��{���5k��W�^-R�����>q��
*�%�D6�h�"�e�n����������J�,���4��}��������e\\��S�NyMI���w��)5�L�eRd��5s��������0��������������W�Ebd����aX3#3���������9&��_'O�X3#��f0�e`��aX������f0�3���Dz�5qw�_��5k����O��
p��jl���[��-[w�� wG�P#wG�P��
ea�v��i2�	7qo$F�_�m�X��k�2��S���L$�d`g"1,�:y����DbX�u&c2�3/c��f$F�[�`<g�K%	��J��$@*I�>T�}�$�PI����C%	��J��$@*I�>T�}�$�PI����C%	��J��$@*I�>T�}�$�PI����C%	��J��$@*I�>T�}�$�PI����C%	��J��$@*I�>T���v��n�����b��9����K�*�kE C<������N�:������Y�f��	�/_6lXxx�Kcs����<��_y�N�cH�)����mBC%�L   ���9r�0lE �����������3g������k�;����Y�D?n�9e>>><Po�?~���r���S�+Wn����;���Q�f����I5jt��EX���q_s��2?��o�"~V�cM���4��v�WSn��Xf��Jn�}����V~m���o1��C�����^�qf����y�h��-Wf����;w���^�z��t�������-���|��V�2~��}d��Y����e�e�e��P�=����':���x���?q����3�������S6l�0�$O�>�}��G-��I���$�����?��s��!���j��O?��+T�0���������e��S�	�U��Wnj,���}LNN�q({���}"����x�I�V�-C��l���;w�������.9�A�=��w7�oWl�����7��i[=�:�#<HL�����I�}����#����HJV�&i/�
�h]2p���}��_�����mc:O����l\�v��J�����������5kV��9]`�$2������c������O��r���W��)S&88x��a��eK��W�\	

��u����Q�F����[��1��`�2T�l�Rvg��5��w���o����w�����>���?&N��������_O=���������t��a��k�����k�C!��{����7/22���2T�*={�9r�����f�Cw��m����(???�����jw���uk9�r#�d��~������			�������*
6�0aB�z��'�{B��?v�Xy4!!!  `���+W~��w�`��u�F�r�
�!G�q��
'Zk3u�e���i�F�]"/P���������-Z���wi<����D&�~��{��2n-_�\o�j><_�|o��fzV��J���eH<xp�J�.]��h�"�v����IW����������%��mY~�����o��e�+���m���Ld��q���3
�����_?y({��)))�F���2�W�XQe�����_�uu���o��12�����!�dw�Y�L�%0�������W�ZN��6y���M��7N��2����r��E�1�<x���U�V={�����y9G�Wy�	5�g�}v��M'N��9e�N������O�]�6::�������<����#�(Y��+�h'�1��p��S@��D�������2��-���~�iDOM4W�4i����~��a�{�=z��]�#G��n�T�[�5k��;d�=y�dRR���*T�6m����*UJ}o[4k��t��2�2���766V�^������k�����������2l_�p����o\<��+�9�m�A�:���y�:s��,�]�,���e�L�+\fu�~��y���Z�%%�y������L�8Q&��}���Efl�j�=z�z1L�'T=J%K�T;�L�������7��T�Y�����cr[���Q#���wd�������G�3rxF�{�(T���,g!2���3�i�\q��
�*U�!���+j����s�=�s�����)R$���Cs�2�/_��E�3f�HHH��8�+W.�'�����v��7n,�_�xQ�gu��������d��1��?�x���\S����x����G&
�-�L���������;���krr��}�$u����y:���RRR�`��U�����g��_�����U��PU�������/o����d�#C�N������T�����)cy7G�����Y1666��x���k���o.��8��f��
8���������#-�1�
*X�Uw6&&FFe��j�0~����GW�X�M�62��j��D��_��)����[�J���
j���o������������l���;����lT?xf^@ol2����]���7��ie}��Y�*V'Tey.���c����Y�������>f�1��PI"SJ��=�bBB�b�A�3f�>��kj;�����E��
�Ho)o���w����������/�5jT�5�	7o��z�j����<�|�=l���+�Z��/������yY���0�����9s�g�i�M]E��ZR[������:�*�W�[�����Q8�J&��@%	<�������Z�n��[ONN2d�O<!K4h��}Vo`�S�G�N,��������y������?���K/O���o�scwU'�w���
�[�n����m��:���.���>�����������A����Q�����D%	<$C]�"E��9W�P!s��k��-�![�3g��C���]+��>}���7o��a��s���J�*���*��i c�&9r�X�p�������b����f87v�b����;w��e�L���<�,%�'���/��"w-?7��82�qo��D+�p�?~-��.��y-Z��DvGm�������XT�������/�?������k8m	�m�����&M
�����]�r��q�����H�.]��m[��2������V���+�<xP6:c�����<3<n�����]�X=��s{����������0�[���l��:tP[�;v��������8��������"������_����������y�,����5kV�&M�PHi)����.���			��ukXX��K�$�_�|��?��������'''���[��'B�1�O�>���7_����;�Z������������8q��Gm�N�:�����RRR�=�b�
��]��J��lv7v�1c�������_.Y���;���+�6=���o��g����W�R%::������7��9s\�;(��%N��	sx�k�����o����i�r����_�8q"����9;�<RCn��Mv�^�z�~���:t�\���c�J�90���d��?Oc�������a�l�"�S�B��������6h�@����Y�Er��������;���C2�0_��B�
����4i��6F��6�P�p���S�^�~�\�r�|���f�]��g��g����e6�f�oooy�)S����[�~=�;�R���B������I��]KxfY��/��e�'�^z��O?�T&Or�d���+���=[����C�!�%J�*�'O^�l��k�d�_|QNw������T���c��;^�'��/ee�#�92$]�{B���aX{	��d�>|���AS/�3gng��e���qDD�T���������>�T���oK��H*;�y�fy�b���a4�O/���$a�|��X%�5Qo/5�Z���v���b���"����P��i^���G�X5N4�l��+��&��`w��-:�$�!gS���uJf��^����H���bb���o�9[���m��/]������= ��!&�-}M��vy���*��I����S�h�Pt'Z��9<g���/
+�=e�M,[,+�Q��V���#L�>*��������.`<*I�>T�}�$�PIY���`d=���@VB�*I�>T�}�$�PI�������T)�����IEND�B`�
bench2-50gb-duration.pngimage/png; name=bench2-50gb-duration.pngDownload
�PNG


IHDR���@��	pHYs'#R�"}�;IDATx���	|
�����H�!E[�Z�Xk-�%�����[�������JlMK�R�Uj���S]Pk�K�%�� $��?���q���dr������{���9w������s�RSSM��)�;x�6�#m�G����	�i�?�&@�M��H���6�#m�G����	�i�?�&@�M��H���6�#m�G����	�i�?�&@�M��H���6�#m�G����	�i�?�&@�M��H���6�Djj�c�=v����/zyy�vwr��f�������Y�&����m�������'w��qqq�����6@�+W�����h��>>>�5���s�&Ml�Q.\�d��O=�T���;v��������5k���6vi���m��������3f�X�v�t#11QbU�
�z��g�}����������M]�|�K/����������?~<..�T�R������g:����,X�i�����K��8���V�|��
v���Y�fg�������W�\���%j�=�M�M���,�<����J�k�����KF����V�ju����7n�������R�@�����/_>���8%%E���+��vx������������
�`v.��+�2m�4��_�~]]]]3�]yQ�s��m�����?��������={��o���)�N&���t�R�������H�3g�l����3]�-�*	���|t{���?���k�����_!rX�� Ol|O#m�n�~��3f���7o���w��e�����Y�n���W?��3VgLHH8|�������u��I�������4��+	O�8Q�r�,�V�[��%j>��S�������� Q��������>������������]R��@y�}�vY��u���{5===����^xA���K�,����_>u��c�=�6���OG�!O��)3t�P�����wrr�Y$�6n�(��U�V���,U6nL�����uk[����Y������on�`�&�77�g�8�C����]�t9x�`�r�,�X�@�������Y�|��)K���/_�,�\�vm��%�J	x.�NJo��Gi366655U�xxxX^Qdd���/O�Q]������=z���#S�N����o��e��Q�DB�l��r�o]�H�z������Y^{�6f\\�e�w	4�'�Hnw�5�M�q��W�D���w��5	HJ������y������r�W����[����QS�?�-ZH�<s������(O2��U+$$$99�R�Jf�U:���o�������)Q3%%�b��R���ZC�9�����/�`y���n�m����{W���{�l��A:�o�>i_�\9	��G�������4m�t���������S�|�����f������W^ye��%j�d���g�X�����w��)^�x��
���������~k����w���O�>c���g���>����[�v��AV����z�Z�pa�f��o�n��JLL���������#���j���_W�$��Q�b�%����(QB^�{��'Pi��o|��w�s�����k<x�~w	�����^�:,,,>>^6`��u�������w��=�����&L�.]�z����U�V'N,_���M�i�P�JIV2�_�`�_|Q�pa[�R.U-[�lNt��4�NRr�Y
5�|iSZ)R�����kJ��8Ib�)��O!�F����{���>pss��L��)�(K��/m~���o���)��Z	H��O>�D���O?mJ�*lV;)���_Y��S�
(P�F
	��<$�0IkJ3%\I��z����J%m�]�����f�7���j�*y"�����Q#yQ�&M���_�|��l�]UH�$�KV���Z�j�����]�r��_-9S���__��l�2S�>#��9"�\�m���%d����>}zU�>}�HjUvo����n�����%^�z+W�,}

�@.o�,����,#m�A^~�eI����;v�h��������2��';v���i���(���-m��)C��g�~��W�����W����'aF�M�'N���v����^������F���m�Li	�K�.z���o��7��}i���K�LiJ�Q��t���^x��o�1�}���~���H���%���T�����%w��1CrW���M�w_(	��_{��������/^�A�2%j�,C��.|��5���=��+�~/��W_�����.t��A2XV_��~]U*�uI�|��,X���T���;?����D��|���{�����9z�h7LNHH�W'QS�O?�T�T)�^:/��eJ~V��r-Y��}��
���%p�����My����{������
�&���WIV����I����?  @�����NKNN��$aY�t�U�Vo��������w���V��<���w��3g��1c�I>��|R*aF���[Y�%e�c�����L){S����'{��Z�jYh�x����8	N�g�Vo�[�LI���p���������K�j?���w���)S�|��'J�T���+��$Di/s���OPP�T��M��V����������}Q�K��U�z���(]�wG���+W����f���|��g�Rz�}��,�oKHH��w�����QS���s��m���N���M���*T������O��-%s���+{��"m�Ad���!!-::�l��i�*�+&�a��A�l}��m�O�LiW-��5K�f��k�R>��{���;vl��M(p��������&L������S��M�w9eF�Meo��eJ�XU===36KII�ue��Dd�[/�1�M��s�Y�qN�;���5sww��KF�Q����G��(#���-Z���#�/���D2����J�(��Kv2�g�~�$�J$����T�^�n���e���2���Z�j�:��e��>>>�-��R�I��E���e�����q�����
(i���S�e�j}����V�*i��x�@����}���/a���j���������>����<yr�?��5*?�������K���2,,L���5���&�<����+%BKRU/m���D	lA_�uggg�����LUB�����
Yl��Z�~����1��i���u�W��Y3{iS�s{��Q���%/Dy"yI�6���c��b���>�������?�i��_~�s��$�z��Y���U�z�L�����Tv�#G���������������U�BLi�?�$	������k�f��R�V���n���	QF������M�����'"Mi�b����������V�^��_Y���LIb<y������>?~�Y3����8�H�~��7�|�f�y��k��o��d���*���v��IMO?������x���ZJ��I��]>���l{��)Yw��-&����n�7I���0��|�{.����2�(����6/^,[��X�����&��q3N�z;(�2�jpp����cccp�
��LW��/��,V��.�dD���������T8;;7i�D2�����c�>����p��H�~���K8�s����
�)�#���W�f�R��^���%��B�x�|��f���x��y�Ze����l����g�b�kt������,]��h���)��f�9�����p��I6����:t(Y����W�\��G�W�6m��?�^�,/-'^���J�������]�v�F�z��'%�*�|�����Y]��Cr3j���:"m�A/^lJ���A�6�"1��^���y����T�lV�����6o��)��e��Y�]�F������>|��#V��)w�Q����?J��F�-�qc�r7Z���3�PN�1�-���+�Ghh��Dg�'''y'O�,�Z�fHH���w_~��L?�����l�c�o&����.!���o���fYT����*V��d�L;�|nl��L0i��u�V����}���������c��}���x�V��=��|�R!/GrQ�z�2^qz���I�J�Li��Y�t��m�$W�}���*I��U�����>+ip��i�����>�|p�lLi��v-���������������FrrrBB��3�*���]{w�k���7�����eK�R����v�e^����E�_��.y|�����'N��0K�|�I���������/��rq@�M�q��G���%kU�Vm�����x��]��/�KL�u����;����W�T��QM���c�~���
6��}���f����OMi�U~�S�N���~dd��+���x���9s���~�R�����zJ������u�2
��p�L���E�v�l�7nH�����Y3�l�����kw��!si���u�V�o]*�G'O���8�o��f��s������G��b�� oJ``�k��6x�`�}3�]���uky�f��%+���U�VV�z���3}Q�����u���(���|�YK=L��w���P?9��/��s�����
*h')���e�c<��@���r���#G�|��w2�MLL,Q���w�r��������7n�������2?r��_�U�A���%��SG�����|��r!��.]�~�>|�����09c���\*���F��z�jy>i�$%!<��c����������$�J���=+E��J�4h�����+���)K�X(�:w�\�jU�?����7K��9#�%ze�wkF�o�-[�H���g�)U=z��
%��o�!�[��������������V��L������h�"%����?2c�*U�$�m��A��x{����/�����i����~���n��Y������6��HII�^e�rF��w���:$�Z�I�l�(���'au��%�;)W���<d���~������Uri�"Ed��J��k��U�V-�y���|���k��9K�.�'c����c]�6@72��7o��\���/�5l�p�����4T;�2�����H<�<yr�~��F-[��>}���C�n����'i���U�|Q���>��KF1b��4E�� -iS�\v��	����R� �$������.^�(/S�Z�j�����v�Z�bE�U���������.5n?��#�*T�1��hm���)��[���vyg��_/�X���$�2x���)[�������b�
�?��e�������O^��;��e	���-��TySd9����1�E���=[��}���K_�pA��wo[f�P����>���E5o��i��'NT�j���@B�O?�)�Q�Fw����-{�������?J�������K�����t`��5��/X�@Rnxxx��[,=��gw��U�|y���
:z����gej@@@NJ��!m�n��Q�.../4h��+������0�f�l n��h��_�~2���<�U�V�g���}���%W/^\r���e|��g9�HR�~��;v�8��D�*��50`�$%mKggg�	���?� C���R��D�Lo�*�;vLr��?���~YxRRR�%�q��������_dc���M��mY���3<(��\�r��$�
6����R�d�%�?~\���%j��i��{��-e!������/CBB���/Y����������s�,�OU�$Y���/�/LZ6j��J�*I����yQ2��q�>��C�OL���5Y}Q�#;��m�d����s���r����W: o�lC�����~��%���5K���_EEEI���G�O<���C�f����/���#;����u���O?m�F���	:���(z���a�'+lQ�fM����#�P�A�����q�P����3�1EXXXVgy)�Ye�7E^��4f����U.\xx��[����>11q��u��������L�4f�C�hkl|Q����A�
6d�/Q��Y��^��R����E�
Hs��Z���i,��i�G������T_|���� /"m�Z�h��#�IPP�-�@w�M���]�t�z���+,���8��B���_�Z��f�����	��f���UW�X�����j��6�#m�G����	�i�?�&@�M��H���6�#m�G����	�i�?�&@�M��H���6�#m�G����	�i�?�&@�M��H���6�#m�G����	�i�?�&@�M��H���6�#m{1f��I�&}�����i�C�C��V�z���?��3�Iw���[����������_�\��������c�������m+O���S�~�L�L�>����������o������?r�Hbb����s�='���e�j�]�z5  `���/^,Q��3�<#m�T����,Y���/�<t��l�J�*���c��������J����[���aaaS�L5jTVg���l_��K�d����_O�:u��5ww��{�������{��-�-3������������8p�����>�o�(X�`�2ed]�=eQ��W�t�7n�h����~���_|��_~�t!��d�<=z���-t����KBB��+W�/n�\���/R���F��/_>22�~S#""����T�vi9Ld�;vHOn��]�P�r��5o�\v�j��e�q�}���U��T>���={����r���6<4~��	3f�h�F;I��5;w�lQSU�p�g�}�~S%�(O�_�.��+W���3k��OXX�DDy��+dE�@d�k�����z����w��P������s���=��A�d������[���*��q9#G����O���$�J�������{dQNN��k2d������e�������;���sG2F�Z�d������m�>}�HT0�K��<�p.qwO���`y�����������/K������?J l��U��.\(QS��m�N�<y�}���A��t�d����A$
d��{��#F�+�7m���z3����7Q�L���T�viy�^��������Kg<<<bbb����9s�|���!!!����kl�w��y���3g~��g9?��#��eW�����E���(V���E�$���[��:���c�g�}V�\9���C32�����f��]��.]�|���YZ��V%">���2J.U���$$$���+R9a���4������o����7�Pjf��5p��O?�T�b�,g���2.����8���-5����:u��a�,�����R����ke��u����:�-/��u�^�d�|��{�=	J}RR��5kd���)2}�t�\�=���%K�5QQQ-[�<q��$���G[�|���������W_��-C�d�@��D��3gJ�ff]R��]�����{%J�M��&/J�$[�=�Exx��^���_d����t��Q�F�(Q�d�1��]:66V��l���]���)))�����E������'��X�q���\vN����i�q�F'��i���I�&c��y���W�Z%57n���������p���E�j���~��w���w��-_�|���e<�����ILL���/,X 9A��)S�]�v|�A����2(�5J���8v��������;O<��,�{����(�s���b��u�(cV%"�
H������S�����M�^|�E5��w�yG������,GB�<��W���.��1cF��U%���E�V�My�����x#5���l��V^�zU��O>���D����p[^�-��L���������E�INNN;v�^���%iS����oe����S�yZV�P!	��-:w�����S�����W��m���)ar��)�^Z���'�W���iS�s���}��O�V���^zi�����4�7���?L��Y%GP���+U���G�5&k���]:�����w���z��i��)��j� ��e�111�	$K���l���~���yI����OsI-��i�CF�\�����������e|/c_	�f-ed&��r��������m���2@�����*a���t��a���U�T0`@������/������^f4��.y��$iV����3g�L�4�G�2���s�s�b��euF�����>SF�2�U����$i��Tm*�e9������?I2>|���K�d�H���a�6�-[&������R���jI���=��([�%�����M�65��*�16o�lc����_y��jc���-����q�FBB��$���Q�dy��9?�����v[�jIz�g���cG�f���~��Y~�F���C����O�>r���7�a�����������0z�hIn6lPc�-���]:��I��R��zt($f��e#G�\�x����{��>�6<dd�&����k:T��?�����1c��5�1�4����h���aJ�Pe��A&'L� �uS��.5�~�iw*�g1n�8i0|���K�������4���o�;`��+YE��y��D���.\(Q�D��m���$^2��D�����uk�x��S���_|���_Z�P�-Z��Q���H��,������2:;q�D��]e��Z�*11���Y�*3J�l�.]����v�|���Of/m�����K�����������/Y�Dv'Y��o���E�>}:<<\2��w2����/_^�|y��E������_}�����k��&iS��M�{���5d��lwO��q������sG��l��<��Y��?���x������zL��Kg�6���W�jU���s��'��Y�B����2����w�}x����M�&��O��%%d�k�n���E�]�pa�/�I��I�&)�ZS�pMF�s����2��a�<�T��Br����+W�XYF�Je�������jJ���y����^z)�Id��<W�������-����zj��]�~�������gi�z��Iy92�Vo�z��YS���k�����Y�,y��M�pY�-��������o���W��!����WK�S��Yccc�u��~l)/�I�&��
��u���EY]WDD�<�T[HQ�����I��G}���&�$I(1b�lg��]�����>>>�O�>�J%���_I���qi���U���~�9s���~����T�?��f*���-GeV}���9f��V�)[v�LW���,'�N�:��F�k��M����l�il�r*���� �6<����[�X���hI��}A����[�.�1���8 #6�}��el#�HF��>z���E�4�|Jv�}���N���)_]�H���J�*=���J(R�(A�o���/���g��kQ����;vLHHX�n�����[��Q���'��eJ����[o�%����:��>�4����ay�����M	9j�4��V��M��G����e���
2����^�	����M��s���s�����|��g���7��W��O����>O�:U[#��0&/�w��j��FI�R?{��L�#��{��'��lS�Gy��~���uL�Y=.������Rd��������V����zL��KgJ�u���U�V���m���iLi_������Q��WYjlY�B�L6�v���6<|d�-�r��
6��k��#f���m #E%����[QQQ���2������HB���7�n7�D�?#!C���P�/gxmM��%HH���w����+V�h�����3������2���e�v4�|�+IIMe"  ��o��1��s���)cu9�g�w����y���8��_�����?��W�^��>�����z�O��}�v�c���d�-/��uI�"""���h�������~j����g�7o��Fb��_~9p�@y��,�`��/��?^�s�j����6n�(�T�����W^<x��Y�|�I������k����}���6W�\y��5	Zz�
Y:.l9*��6��0����1�c������)�)�������5k��];f�	�����v�Rc.]�dJ�����`'H�>2���Z�n�d������_�m�V{�e�+���2]�:b�td�T���'c�h�V�ZB$iH^����z��e���V���M���������m���+W�����-�F~��5mZX�,DF�����2V���;t��p�B���a���yS�����#GF���kW��d�����~��-��
�{��}����y���(?�b�K����y~��'y��%�O>3e�+�j��y���'Nd�[���6m����h��L�)���)���e�������k�������r��~T�H�eI��&6m�����cJ�O[vi[TL�������>��������+!��Q~�Gf��c`H�22������-+�p	,h���D�C�������)R$66��w�����t9�$��}���kf�(Y���fQ.���(i�~�I}��������^z)888�2��W��s����Mi�+�e9����hw����7�<z������=z����b�
�/_�����V*�2cj� �t�����e�X}Q6��S�N��~��G����������4�����g�k�Nz%�\{k��g��]����C���\qqqn���{�����W����C���y�D������2K~����w�f�2�����tF7o�������w����G
�YjlA||�r�2�
����6<Ln����[���$I��F|}}�����J��q��$�n�����7����(��I�z��I6���?��o�6��)cP	��yL6H@��?~��m�Q��+W�?.��|7	���'�)����s�}��w2.����J���{�Z]N���e��^�Z�i��}���;'�Z�6R�/^|��US�N]�fM��U���6j�H�b�X���u��6mZ�~}������Hc��^|��2e�H��<y����3]�rG";v����i��m��]%�9��/�T�%L&''����g�e��Z�j����W��Z�>�l�r�d+������d�wMug�����i�7onVo�1e�.mF�9c���]�v�*������Rc��.���'�4�U�s�M����������E�j��#d<�~��/��B��k��}e\��M�602�m����D��e/is����^�{u�,�f{��m��;����������_+���u��7��s�N�N�2�m�b��
��O�W4g���}4��C�?�����S I/��
��.YKI��,�����$�^��tR����[��n�*�I�����K�^�z��Z�1[��$���k��,����_vww����q]2�_�h�3�<3f��.|��G���:$
�Y�q�������Kv�w2m7c���7J������(d#H��'��Xvr	!2���~�q�o��e�7�B�
~����%GEGGk;l����rei�w�5�pL��K������lX�1���NMM��h��i�\�u����3g>�������\�pa�^�YE������od<��SOM�0A[�/_���v���BeH��>e�,iD�h5j�������rg�B�
����������V�X�z�j___i#���[�J��R���������~jjFV*A��������[�li��q||���;/^�����+�����c���.��q��[�D	�J�h����e�[�d���w�8q�t�����lYN�j�&M�$9M�g��me��7o�Nv�����*{��!�L�<Y��={����2x��w���Z�hq��c���Q��M%�I*��1w��'�|�T�R�)N�>}��yi ����z��i�2�m�0�w�����+��=�l��Y�&�����$�I�-X����+eEM�4�^�z�����k�G���BrK�W�J��e�:uJ���bu�g��3���k��+��?����6��&O2�MZ[�)�wi�>������Z�jU�|yyk<<<bbb�;&;�����@5�g��B�kI���={��ay�>>>��-{�_��\A��p8z���e�p�B�����+~��g������g��C��l����������()�w����
�0��%�����]d����
*�q����>	-2���T�7Li��}��}���2�^�fMRRR�����:���_��<���+��S�NU�z*)b����7�m�v��u�fo���$L�7YZ���'�xb����d[�f3f��o�mcdp/�3g�H���-F�,�D��e;I	$����O����d7������c���i3�4���)P������]�
�S�NV;�0`��?�(;����J.���2Mi_-��������������B"��:I\�_O���M�LU�Ti��)�B-Z��$�G��n��%�����l`����q��rrr��#}�w������O�����.3������X������'�Gv�n����-�O���#mx8��Q�����F[#��7�X�K��������4f�2r���'���VE���kR�g1��8��-e�)?}������r�GDD���^i�*O�:%�-�{�hY~Q6�K����V���;���e�U�U���oV���.|��Mf5/���Y3[6���#
���i�5V���i,�D!���F�xL��Kg������w-�O�M�}����K�*����;���B����S�>�or�vlp@!m�����]�[���B����	�i�?�&@�M��H���6�#m�G����	�i�?�&@�M��H���6�#m�G����	�i�?�&@�M��H���6�#m�G������!C�L�>�o���~��Z������?q���%K�� ��X&�!��i���3g�4����o�������t�R�N��������[����GB�-
2��e�}��i3))��7��Q���C���s����4b���u����w�<y��i�li�QN,�S^O���$g�_��M�6������
4H������1c�~���Vd\WN,�S�N�aaa�_���>!!�����7wqq��7i�$888""����r��+��+'�	v+O�����/^|��IIII���������JMxx���� c2��e����is��y[�lY�z���������n��)�Ro6����<��q�j�����e����i����C�}��W��oo�\����h���V���5k���"�J����?����h�<x����?�<��E�1e�q�RS$���,�~QYRh�R4(t�L+/�����/Y���O>ILL<w������������������a6cxx�<V�\�T�R�d\iN,�V^L�[�l��i�����9���?�W���}����
.�LMNN��m���r��I�j3����/�V^L�}��m����F^�n�Z�n=p�@�S���{���?(((00Pi3w��.(E�
���O�8���V�R%g��y1mVK��Q�I[�lY���}���?��	<���'�q����k�:t��
BCC�����U���7��LxX���igg�
6J���q�������k\�60f�`�H�����P~hDK2^P���e�A��5u_&<,H���6�#m�G����	�i�?�&@�M��H���6�#m�G����	�i�?�&@�M��H���6�#m�G����	�i�?�&@�M��H���6�#m����/���^����MG����i�?�&@�M��H���6�#m�G����	<n��������i#��r�?�e�M��p������5�����*�[�,#m�G��/������I�&m�������J��_���1cj���L�7o^�>}2�5a�i�<���
		����������8qb��%-���,�X&��<�6�����E��w������*U


]�l��?���o�5j�H\�~]�w�^��=��7n�Xy��e����w���N�:aaa���[�n��g���LWju�l,�SM�#F������m[�f��	x�;w�2e��U�L��6�R�n�L�0g���AAA�(��u���N'O�<m������e�}��i�Q�F
4P��x�����#""���6=<<�������
4H������1c�~�����%���G�����j��=���X�R%��M��/_��W�D	�qBB���7o����]H�&M���%�V�X�l�Vg�����2�n����u���}��
:���u���Jell�<��1c��9111�\�^@@@�^��ydddJJ���������������,IIIY]&����6=<<�`��{�e��U�\Y�W>�\�h���+T�p���Y�f����qqq����y��L�tj�4777SZ|��"��dc�`��z�|����\�r���%K��={688X�q���h����z�����������~KKMM��,}���,�Y��~sY���\U�:q�D�f\w�J�Y�-[�q+a�R^O�S�LQ�����m���:u���|�Z�li��z�����!!!�*Z��)����"E�d\�Ria�
2.�}����(����C�e:�3�����n��b>�c#��/�x���V��T3�
?2��{��U��^��b��t��*��MU�f�$L�X����S��U������<��u������I���*<��S�z9������YJ�*��e��]7�:�^|��)����si��	<J�b��x�b��mk����W�Y����<9�|ww��={j;v����������o�>i\�paejrr��m�dj�r����-�du�x�]~��a��;�r�+@����Y�dI��K�,y��w����T�:uj��M���5j�(P�����cbb|}}��4X�v��;�F�bg�������4�;w���b||��'����_U�:���sAKwi��=��n�;��"���X`���6�7�|��u��M�v��E������/_��_,XP��9�k��
6|��W����;"Y����V���O����O�0����~~~,�.]Z�v��C�*
BCC�����U���7�8���s���M[����I��C-���g�y�������Ov���b��B�
I�<x�/��4�����m�>���
6\�|�x��=z�;vl�*U����2)00P�������^���Y��L�Oy4m�:u�,^��B�&i,4��&��5k�T�j�,�4��B�M���C����	�i�����	�����o�<�H�@����4`aMmM��Z��@w�M��H���6���������E��O.P)�h�6��UD����j����
�����H���6�#m�G����	�i�?�&@�M��H���6�#m�G����	�i�?�&@�M��H���6�#m�G����	�i�?�&@�M��H���6�#m�G����	�i����6���'M��}������*U�~��c���Y��� 666   $$$**���������%K���AF9�L�Cy4m����E�w��}���+U��l�������~k���4���o�������t�R�N��������[����GB�-
2��e�}��is��qqq��mk���R#�s��S�LY�j����#�/((HZ*
Z�n��{���'O�6����2�>�����Q�
�QS�������Jq���nnn�
Rt��m��1R?u�T�
2�4'�	�)����'���={611�R�J�<!!�����7wqq��i��Ipp�$Rooo�
*V�h���X&��<�6�n���o���C�����=Zj"##SRR|||�Z*5���III�dL�9�L�[y=mzxx��������/[��r��������(�������)-�Zm�qE9�L�[y=m����W�\9y���%K��=l�#���Ty���I�
�]��5k�7��I0����^�bLtL1M1>>����g���&��oqqqf��4#����c{�����)S�';v�h��m�N����_�HSf'*5E�Xn�qE9�����g��$j�or������G���b1O	�g���
;���������y[3�p��f�]
HHN/��U�Bq��x :~p�����Y�f���+V�8u�T��������������Q��*U�r�������}�`��b��x�b��mk����W�Y���svv�W���}����H�����m��X�\9)Zm`&'�	v+/���%K��uk��%���n�����S�Nm������F�R���w�������s���p�B@@�R�� >>���nnn�����LxX���)������[7m��K�.+V<�������������J�>}���?��	������t����k:TY�����u��i������m��jxX�����3������|���]�V�XQ�P��
<��^P8;;o��!00P��������^�j�AF9�L�Oy4m�:u�,^��B�xAi���f���Au\&<,�n���&@�M��H���6�#m�G����	�i�?�&@�M��H���6�#m�G����	�i��'!����{j^�f*��K�AfH���6�#m�G����	�i�?�&@�M��H���6�#m�G����	�!p�����}��|��!��H�Iw�\�U���bg`�&@�MF���S���W���x�}�\�ri�6����z�Z|�B�iz�{Z�:k*�np��sH���6�#m�G�������m����aC��T���W�L��n����H///??������UK�:o��>}�d�k��	c��Q�������DEEyzz���O�8�d��Vju�l,��Ais���O<�����-����O�<������n��ADDD����v�z���%K��Y�f����7���_������+WN;�2U�d��-�����K�:u������{����x��ey�l,��qW����O5k�����#G��s�������g����;�(5�;w�����I���[g���9d���u�f��9s�H,

1b�R��ukI��'O�6mZ�f��2�>�6+U�T�@KKi���qvvn��M�~���:*T���cJQI��[������
��t��m��1R?u�T�l���e�}2(m���j�qqq�V����3::�Y�f�����\�q��������j������X�xq��M��/_��W�D	�qBB���7onvmp�&M���#""*V�h�|��x{{gu�`���'mTTT�v�z��5l�0)������/�'�=������iZ0w�\I�={�T�����8c��9s�����s	{�sy������c��&<<<c2�:KRRRV�	v���9r��k���j�J����/5����E��N�0a��y�G�}�����7j���w�Uj��6-Z$�P���S�f����������������2����l9nnn�x������:K6�	v����y�fI�u����5�T� �%�I�4�3�������V�Z�W���?�R9v���i�F�={�������z��}�E����c��`iu
��Ys��,L�a�_���c�c�i����f��>c���6i.}���3k�����>|�h���##/h�7n���a�����7{���bRR������*|7�;	�6��Q���i�&��TQ�T�K�.���������%K�h?Wl���Y����������:t�h����>oTj�)�q]J��Y�6������g��$j�or������G���b1O	�g�b�tww�bJ�d����5S�[��/�@����b�Z�*��q�����C�j����toh�������f?t#%�����%������.k~� �L���N�%J�8{����?��r�J�v�����(%�F��o���������S�Nutt�:����3u��-___''��������X�r������X�E�vV�	v�����U�q��I�.S��3�<#���]�9sf�F�����L���~��r�"-�����wwwWo�P~Er���s�z�������nrr��m�dj�r�2���Y��L�[F���'v��i��1��[�~���x���������;������2$c��
�<yrLL���o�5���k����Cj�+�{����������@����s/\��|
��v��'�����Z��jxX�6��-�w�^	r����-y$�M�6�����n�1�����F�e6i���E��9sf��]6l��+�H��;&U����_+����3��	&<x���O����Kk��=t�P�Ahhh�:uZ�j�y�fg��F�ME�b�{q����op����Q"e�Io�����N�:m����O?��a�����/��G��c�V�REi���,�%n�����k�������:K6�	����Y�n]�m���:c�����I
$��tj��53���,�4���AiS�~�)�w#���"##K�.]�T������7&&�j���v��]�v)O�o���������SG�IMM��u������+�������6l��~�FMS����Z�<x���C�P
x��6>\�L������7�K���ft����X�hQ��-���/_���npg9�����O��?����#8�������K[�l��g��!C� ��6'N�X�`�Y�f���[����1b�L2�3�bt���/��q���q������%JT�TI�
�	 ��6��������9���y������-[��������M=q������\���9s�T�T�t������`�����+g�������^���N���_�����+������{��)ooo��0��is�������W_}U�vm�W
0��is����/_���-Q�������#G��@N0:m��y�L�2e��5x�#�6���O��0��iSu����/:88x{{�)S&���	��6���������W��R�����S'�;�	F��������=z�(]�tjj��s���Y��Ky���7�?�����"�r���j��)S$gN�<��	�����c�&N����"_�|���{���� ��6%g&&&f������jpg9���Y�V�/�������x�VJ��5kV���
� ��6G���s��5kJ�,S�LBB��s�V�\y���5k��@1:mv��i����G��6m�ZY�jU	��"��{���DFF^�p����l������w�sr!m��sg��m���������7�,Y���/*T���r��i����=�\DD�����I���w�Q���M�J�.mp9�����DGG�5�0��[��O�������4%k~�����9�z�et���q�G}��kW�����]�v~���lpg���mM)���ef�<:�^o���N���_/Z�h��"E�\�v���r��i�V�Z�/~��W���������f��w�C�N��G�������_�6m{�����s���\�2**J
� ��6;v��b�
���oiV�Vm��Y:pM6<"r��6;��p������X�L�R�J�
@�����pNS�reWW�������������bg�
��6W�\9n��#G����;w6l���/��s���#�����W�L��n����H///??������UKm������?q���%K�� ��X&�H�z��?�U�~�s�3�����U��t�R�f�������Je||���#�+��o�����
DDD�o��k��g��Y�d��5k�n���qc�K-[������N�:aaa���2u��=mi�QN,���is����:uZ�lYbb��6%y�����3���9~�xY�����y���s����I�&�[�N��I}AAA�'��[��������i�4�('�	����y��!Iz���������,X`X7�����i��_?��C��
:v��R\�p�����A����u3f��O�:����j��+��e�}2:mJdJII�X��5#���g�����{Wp����yBB���7o����m��I������ooo�
*V�h���X&�-���SO=5{��6m�h+o��=c���u����s�J�����<����H���c�F�	OJJ�� c2��e��2:m�;�]�v�k�������.\�|���W�n�������o�>|��F�����R�y��<f�i777y�q���W���et�l����U�F���"h�������O��7�e��wF�x��>}���Uk��������255��v1p����5k��o.�`���c�4����b�b||�Y{�����M�K�������'$8hF��>g�����������$%%99���mw�Z��=�������W��1z������|>MTT��s�$D�+W�����l9@������?K�,Q?W,R��)����"i,7����Xf���3}]5�7	9k�am�����bz������j��������)=�yzz��L-\��Y{�����j��P�~���"6�E�Ew7w��{899�4�x)Z�����X��)R�8��������.k~� �L��r!m���W�Ty�s������Y�frh���o���������O�:��1�Q|||dG���0�%<<\+W�,=�� ��rb�`��N�QQQ��������a�����//_�\�<��c��g�J����L���~���-gg�z�����OR��H�����m��X�\9)Zm`�2�n�6G�y���V�Z��_~�E���q�Z�h1p��	&��7��n���|���C��5�{����PPP``�R3w��.�� >>���nnnj�~�e������y�fI�u����5�T��D����K�4�#F�0�}y��Qf�$-Z�O�>�����<x���Or���Kk��=t�P�������2%W�K�q�
�aat����V~7255u��M�z�R�K�*u��%���),,Lg���q�[o�%i���y��
�����6n����5p�@	��5�Vd���dt�,Q���������?��r�J�v�������n9e�gE,���&{
j���q-�LxX�6[�j5n�8	����e��y��gLi?�3s��F��@1:mN�8�S�Nc��)V�������E���������� ��6��-�w����WW����+�C��6m���������f�����_����+�b��i���__[<}�t�v�BCC��@w�������KK������qW����K...��������r�Ai�M�6Yj_�|������
6�"�=0�������	�i�?�&@�M��H���6o���e���������'N�0�?��`t�6l��9s*U�T�tiGGG��0��is����f�z��w
^/�G��;7o�&�����(�����i����;v4x�y��_8~�O���C��������i������S����`$�������������v���`������/_����[�D	///��G�1�?��`t��y�f�2e��-k�zF2:m�����rF�M��3g.^�������]�L��� '�B��������_��J�*�q�N��� '�6,X��o�������t��������[�fM�.]�������x$.v��3/��B���,=5����/�H�\�|����Z9e����'O&m�E~������Ew�Z5K�bw�"����c�&N����"_�|���{���� ��6%g&&&f������jpg9���Y�V�/�������x�VJ��5kV���
� ��6G���s��5kJ�,S�LBB��s�V�\y���5k���>Z����Sj���]|�����p3:mv��i����G��6m�ZY�jU	��"��������&��bgx����mvKy����e�z{{�
@������I�[k�(��f��
�u���{���v��eL9����������<1f��\dP���w���#���m�m���/��X��Y��U�f���y�f���	F���7��q#c������&<2�K��������~���Q;)999>>��'�4�3����q��}��'u��1��w��y}���8��	���<���
		����������8qb��%-���,�X&�!�����[���a��=������Nrpp(U�T�~���8~�x�^�N�>�������c�����+��o����D�q��-�����K	�aaa�������#)1�eZ�%��d\���f�����O�T������T�����q����_�5$���Y3c%m2�n���.a��92oPP��#����[K:�<y��i��7K6�	����m��>@;w�����jL7����y��)S�8;;g�@I��[������
��t��m��1R?u�T�l���e�}2:m��G�����={V�0399�����|��a}(V���7
�iS:&I�D������4o����E;W�&M���#""2�t��,���Y]&��\�l�����{��Y}�J�>���;cAll�<��1c��9111�\�^@@@�^��ydd�De�����������,IIIY]&�-������k��=o��'�x�p�����������?�������6-Z4p��
*�:uj��Y���j\\\���o��i��eW���fJ�Rh�Z�%�\�f���oa�~�S�*44t�EN�����^�bLt��n����f��F}���&��25k�����>|�h����"#/h�7n�q����4?^q��5��k�b��i�l�M���.0&&��{��d�l0�����G��������5%K��2e�D�q��}�����~��;`��6m����g��~~~|�A����7Wjj�)������,�o�>�Y�(��$�;V~��T�\�}]N��h�am�����bz������j��+T�����)=�yzz��L-\��Y{�����j��P�~O\�"6�E�Ew7w��{899�4w-Z�����X��)R�8�����M�a�Cnnn������:fr��frrr���������t���W�^��6[�liV#	���?$$���C����}���)R$��J�Xm�����������/^��]�v���%K����?����������#�����A��u������)""��Axx�)���3����cy�R�Jeu�`��N��
���wtt����[�n���^�r�h���f���w/s������������S[��1SZntvv�W���}����������m�&S��+�q�����e��2:m���kNNNg����G��8q�</U����3
���*Th���111���5j�P*��]�c��Q�
+����AAA���J��s�^�pA^�R���?q����[�J����Xm�\��M�����o��=22���U�T)P��a}���_�^y���t���Q�F)����{zzJ����k��
_y�oo�c��������~���J�>}���?��	����`�t����k:TiZ�N�V�Zm����Y�6����i3!!���^2d�3�<�Vf��I���3((H-^�xQ-����6;u��m��O?�t��
�/_�`��G��c�J*V�9;;����@	�7n���8p`@@@�������e�}24m(P`���'O����\1*��6M�Xh !0(M�Sk����x�����
F_I;}����'W�V�Y�fY�]J�C����h��B�
�h���������?�v��#G� '�6�^�Z�@�����^���N��w�6x����/�yF�MwyMJJ��k��������[��j.]�t������@1:m<x0c�?����_��c��@���m��]{��)C�����r�/�E�U�T��cO��o�������j\��T.��b/i3$$�h������������U��O��)i������MII�t�Rxx��� ��6�_�nV���X�L��^{m���w�C�N�G�1x�����6���f��u��ILL����9!!���v��"}����� w�6��������"##K�.]�T������7&&�j���+W6�3���|���G-�-���	��J��v�R�l���������S��R����u���_}��Q�t�������a�>��C5j��>�l���������R�C���y���2e�d�/_�<_��G��i���c��E-[�4�_�|���������f�>}>���#G�H������K�.m��e��=C�1�3�bt��8qb��g���{�n����c��2���`A���;�b����S����.F��|���7n��1�.]JMM-Q�D�J�����`Y����N��]�&u���,�������ptt��&W��i��6�6�&��5o��g����kL���')dz��=3�&�5}�M�#���O���}k^5��m����M���;GY�z@@����	�i�?�&6�[���=��	�M��H���6�#m�G����	�_�N����������O����w�^�����!!!QQQ������'N,Y���
2��e���i�����z�:}�t�S���[�l���.]�H
��u��={$����e�}��i���~~~5j��hW�f��
���#����F����n��{���'O�6m�-
�Y&��<�6����y��)S�8;;g�`���nnn�
Rk�u�6f���:u������,�SM�����v��			h��������I�&�������T�X��e����i��������z�&<<<))�r���0'�	v�����7o�����Y����)�;�V�L�[��,HMM�G����@�e�Y��~sY�y��������m1>>����q������hm�f���KLJ��_�^�Xz����s6����c�4����y���Y{���;i.}���3k�����>|�h���y"#/h�7n��W��������]�N�v-�����fC���.PN���3�&�d��63Q�HSf'*5E�Xn`�2��o�i��(��$�S�����~^-V���l��������/�Z8�zz�����)L-�����>M&g'��������]�Too��Os6�����%�"����b�6��Df7����WL��LND�5S.l���@����b�Z�*��3�����C��Rw7w��{899�R��E�5����2Ej�������5�;��3��U=��8�C�LN��������f�����X�r�R�JYn`�2�n�63���\�^�}������������m�6	�������,�i3s�{����PPP``�R3w��.�� >>���nnn�*U�k�����is������W�'%%�?~��QJq������}���?��	<���'�q����k�:t���j����:u��j�j���6�b�<,�h���sgPP�Z�x��Z|��7$m:;;o��!00P��������^�j�AF9�L�Oy4m�Jc��d��4�kP�fM��Kt\&<,�h��(�&@�M��H���6�#m�G����	�i�?�&@�M��H���6�#m�G����	�i�?�&@�M��U�{��o0�l�K]<
H���6@��}�L����5UK�����[���	@^���'�M_�������I<w�r����c�3�6�QF� /���|�V|n��(#m�G����	�id��[�-�E[S��v�y�Rw���	��N����Gkk�6z��	�"m�G����	�i��n�c|Rz��������	t��n����[�������������^ri�?�&@�M`���#���P���)���C��	�;}����S��W|��������	�i3s������O��	&�3Fy������?q���%KZX��Y��L�C���]�~]�w�^�\9m}����'���-[����.]����u��={�HJ�t�Vg��2�>�63���!C���[7�s���X4b���u���N'O�<m������e�}"mfNI��k�p�B77�A��5��u3f��O�:���!�dc�����3��KqEr�'��i3s��y��eIz%J�P�&$$8p�y��...���4iQ�bE�Z����;�� '��n�L/%�����C��5��3������s�3v������Xy�1c��9sbbb�������^�z������������������,IIIY]&;��b�OJ/������
�f���6-Z4p��
*�:uj��Y���j\\\���o��)S]]]��rss��7nd\��Y��L�[����;v��m��Q�_��=���>�����{�o���Ty��,��b���5k�7��I�w\�|Y[T�UQ������>�V���-����II�����K/�?��a�=8y�r�7n���c����Y���8S�j�l���i��6l���Z������c�4E9�4��L%���;�4���w��+>!�A3�?|���8�=�DF^�3���������]�N�v-�����fC���.PN���3����]��lJT�5�y������x����t/i��
��Gi3s-[�4��^����HH��C��-j���F��H�L���TZ��j���l��}�����~� O�j�rSD�y�X�b���S��'G���k����EOO�+�0����~O~2������w5S����>m�g����6���������y3]L����ni�.\8!5�h��]�n��{�m��9w��h�am��������P����n�aJ;����#�J�5S�@3k�R�@Brz�V�Z����g]�F���S�g�K�4prr2���u����2Ej�������{�����T�V�h��,q��M��R�wWJ_��hSdxzcy-��\��H�Y�����L��u���W���������_�+W�8�����YJ�*��e��"mfB��������{����?v��)-7:;;��Wo��}qqq��0%''o��M��+W.�2m�%���E��D�B�&O����[�F
�r���;v������{����PPP``��`���.\P����'N�pss�T��Rcu�
�aA��������3�v���a�W^y������c!!!���_����O�>����0a������$X.]��v��C�U�����S�U�V�7o�q�
�aA��\�N��m�����n��������������c�T��4pvv�I���7n����5p������_�VY�%��r ���}��?�pq�_��=-
|mJ:���I��V�����x����y���*���]NJH��K����J��{�+��}5Ic�����4�N�Y����%��bK�g�����oj��gj�������cJI�������B�R�U����8�m^������F�����j����_�9m�*^#�%��6�B���^��!m`?H���6�#m�G����	�i�?�&@�M<��]�{G-�/Y�r���^����[�������< O#m>��$$�������	����"��Bn��q�:�b����y��Z,�l*�_��d��y;��U��%U��7}r����0��Y?���Z,���3��m0�)S�|���SH����������&��GS������L/����;�b�����7K/�y�����S��u�tp[z����L�{Z��b�_V-�<���#j�������*>>���>=F<����=]�M<��M�[j+F��������rc�8��������v��������H��u�+��!m�r,���S�����7��&��3�&�#%9%)>1N[S������0i�����������c?VXs�>�#�J-���o�����7�����Z,�U<�k!�{3�B�����a�����/������yi��%��^�������=w�����=�����'���C��	������q��2U�b���f�O-�tw�5��)���yi o��T(Js�-Y@!m�a��d�o�88���59����l��[z�����=-��ga�3�w^�J-:��|�m����\�u�)�GG��#.^W��:�}���z-<%9��m�hk��i�Q��^�(�6�0����Aj�f�&g
����������8�kT�m:>��
�jKg��p�TZ-^��o�����K�R���I��H����w)P��	@������W�b��J�|4�/��������cv����~��Y���`zXMN�=2��������P!��:�qs����6�����
�����	�����u���E��Ev���S����L�9*������QT#�s����#j���_���]-t��Zr�N�����{����$L-}M�c�m��-�_�k���j�' ����G�1)3/�R����[�����#m�<����3�K���K-�&s��{�w�����C��	�t79>1)A-��MJ�r���&x�IupT�L��e���9��3/kkj��Z(����!�.�}2J-3�y���{Z<����]�W��r�w�X5�z������{�R��u��M���%�zF�EG�����~���M��!��������%��Vglq1&�vB��=\s�vX�aO��oS�
=S_�<��m��R4��&��buH��?������_�����s�"�M�aA�D���ukw�����o��#}rq/���|��j�{��A-���?���7�o���Hm�W���;����.G���~	�Ca�T�b���K��M�?nw��NL/�z��^�6������z��n|-<���
�����(��{�X�G���e'�E��5���[�>�����m�n�����4����u����3
J�.��&�#f|9$����\���O�p���zI�r�_����7������b�L7���B�f�U�%����O���qt�=)U����
K������	��������'�4�p7�����A�D��n��@[3iz�x�=��E��&@�M��H���6�#m��t79�vB�Ztp�W��o�u�sH�0������7�b�����B�iQ)�)_��T��t����j������3��w+WOupT����oj�q����,Q������u��_E�i_D�I?kkb������ME������_N�������X^����a	����}kF�\��Z�[�r��'������L-�NHLHLV������Dm{�����s�����W�����G�2�@�Md��C|�M-6�L�y9��_T3�\RK�1������FW�?b���������b�����mQ��k4�H������k����Z3��b������p#�^�U�
�����Nms��?�|;�woT�j��[�����W�������X�������o��@��.�����E��%�7��m����T��u�~�IH:��UmM
S�K�f{�1y�ku����w�hk\�J�s,������S����5���9h>���M�jK��<uP-�]�OcG�k	�T$��^���}�m���+M�O��?z��}E-������.m�z���������bKWJ_��_���Z,Z���GhgoTqMI���e�����0g�m��I�\o_K/�0;��N�.2~�*m�������~����{���8��m���h�9�7��	 �x����j��[u��M�c�.��=�Gf�=$�bMw�?yNN|".!V;=>�1!��Z��X J�����7n���s��l�������~����+GM��������&:�->��\���j�x�W���V�Iw���m�t�������%��Zr�����F}���f��� {?k��~��)�	�%�v�����
Vh���������_���m������
�&�������@�����^LL����������������L�4�!�o`*wZ����$m��h�������^>�>�1�n��o���ZUO4iND�w��`H��������?q���%K>�,�X&�I)?�uJ[����g�&�x'���_y#������-b���_-����N��j1��������+�]���~�E�Q�/=���A�������-[����K�.u��	��u��={$%fo�l,���	�/O\��������7�>k*���wS�_��m_���Wv������g���E�k��}}�7jJJIO�w���]�6�i��9���F����n��{���'O�6mZ�f��2�/�w9�y�rz�I7S���0]Kr�h�=�t�x�G�[���K�Vw�=������r��}����������B���%`;�f6-\����m��AjM�n���#�S�Nupp��,�X&�!�������&S��~��1�G-%�x]�y�U��\s��Z����Y����]�jv��&��q@n"mfGBB���7o�����o��IpppDDD���:���wV�	v������)))>>>f�JMxxx�dhu�����.�i3;n��)����f�nnn�x�F&��`u�l,����76�
���+|������/��/�[T�Z,�����J�����Or-������u����Uk��=_����p����P#m�)55U��K��Xh�f����%���G�+������%%Q-�Dp����%:5u���w��-��r�|r����)��r�a�S��E������sH�T��	���:$�K�m�z��C�T���N�����������&��W�8�K�[�G�e=��;���/�q��MNf��Y������s��u�wzR�;:\�����l����]j��4�Fzg�w��O������$�o��QN����u������IJN5{��;6+Q�)��r���e_������������{�Fj1_\D����MJ��}��[�%S>���}$��hrzb����/��7+�_����bB��Y�[#��c����&�{�����[�+k�S�p�|���N����9h�NO������c������t9��T����{]�X���c#}�;���t��U�V�Z�����s���j�vj�5���<]k��W-�O9�/[^-��;;^���m��s�K�J��=������&'��Y���+��N-��\�����dv�wp�M�Iz�#=6���{#m{�w����w�#��)�����B�CJz�b����8�O� V��|w{�/���t��r�����|���+����#�������*X�9KG��s�
n���ta�f�ql�Q-�������~�x����T�N��3;��&�����p��������~"��H��^��Z4;����Ho�m��Gz�x���Zt�����Z���p���r��m������
�&$y�E�#=�����������|nd�H������n�ozV��;N��t��7��H���fG���t�"E-�w.;��m���+���t���M�v�g�ozB�l�����_��m�/����rC����Q���x7.��|7�Xx������&�����kUI?�����g�k�o=��A�F�#����}O�{�_�o��@�����M�W���7�����/hJv�u�����b�o���L��>N^	�?���� :U[4;�uA���"E�����7*5������e�o�>���)X����Wr�g��V~���5���?�M�9����v(��y��9���1��ol���VY����ayr�����<����y�6������fe�G�Y�O���#=��1?���,n;�-L��u&��]���,�H����:,]e��e2l����n�q��s�����"mf������SDD�Y}x�*T����Vg)U�TV�	v�����������o_\\\���������m��I�,W�\�f��2�n�6��w�����


Tj���{��������	77�J�*�8���� mfS�>}���?a������I�\�ti�����4

�S�N�V�6o�l�,V�����M���6l�@�q�F//����fc�l,�i3�$��tj��5�/�}[�C��	�i������]�����:c�?�UgL�����]u�D,������5v������XcW�����t�i���I����=��v�����:c�?��U��3&�c�]u�D�����UgL�����]u��kH���6�#m�G����	�i�?�&@�M��H��Dbb��q�>���:u����7{r���)S��[�.22������o����j�������O�4i������/U�T�����S�f������!C�O���o�o�������7�O�>�'L� ����(6l�0y��8;;��3v��f���JO\\\2�Q�|yc���3g����c��s���,Y�^�z�G��]���=Q:#���M����#���^������}�|����
		����������8q�l�\��-
����'j��1�Dm�{a�Y�Br�Dmu�|����O��7��gi��1�Dm��b�i������e�����3i��?��W���O�vGL���
4�S|����v�*��%K��Y�f����76�?���k�����w_~��J�*���.[��������5jd|���6s��\�������{���������;��?������������[�n-;��O?m|g�.��*�.]z��Ewww��s��ayk���?`����+����_~��ed���eK�;#���9��0�H�g���>������1��>�����^||�l����w��E�aaa����/IWe�cpgli`d�?Q[���'j��c����c�����1�Dm�?��-w������|��zb1��l�Y������������{��q����F�r��Gv����={�;����t���S�N�&MZ�n���1bD\\��m���v�s�ti��)�V�2�?����7�|S��C��V�A��!C����[}��z�����+�����B�
I�[o�����`��\I�&L0���{���~:q��b���9�n��)x�y����^x��'�O�~���_�~�m��}��Q�F}��7����������#��KrPjd@,C���'O�6���|���:�O�V�c�����������|����O�V�c���jg>K[���'j�'#O�V;c�i�j�m�L��=�/����W���,�>�i��_�~jM����c�r�?�5j����
�_|Q:�+�Q��UF0������[}P1��3?������=Y���+���:88�n�r���'�xb��a���3g���v<W�V-77���H�;#����_�u�F�5_|������I�V�{.��3h� ��[�nc�����S���SY���gi��3�Dm�?F��m/�9K[���'j��1�D��c'GO�V;c�Y�j>Q[=�yZ���O�V�co�g�&�Q�X19Js���g�}fVs����������J&N�hVs��Y�O�J�r�?���������_?���\�|YN�%J����l���`���Z���	i����$j�Y�f=z��_�����V�����O�:�~�����2�k����=����q��������7�r�����ONN��/_N���yOv�4o����E[/�*88X2���
��-
�euu����������agi��1�Dm�?���z�����jg>K[���'j�'�O�V�r���������M<L���+GK��=s�#�]5�o���C�����=:{��9}L�4))))�+�3f��3gNLL�)���e���W�\���c���8p�_�������3n�8����������>�ln�a��?����;��M�Z���s�d7.T��G}dpOd����$������1**�L�2w�LdddJJ��?f�JMxx����G'j3vr�6q���\?Q��Y�d'j��%�O��s�SX�O�v�����������Q�w�}7w{�����������e�*W��[=�7o��-[V�^-c)�?�s���E����B�
�N��5k����'#-��-�����?������-�:uj��}�~�m�����g���
��>T�V��?�x����{�9��l�����k�
����c�z�v��-#N���#""$$��[�n���n��)�r���+wb�<�}�c�����Y���:+r�Dm?gi����N,�{Z�����jr���M</^��O9��������ng����+WN�<�d���g�����/_:t�+����}{��nf���h���z��������|��w�
�������������K�'�xB����o:9������;2�k���l����)��y�?�|jj����+U�t�����g�m�6$$����1bD�N�:t� �;�6*RS�\���p������G��<�p�6cWgi'j���������\=Q�~b1��lWg9[�c&m����c������r��AC���2��)S�';v��S�����o����<X6���n�z3��y��W�������7�^�z��p��III/���ZS�tiy�~��'���?��|�����w�sE��}�^�z��1��z��!q����?H;v���/F�)��)����x��o��$Wn�k�H�"����\�Q��u���,m�Dm3{8Q��Y��K'���Xr��log9�����6a��Py��7���������������{4k�L�N�X����S��U3r�����s�'�|���x��9���do��-E�4F�'S^^^�\��B�
4�a��(W���e���x7w?��wd�����7��������,X���������k�I�����W:��SO�*U��������S�;��Ks�Bz���:S�Y���:3�~������������e{;�Y��]u��	�&�*�~�in�P�����m���]�vpp��^�l#..���l����ve��KS��iF�������8�|9�}]��v���������o��Q�~�%,,������G!���~�M�<��Gvw��1��4�Y��Miw�3�K����@J)FFF���W_5�'9;;��WOv'9�.�TJ��m�&��v,�gq���]��M��mf'j;<K�?Q[8�Z�����j����M������?�|��!�p��,YR�T/Y���w�U�b���M�6�����Q�������E��9�v���u��4���B�
M�<9&&���W�k����c�����Z{��=k����GK7��������_�^�z���������#2V����%J��7���'N��Z��R)o����e$a��,�����������|)))�gR��1?�i�������2d���.\����N��cWgi'j��������&�O�VO,F����,g��?��a�&�!'����+������??j�(�8|�pOOO#;���tC��J�zE�5�3��o��QB��M�t�"d�,_�\F_|�E��
�L�4��f�e��5��GG��3gv���a����������c��d'��������(�z�)9�N�6MF��A�������/_>y�r�?
��c.��T�ed7n���[o�%���/~��������c��e�����8��z����$�z��={���H�n�h����O�&L�p��A???�-]��v��C�5�3���������y������V7��'j��1�Dm��c���jg>K[���'j�'#O�V;c�i�j�m�L��=v�������x�
���r9��u�8IN��-�<������'����k���
����~���������m�>���
6\�|�x��=z�;vl�*Ur�K�Y��_~)��os���?���\�w�J���=|Y�c��;v��M$�����R��u�X���7�3�j���ys@@��$�]U}��5�V�{����c�hf���^^^��Wp����VWg���j�<Q��_L[�c�����c����������|����O�VO,F���v��S���������{�J������o���:u�,^�8�{�9���bM��b�888�K��I�N������8Mn���k����rk����d�&�;c�Y���>����
;Qg������-�1�DmK�<Q��~s���3F��m���'j[��N�V;c�i�j�m�L����	�i�?�&@�M��H���6�#m�G����	�i�?�&@�M��H���6�#m�G����	�i�?�&@�M��H���6�#m�G����	�i�?�&@�M��H���6�#m�G����	�i�?�&@�M��n��-]�4**�d��66>{�l�2e�4#��#�6���X��?�������W�'J����Srr��|���'N�''N��V�Z�6m6l� �a��M�6��B7n��d�'��B[iS�����Y�������(��f{F<���L	�V��579z G�>��V�u�mW���\����N\�D������}�����������9x�`I��N�Z�~���4k�,))I-.X� ::z�����Sj*V��@��c�i�tk�,c��&+���x �����b���w��G��3��v�r���-�T����H�M�I��r��%���i�����%m~���...Ft0PJJJRRR���s�#0�.oz���_z���S���+�i��z�Z�p����'O����?^�|�������<x�����&22r����6m�r�J�"E5j4f������n�s��[L�l�l�x�������k�����7=zt�z��y���`����[���t��Ej{��7n���I�&�;w^�r��K�����/�\�v�B�
������J�W^ye���r���������f���`��3g�H�Y^}���C�:::��&�{�7�#�6X�|K�g��2\����e$!����������_�Ig���`7p��5j������i��2 �����A�n�l�(��
�������U�V=w���_~)��_��Y�f���<��[�������������K�K�+V�_�^�Di#Egggy���C���%�\�~}��)��������o�)�������:l�0y���O<!�K~���=z(�D��#FDFF��5+7�E��G�tN\ri��T���O�AJM�
*V���*��+��+Wv��Qi��s���zj����v���^��V������;����������z��T?t��={���+���[����n��A��������d�]�J�I�&)����L�2N��g�y�l��2:W��<FEEI�P?�Z�ti�F�.\��z�-I&g��INNV�����P������s��dZ������;�r���H�l�y�����EF�<55����aM��O>�d�
�����W�/^���w'@Q]k�Qv�,�>Ql$Ox�
�����W�V�����"K\hS(R���F- 8�Db�&���#��2��PT0�Qh"���>5���;����E�{���g���������!�fI��?.���X�����I���?������]��E"Qhh�P(lmm��+--����7�`�n���>88�������K�,�`��J3�<y����JpI�1��E��r��1��CRl�����Y�����&h�����kii���a"�2���e��	2��;���;w����B�,i}`}}�3���������~5�=B�%�:u��U�v��-�H���'N�(S������V�����x���!11q����:�9s&�4������Y����njjJ��x�b�Ki�����M����%�������e�?���x����U���������
������/���`��e�����E�|666�]v�[{{;W2t�P~���j������`���{dgg�=Z���&^�E�G����?��[~������lt��)���E����4���e�������3f�t_�)
�@"��^�����j��������=����w��7
���^�|YVVF��H$����q������:�p�m�N\\\���)c�GZ7o��]v�E���9RS�La%������1J�_'�6������=��Occ���cv���p	222�������bqLLLVVV\\�����@��R�&�K��v���)R������v��C����:�p�m�����<X\\�J���*++�M�&�91��N���CBB������|*g�2�����������VB���w]�]�[�n%''GDDDGG����G�n�J�����52{�lvK��w�^�|���[�]C����I�B���3����1`�u�7.`^��/��_G;�[t��:���g-Zf���h������7���{���666
���;���3g�������_�t��O�T{�?�}�M��Ue�x�tE���T�����?|�����8p���i��5=����m����{��w�2�K �H�.]J�~���U���\�x����X,���jkk������HJJR�zi����X�������������+G�	

�]��OM��n7��cm�����������cLx��&@��F?�h������"%%���C���aaa���^^^
�����<yr�����yyy...[�l�������Oo���D�KA��S�(���
�T� �n�?��z	���W^^���������311�^���6l`�j�����������f������p�BZZ����������%�v�Z\��-���;��#�q�l�8(%S�����9r�H$��M;;�=R
]�O6��qC�'2�")��v����u�����\)�u�I��K�&I�K���3��[P�7����OJ�~�������	�&��M�?d���6���Xt�&��M�?d���6@��m��!��C�	��l�aff���w��e
�n������qqq_|��A������|��G�����wqq��r]]��#�u`/��������y�m#t��B�	����|�r++����	&�twz�>03���������F;�u���1������z��m'&&����6jjj��������;G�			{��U�HPPPii��z�#d��EmI�������������{��X,^�d��������~i2�������L�m����|f4�Y��j��L����/�u>��l������}`�_S5
���T��vZ�:�g����(��u����g��			����v��������W�����Q�F��:B�	�_4V����Juk;Cd�mmm����N��%	[z��?=j5�jTS�y�A��^;3o����y�������{Pe������%09h�!�M,t��q��������U���(�m��db'-���Td�����~������t+++��
@/�m�zg��IJJ���������b��+444|����O��
������y�zh�������/�>��������SSS������F:d�����m���g
FGG?~����KKK

(&^�p!m���l���mmm������/����l�r���������dee������������=z��_uww_�re\\���hq���4,��1R
4}�tZ���B�~DD
���$888**���O�<�i���o����|�MZ�U�V�����Nc��������Y�hQ||����>:>�K6s�L;�|������������4|�����l�����k
.)vrr���v��6���g��������_~���!!!)))�'O��u+��)R�H����QTM���5k������C1����KA��
]]]			��"��c�R!��o��������o�^�Jq�|������\TTt���u��Q�K��\(fF�4'"���������2��O>��@�3i��p��j��R2Z/���_����gi��RVF����C�0e����B�066���l����K�h^^����R��M�6Q�N	��&O����m��v�z����S�&N�H�R�w��%�Brr��G�***��).������J:��c��1s��e���(x=q�WBQ��o��q�Fv�O(���S|���`����u�6((������)~e�'�UUU�M������P��mwvvR>�����hr�X�
SSS�X	���F���Hu���@�3��c:�B�#�����;w�����S��gzzz�~r=1b;�K�N�:r����4.����c�h�


����+)�������Z4�KZ@�	�H$���
�Y��P����������"���Vbnn>i�����?}�t��a2mvuuQ|LA��9s���������CXl�d������7��=z���'���f��
��%���6��:�j:x��%����e):����#,��c�LU$���
����VZ���Rkkk~#,������������:J;��RP�-�<y����Jz�%���MP���^,{xx�����
���.���Cm�V[ZZ&L� s�5K���;w�Cd�b��]n{���
K:::4��������R:�����.^�X�e���������.����I=�Bk>��S��Z�j����������s������V�����m*obb���iZf��Iylxx�����@��lTa7f�9Aaee�E����&��N
���+�5?;���|����\	w7>v��#�c3C���KHH���_�9�/Tv�3�GXh���q��e�����e�|666�]vj{{;W"3^����5X\\\PP@���3;;������&���l�X�/|��yWW������A:;;g���a�,�����hY��f�h��I=�B�h<F�D�z�jggg�R"s����eY7���^�|YVVF	�H$����q��n��J/���%��6��6@������/�P����r��a�o�~�����?��������QY�T����b,~�u��M��F�7���3�GXh�����Q^^^TTD�yLLLVVV\\�����@��R�&�kt�v��`����eNN��k����7v��a���j�Nnnn�
������o����6@33�I�&���O?��3w����l~��������
SRRX	����'��8u��Az422��TUUUVVN�6M�G{!��1i1����f�����[�������{����[��.�RL�����}�(��|�������������
�B����`�j�kV��'''V"��h�R����������
J_�����}U@�l���iSII�����r�J77�s��������sRSSO�>�}���R�����455�Y�FY��;�-Z�~��q����w/33���&##�(c��><3���1-fR���&��(�H�.]J��h��������\�x����X,�L���-++���#))I�3����$�X�������������+G����vu�v���K���u�v��5h���'O^�z�����L���P�y�������K�(����4��Z#@�	�_xL���P����������W_}E��}�(��5k���{)��nz���TQQAa��S�(tpp��eK``��'ruu�CRRR:���H����%''{yy�2F���'�����qQteY����C�����VO	��������b�M���f����Re���������4"��7l��
)�����s���O=<<>�N�*daaq�����4�rMMM��;v�]�V�K�����U��:�f��x���yyy{���ly��!�4�8qB t��Me�4���bj������;c�� ��/<�L?�-�/y����\)��������#U|�����T)~�r)e�*�d���v���h�HJE����V���&�fRoy���v�b�MT�1^J�0I�_bmm�)%����:::�����N���;P��-�����KV���<;;�=R
�V��R�5���M�?d���6@��m�a����*d���6@��m��!��C�	�����D����IEND�B`�
bench2-50gb-pct.pngimage/png; name=bench2-50gb-pct.pngDownload
�PNG


IHDR��#1L�	pHYs#&�&�.�$IDATx���	tL�����H��$����j�XK�U�k����Rk��jmUK	j���*EkW�����VU�R���%B��os�1s'�������89sf>s����s�����#11Q�i�.��!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�Fbb�s�=w���+W������g��3f�x�����[����k��-���������3g���rt

�U���v�?���H�\�x��g���l��i����)R�z�f����Q��E�l����W�b�6m�4i����Mm�>}z�^��,i������w8Xxx��)S��_/e���Jdz��W�w���[o9W^�����{v��-Z�0?����={�����?�?~�������_Lr�{��-Z����~����9��{yy-Z�Z�j�[�~��7lG��0:p���k������H��!��={�X���&O�<�}����5�L�2G�Q��
I�+e��1K�,������&����������?�,Y�������o�>k"a�a���V���)�<����!C�e�����iWvX����5j!��f�*������+���3q�D����uKn�g�n;w�E��K,�W����)�%JG������Kyu��f��~�Iz��%�l�i"o����X$gJVOr��,L�$������g��:t�������5P��q��?e���-������~���";�|i�$	��z��1e���;w�������/���%OV�\y����z�G���9|���Q�~���
6H�4h��db9�y�'N/^\W����4i"1�b�����T����&1���>����'M�T�f���'7������;v�����O?����3w��w�yG��W�^����$���{���S�=��y����z��r�`��}����Y�hQ���(}e
�7o��R�N�]�v�C����!5I��[��������K�"��������j����R�=$�-[��M����I@:���U��W�^�����3g�7o~������1S�L;%������b�
'��.����"��_�/_>�Q������H�v��v�ddddbb����+�������7O���y�.\x���#G�L�0A����u����	����o�����DR�$�>|��q���������vKN��xW���������H�����KKZ�T����7%����!��5kJ��|��������n��R�9F�2f����oJ�<w�������w������U�����+���R@�=>��cIw�$)12!!��^�F�i�O�>�.]rss{��w���L��

z���,��b��i��o�����"E��n����?����/�4m�4C�qqq��;v�(��U�V��-����o�]���#R�����L�r����;w��d�o��f���.S��7o�j�>����_]�k��s��U�����/_������`&""B&�v���g�FGG���G"w�.],��?����7�����)`���R����}||���3j���E��YD_���3f�\�����R�� /�[�n�� �VD�K���_��v.M�4��z��������+Fmq��H��7(�3��I@:U�D	IM9-Z4m��l��93���h�B�GI�$���4	SC=HR���3�����I��}J"�b��RH�.����+-_|������i:<�������A�s������O���W�Y|��W�����/���<���$�H����yv��5-[���+�O�R�$��:uJ�\�z����%��0U�V�2�/_���f'�9rD����3J���#������t��I2��&�G��{����d"�-^���p�����KP�������u��yY��Bd.e�����/JH ��igq��i���$���7��}[���S���j�l��}*k�S���E�t�A��<�H�����{O�dll���;4h�px��J&QL��<��,DDDH�R��?q��$�z������n��]��_���*U�������'N�PLY�v"���nkbb�#I2((H1�������K��0%Q(���z����0$R�g
{��w����:���DGGKT���C����g���	S%Ijj����E���-�}��?� ��B����sg5�<��9]bbbZ�h!���W_���������K�2k��dc5'��>�yI������A�$�(������'/������R��$
J�X�`�s�_�p���)S�H�J����] ��5�������k������O���/��d�M�6Me����{�$���T��b$I���������9cg0@"����/^�(>5�<n�������+�������{w;��{�J��T�Rrkn��g���3�2b��%<<\I�NI_����*s���;���E�:�c�I)[���O�<��s��+W��`K�.�����1c���j( ��t��)+X����UE�������q���1c�����9��I�dH�d������j�*y��B��BH��H/�x��	��B����~��a���v��W�������������?�v���O�W[�p~��qy����O.����)���;��V�X�I�����K�f��������H�3oP���J$I����r��%������1�4z{{�7��O>1������W�SL;�M�>]bd���0S�|���?t���_=S�L>|�Lj���~~~��uSLG�)�G[��W�����~�[��d^���4WH��T����?���I���7�xC�#�D��_~���Cgd���5s/R���%Kl���JB��*���J"���^{��P-Z��P!�^����n�;t��%%�h������/�(��<m/�)5H*�5J&�7o^�����4%IR��;w���S���T,vmMM��I�{�$�oPZ��>$I���{������={v��
ccc#L&M�2z���F's�\�-��f0	�R�:���g��Y�zu����U�����%K
�[��Z�j6lh���t�%^v�����S=�kr�g����O��t2�$��c{���/Ls��?���r�{��.]:�I�B�
I��*���#G�����KL]����u�B�X|���JV�?~�2T�^�A=�7��o��E�Ki��������S�H�����p�4h����[��n�:���+W����+T������l+�E��A����M<5H��/�������y�K�.��@TL]�={�|����}����k���/��I����'OZ�6l������_*����=:g�����^:�r�C��M��vI�2	c��]������*�.::�rXKj���z����k��raJ�y����I�|���S�B�P�?���?�w��������J�?9������$h�f���R��h��X�,�����l����Y�V�XaN�?���b:��@��9I)x/���
r~FNn:��A��~�����G���S[�F
�c�����4h��E�s���jR�@����^�z5k���9T�d�������$������$w5���vm�C���-+��.]�>z��-�l�����M	��~��Z��~�$���(�$���U��a�lw-�|��S'�i�
���/K�U�M��ECCC����w`
sc�����E���;��W_��Z�/����$��7��{WV��W����C�?���4�99������� IH��.]��~
x��W�E"�;��#�G=R+������sgI�w���XU�vm�������W�t���k~�������|��HO=�����t���*5c'�����
*������o���~�J���]��d�N�������d��nJ��tH>g���r�J
�M�"j��Q�HY,���o����+���+W�\�d�4�99�������C�f���{b���,l��S��mSO���L6j*3���4i��S'������Q�9dQ%/G��U�T�������b��)�s����OAAA������^�C����2�[o�%Io���|���g��sfa:y%I���������j��5�R/� ]�����f�O�kI�%�o���f���9����/�;����>e>�����S�|��{LR0n�/��s\��m���j�*5I*�?H�����^�~F���=z���7/_�l��/\���bd��{@�G������m���U�T���;?���K;��}�����K�q��Y��uSO�j���R��?&��~��i�t:���_�y8���k�tjM�����M�~��g���+W�l���y�{����9S1�fn���+Jh����
�������U�y�,���oKB����o8������~���;wj�e��hv�T��'O�T��j�����h����Cm-��(��B��n�q8I��������w���<����O���W�T)�k���w�}w���G����Y���1�C��{�Nr�4_ ���_����7KR�O��������9�b{/R?���{N����?�,a���~�dt�3���$	 �{���#G���+]�����y�J_M���#������/�<}��<�s��������wI2�5��W�B��FFF~����y5��Y�@��F������>,Aq��)/���4J�{���k����_}���i���t������!qi�p��<��l���?���d�/.KL��LY"�<��Y��%Kf��Y�T�e�����s2�t�m��i����u�V��K<P�h�YP�.w��Ur�z�L	�R�z
�������(�K�,Q����'#�(Q"�_5mU�RE���e�d��gL���O�j�����T"V��9���F��m-�Q�\9Y�m���d>��y�43C�q�����^y�I���~��W��������;��y�u������DU�L������3t�������~�������\1����Q��uK�*u���=zHh����[�${K:�g?���4��G��J��������<X�Z�j+V�HnwM��q%��'���5z�h]W�wR���'O���o�m��U�TI�M�����J��Dgt���`�;wn	��$�]XG�iyywy(�WLbg�9dFW�\��)c�Y�FsR��-[����?s��H����<���a��i� �J��Twmu� I����K2���/����q��]I2cj�������5��o�,�O?�T����+��.iY�
IA|���R��v�"6�����?���J��^�����%�������,X �d����%�6o�\
X�n�,�E�I�
���,
����������-*�K����G���Z�!Qd�����ei�J(!G2�9���mw�6K�b&��$�~�A���5�5�l���)�1�E��ty��/���d���{O>��S�|`�&u��H�\����a���%:���+�Z�j����3"jF���t�%c�����g�H[�{��S���3v��!=r	By���)=o�;�v��P�p��i;w��t��t�%\���={���������u�7o�����*yU��e����'y�T���c�~��������������+���k�M�;�45���$U,V����S%x��*R���_~9h� Y������J��dH	�?�?.IX��5q�D�t[����%((H������l�"�V�.]�Y&����������t���2����K����v8|���:4e��_�U��,7___�BR������BH��������o�]�j�,Y>���k��a����5kf�S�8�J��LGF��+W�W1Mq��$�1��H��*T� �w����6m
�
��~����@�G����7%�FT���[v�E���e��+��D>����u'����9D��T.Lq��Y���4�4�1�l����D3d?����+�yC_y�����K���K�U�fd����;w�@��fj���&v��?�*[�l�M����o�N�q,!���u\��99����y/���
J���$K��w�������@Z!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�2d�W_}5m���={���$I������f���>�l��I��<xP�r�����5+  �%�Y:x�`�
��q��������{�V�Z5�a&O�������HBB��9s���w�����X??�����/T���`��_\�v��+W���[�V-�D�z��l��o�����C���+��m��}�f����+M���w�����=;f��������5��W��������:u����9r�x���^}��6m���]�<��;���.����
6����������[1�d�R�`A��,O�T��FEE(P����o�������O�q�����k����g�����G�e�ZK�3g����v�Z�<y�E,\�0g�����J��ECCC�{6$$Dp�3��UZ>)2���;��{��e���p��5k��u�T�R)�v���=�,mi|�����}yV.D��~����L�R���)�K�l��Yz��f��e{����{V��z���[r[�x�J�*i�y����L_���d	2#I�C����g���z��={�<����`/^�Dt���W^yE���3g��a��]�v��wr:���������$d��;v�4h�D���GJ�>���#�.#:��t����������/�\�r��EFFJ��c��S'I��x��K�^�/�[��^��������e9�HLL�0#Qv�������c;����%FJ�	

:y���u���M�T�/_>�g�s$�L��& �4m��;��#���]^����f*N�R�J����s������KK=�r�������?g��9o��U�V5l�P��*�u���;������_��8l�0Y�eU����0$I������%K$�t��Qr����s��I�&.\X:���PC���t8���7��y��c���5}��J�{����?~i���i���4�9R�U����$�����k��j����{�����_�K���������.R��D5???i���n����M�d�=z��U�X�~��X�re���q�yQ��K:��3d�0b��O?�Tr���n�:��D��9sN�<�<�s�=�l�2��\�|�v��'N��48x�`����.�����o����NVo�R�f�3�N�*IC��G�|���X+II��d0yQ��%��/2����%���d�M�f�(����~8p`��y�>S)^�###�g�/_��eKs{BB�����##+gHHH���������!�����V��Wo����I�I@�V�F����!C�t��y��5�r���>����m����s�����8w�\u��-Z�Y�f����#�:@ll���~�h�"�r�`��
4���/
(� >��d*��C���������K/�D��i�&/J����x�6l� ��U����)���v���j����������������_k�Q���H@�[���}n�����)SJ�,)	G����%�����;�X)�EZ$em����x��u�C����R���z_�3/��yI�����S����)�&M��.]ZF�$)����T����}YC��xi_��Y%/Y�������J�|V�	�����_������������*U�d+k�m��U]����z+�I��G�E�+W��������k�����G2���[�b��
6���8�L9\��q��}��T�b�~��@d��|#""�mr~H;u*TH���:�.�*z��ivs�>�$�w����}���k��^�^���.�Z	��K�K�����������m���-�f��]�0!!��w���qc�%z���-[����Kz��V�������2��J
��*�C���s������m�J:M~P?����;��)}q��Wj�Y���C�`9	9������������[��x��{����W���$)�A�$�/_.�����l�~��jI�)�3��('�%����;����&F����e�g�:���J�tf�$�[���{������S�������2%O�?^lr5��-An��;w�|��7,����d��WOq�f�?�:u����?�X�Z�V�Z�����d�*<x���M�6�#�3�)��t���b
����IY������MR_
�t���?_�t���v�wp-�$��N:d�-_�|��}���`��C��R�\2����$�\�r)��C>����#G������s%F������T����/��g�����O?)��b�s���1s�%KI�B�0I^�vM:���gXXX��y���?t�P5��a{j�O�m��u��PL�;N�6m���g����5��o�9b��2e�89	6|||l������gO�8��eKY&k��������T���EW������r��:n���_~9eI������8!Q'e���^�ti��e�:��?���O��������'5�@��qc��E�U����sgY{���;;I�C��$�$�$����JF���O�+�d��!����r+��|���������h������?S����%�*U��,YRh����Q���-�\m���,�6m��:�e��$���$	�	�/_>	�
4<xp���/^l{P���!�_}���gUL�1����5K:��m���4J��#�dH	�W��~�t���F�Y��C��b�������+-Z�H�)��KZ����'����O��+V�������#h���z�'O���#�c��I/\���v�[�n���%���e�����L\���t"""$�$y"������FHW~������}z������[�6��*/�F����s�ui8����WHH��j��C�4�e���!	m��a�_���#�g������i-��7o^ttt�N���J��5�����\!	9�	��T�\���y���������)�?~<E&I�G��G2|��2��Z6:�L9�J'7GOOO�>4m��W�������p��e��!��n
$��A��d�\������7$U�����g�����']X��8p@"��}�l��#=���=zT��6j�������g����(�P1[�G:+V����V�z$���.]�,]�T����{������i��ILL��
�?���{Wn%��8q�|��C�yw��]Fqf:c��~�T��.�R���m�V���s������V&�,�����3/��y�{��N��i��D2�e���Cdh���z_=���-�&M�������'grl����<a����-y	;v47J�$)�3f�Hn.�
}�����2QL�����U�JlN�$���a�#)�h����.��q�{��W�dI�v��)'W�����9�f���-6QL�4v��Mfj����C:�5kV����
I�@�����Y�Z����{��S�N�#A5o$w������7)�8��?B���?JhN�����Q����3g���&�-Y�d�� A����:_x��e!���K��*�3�|�������u�eO]��V"�9q����9s�H����t8��������q7n,���_~����d��x%X����w��<y��;$k��,�2��('�%����hB�x��7��G1]q������~��G����~�m�^���J(�AB�U@.]�$��T�R���F���7K���Z����U���{��5~���~m�����>w�\5I�^����������4~$/_��7I�'��������gJM�Wi;d%lj���R�k��u���_�~��!�����:����]�zU1�����`<�$�'�t���uk��W�Ti��i�����9C������$'�v��������jd���+WN���B�,�
7��j��<q�DIqE��R��/^��Q������s��I��td"�N�"~j�V����~��w/^,�J��^��;w$��?
9rd���-[��<�j�8|Q�n�rr^�l����o�>MV��|�z}��qww�<���?�k��`��2I�+=H�*[�����O�8a��s����oI��K�,I��Ly;�/_����/_��~�4�V'N'?���wY��������3�[~�d�tf�v�&����q�z����g��yj�O����k����F"IH��;��_*THz�-Z��+�H\9t���22g��3g�����>�����v:�$���w������U����+�8����k�$�������[�����E������!�t���w������*�����N��%��<y����G��l`>��m���$W�\)=�+V(��JcLL�4�&�/L�������%��E9?��M�J�[�`������@�&�B]cI��1cF�
�*����0�p�����s��%�P3VTT��Y�f�9�O�.]$I���o�-[�H����0?�z����<�]2v�?S���I�s�N�g��I}d�w�^5:?�}����9�,O^�
I@�v�����[���I�_=i�������
$aR���a@�o����h�^���2d�*U���k��F����`)�K���=K�H���.]�d���v������H�g��� �/  @rQ�A������s����Cs��ne�����s�:�N��ue��]���W�}��]�xQ��yE,O�<k���0a��u�J�,i>��z��2�d��
6����U�Vu��_��'���q��Jx=z�������z�g;vLI�]�����eK�������~kn��/���I�l�*U�������y!k���[��U�H����\�3m��H���zu��5kj���L9�J��UH6����o���W�z ��C:��yE/�����.�~�$�k��u;{�����|�Ms�����q��i���O���~��nk```�z���T�^l������l�2��K�5j�$�y/dxI�;vt�L���*�����{��=[�����~������6m���%U�6m�<y����3g&�{����+Y��_~�8��z#��_�~��%D�i������C��v�{R�����xPL�0�D$����od�v�����k����E�$�5l��|2����%���{I^����r~^��_�dI�Z��6l�0���:4n�8@K.��������d��<�yS�L��y�$���[�iA��f���>���K��Q�������e%�UZ����>����_�)�f�7nXl�#�k������jq�3��*mK����?e���ay�rbb�|�&N�(���6;?����4h���Key.^���{��$I����/}��+�9��=C�,(_��$L�+�{��3��!=�2e�Hw���K=�b��Y?��3�t���+W�]����_���m�$[�(Qb����/������vj�L%�*���8��?l�����^�����{��+W^|�E���:T1��'���Y7o��������A�@K�6_�|{��9q�D���)rf:�J�����$����_��Lv��-Rd�6m4cl����2z�h�������SR>������7�|3�l���r����.NB���Y�f���������q���K�.���IZ�R��y��]$���u��yYg��Q�P��d)^Vl	?�$�f��e���2�5j�.]:�Q:t�0x�`�PH&In�U�12�S�NI~K.��_�)&���q�����2f�(k�����$��={V�$y�Ug>S���_|������U��S�h�������+""���c��K1b�����r���/\�p��ay�E�Y�|yj�H	�I@:u��Q�dK�z�������^x��I�&H���w�y��E���]{��y�Bccc%!t���_�~���?V�Z%�Ab������K�o���������F'��z����o�7�|#]�u�����/^\^K��}���%��������&LP�������J�

�u�������Kz���k:�_z����'K��e%�p��!=z�����K����s�����S���;�(]��/=~�d?����3g��/k��-
6l���DV�k�\�%S�L~~~�j}��'*THA��={.X�@Vy!����c�0Hy_�}��+V,\�����*I ��$PY^D$I��.K��+6f�y!K�,1G �I���{WF�O���@q�3��*����!�H��7����5P>���e��]�����8?�����!CY>���n�Z�l����t�$	 �*S����}h�i��qW������'&�
0�D�(�R�����wx�K���_�8?�b�:��C��S/����41�?���CBB��`;��S�NI6K�T%f�_���R���������}gu�.�����j���'�YIN���~���h��r0g���f�|4>7���Gr���JTR��7����3�t����:5C�r��#I\�����?��O���`iR�$	p�	&����pK�z$I�������.����I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I����$�_�>f��
6������V�Ti������S����;u�d;���#������\�j����}||6l8j��|������Q���[�]�ve���s��R�������5kv������{zz�f���h��q��+����Q��-[�;wn��e�����m�k��&��uKn��iS�pa��gEttt���%�5o��B�
g���?���w�^I�I���(���K�$d�So��F��e��oo����+�����w#<V�h�>|xpp��3>��#��Y�fM�6����6l����$��O���+'9��3gJ�7n�����u�J�=z���S6��������$+����b�����E��IR
���g����V��K���&IOO�z���[�}���Y�;vL}�&�\�r%7���{yy}��'����[2D�'L������Q�*-�
R��;�7o6��_�,Y��9R�r�xF���I�4-<�����'���2I���K���7�y������Y3s����Q�����CBB^x�������g���yh�����j���}��y�$Xf��M��}��$ik��Y�$��}�add��N�2e���r_�a```�v��~hh���"E�h&���&I�������D�r���s���rG��z����:t� ��{��k��qww��������� ��4��cG����W�����-�o�K�,������?�������o�>**�[�nw���g�g����������}�vGq8����U�N�6�V�Z����e�����
&�N�8q��A+V�X�h��$����GZR�` 	$Ie����:u*W����k3f��6:�g�����3G����R�J_|�E����Tbb�b��3�b9���3�7o�;wn���U�:�����I��-�������{�
(���.X��6IFFF������i"�����N�t��$)!m���#F��E)a������kk.]�t��
W�Zu��!5����������v^j��Q �+V

������������k�F�Z�h.E�c�*Uj�������+��td�$���u��{
��A��i2�g7IJ��6o���>�l��	���G������w����{xx���h��'�����H�"�G��?�3�tss+Z��z_��g�U!**Jn�d��>%Q3!!���{I�ZH�g7IJ�����_���O��d������|�z������U�T��o��7��R�������Y�D8���k��O��:uj���:�z��z'S�L�R�� �h�\�j�7�|��O�)�f�:z�����2e��������s����e���c�n���7b�u�Y�f���I�SFGG�8q����X�bj��Q`���P�Z��]��-������2G�����K�(���Mp�3�$ �qqq�<�������{���-[�����U+??�c��I���=������:u��p���#G<x�R�J�~���������W���3*T�S���-[���fs����g��C�,�b������[�^��������;6�<��&��g����E���w�.I�i��AAA_���M���������m��C��uTL{��S#F����y�f__�^�z�wL��p'�y������>\s@�D������{xx���#�K	���&I����0�3��q&I>[�lY�����D�����]jd��e���q ���$	H1�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�g7I^�~}��16l

����T�������+g 22200p��U�/_���i����Q�������R9����n�����+[�l�;w�����-���Y���O������3m�xF���7^y�����F��l����s��-[�n��m�^{�5 ::�v����7o^�B��g���?_���w�<g���iv��%C�2��7�x�l�����7O�������������g4I><88x��}�����Y��M�~��W6l��3g��D7n�����[�M�6�G��8q�3�J�4������$+����b�����E��I���[={����w��U��g4Izzz��W/  ������f�����c����{yy}��'�Z�n=d�i�0a�����lg��i���JK�B���������C���/K�,#G�L�����$9i�$M��bcc���#�cbb8P�f���3[S�F�������������^�L?��LHH���������������7O�e�l�R�@�y�h��5k�,I������

��V�H�0jKppp\\��l�d��Y�D	�s��9�#��p��r����:t����{�5k�������{���������H��������W�������;w�6{��������������E��)��j����M�U���c��l�"���a����'N4h��+-Z����v�����GZR�8X�3}A����-�����9���z$Ie����:u*W����k3f�hg���D�b����i��9�y���s����Z��������'M��l�2oo�%K�t���A��l�6m,X`�$###�������n�:�+�������eK|m�lY\U��=�IRB����G����oK3��3gN%�����&���W�L�b��������^^^>>>qqq]�vm��Q�-"""���K�.��U�T��s����j�"����\#�{
x�-�n�-�*I��_?sN/W��bi�����$%FJ�7o�g�}6a�www�SE����		��")Nn�/�?~���.�����V�hQ���-���BTT��f��������p���$c-����$%@J���������y����J�*����xf>j|||PP�B�<7x��<}�t``���S( �Q��-�;�2e��#Gj�xF���U�����>}���HU���u�6n��#F�-�f�
�������'N����*V�XZM�,111  �Z�j]�vU[���}}}e������(QB����g4I0@n����y���?��;w�N�.\8r���V�TI�O?�T�|��}���9���3*T�S���-[���fs����g��C�,�b������[�^��������;6�<��&��g�����Sm�����$IOO�M�6�1B�����}}}{��h������j��/_�������5dJ���h�����G@@@�=R�� I�h�T/�a���q&)�l���sI�4U����u��m{�,Y���R�M��#I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!Ix�%�)	QV-���L.���@��l��S	�b���%oU�d I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�1:I��wo��q[�n���HHH�<{��	���et�������3�+V�@www��H=�������O����<_@Z1:I��u�I�&����N�����N����3x���bt��<y�g�}��w��/_��Y���Ir���������y������<{�����et��s�N��*d�|i��$�k�.��H[F'I�s��]�r�������`���*������sG�q��ysK�%����iS���et�\�hQ��]�����m[�@�����/�[��y��r��aC�������Hh\�b�����q��1�!G�M�����$y���Q�FY�H�!C����:\ �N��!cccm�%L&&&\ �N�������o�~�m���F����O/_����R��$9p��f���-[V�d��cbb.^��z�����u��\ �N�M�6]�t����'N�hn,Y���IN�O\O��IhhhXX���[�B�����/�2.H��"&��; �J���Uk�����~*w����S �J�qqq			�c������/��r���*T���-����;u�d;���#������\�j����}||6l8j��|������Q���[�]�ve���s��c��qww��~�f�N�>��~OO��-p��$i�i���B��o�����$��u����i��p��������z'::�v�����7o.A���������m���{%&9M��8�K�.2d��)O���e��m���y�+W����_w��M��X}�d�������^xA��f���S�n����2n��]�R�2e�Hl�<f;��$���S�r�$�0s�Lw��qP[���+�s�������5��������$+����b�����E��IR
���g����V�����0:In��YR�m�����<H2..���>3fLr?��I2W�\�Ma���^^^�|����u��C���	&����`����JK�B�����,L�������%���#�z���v_QnF[��-�x�'34�
�%�����w^}�U��}������/���a�x{{K6�3�e����7o^��111�Y�f���-��Q�����CBBltu8������M�511Qm��o�7o��l��9�g���\�k�2}`�{��>�B�R���0�,��qIr��m��G�~��z�-	r�OI:��?@@�a�8)�S�L�9sfDD���p��];�*)��*&jKpp�m�t8�zR";�(QB��;w���_�H�T�����,�:H������5k$����{�����p�U^��{�����G�%��!�n�%��&7n�<yr�b�4�Z�����I.Y��W�^�?���S��O���}����n����sG�������K1�i;A��8@r�,�i����U���c[�l�����a�d��'4h���-z���$�<y�HK�h��Ur����{�|p����I���C{��Y�^=s�{���+U���_t��1��$+;�:��(���9�y���s����Z��������'M��l�2ooo����wo���b:���l�ddd�������[�|�xFD�~U�h�Sa��������D�$}����U��'���zE�����6m���-���-�r���G�]�j���?B������_�����][�R�t��
J��R���o�jK��9m'�6���r[�b������P///�����]�6j��E���Hu�R�J��;766VsJ!����K�rO�Y6��e}����GL����;}�{�w�*��,J��V�h�w�o)G-[����9��������.�M����~�����X�b���7��|}}��;��������		� 1On�/n;n�"E���?~g����V�hQ���	�YuU�����,Y���"�a��~���$c-���Ir���������_z��l��<x0W�\�|���K�:w�lp1����p��9r��������SL�����J�*�����f>]j|||PP�<��G��QtM�������S�N-P��<TGQ�T�d��I^B-x��$y�����������/��1c�u����_�;��z��5k���GGDD����)SFm\�~���;�E=/k����q���1B`��Yaaa�������'N����2�^��(0KLL�V�Z��]�ooo___�������%J��u�&8��$o����S�'S1�!�]�v�%�;vl��Q�w�����������3u���-[JTk�������c�V�Z�={���g��u��i���#G�<x�`�J�$����O�������:��3g*T�P�N�I���p�9s�������C�Y�}��s���W��,������X��ct�|���.]��Aww�|�����K"����wO�l�1v��=n�8��+W��v��U�d��M�������M�6�������m��C�U/���b�<5b�	{�7o������W``�y�T[Gqr��/_��;|�p��Ae6n����#  �G�i��@��$��'�t�����7n�[���A��]��;w�����-[��2������$��3I�Yy9�<���D�����]jd��e���q ��N�:t���8w���<r���Q�S:�:u���R���4�5O�<;v�

�}�v�%2e�d|1�M�111-Z����O�Z���E�1�@*�$3e��g���'OZ&I�����['O�<z��R�J���\��DF'�%K�d����7���#�s�=�1cF�g�9bp=��N���_��)S��5
�/ ��$���c�i�W<��N�5j�H����������bH��^���G=�*E����#�����w5-W�^�r���&@bN+�'=�,��RH��N��m�����jp1�H�I�/_~��1}������\]��t�$E�%�������$�j����s��
�c�?wkBB���W���{��ip1�0:I��uK����^�`�:�����b)`t�<r���s���r�$�IaP��\���abcc���?���AI����f���v������
���?>>����%K�,^��1�R��$����wv����[����W�PAmILL��m[���hL1��0�8�~��
4�#���u�����w��}���n�$>\�`A���E�r�$<�N��r�Z�dI���5�+V���#���R��$��S��c�9rD������\�zu���{��������R��$9j��,Y�L�>}��=��\�r
0@�2�@
�$3d����_2$$$�������y��-V���\	 e�N�*ww�b&.�; 5\�$O.�$��H���;`���W�\�E��	F��.(��Y��zW)8�5��IF��cP����g���k��a����AIr��e��%I�S��[��$��$8���?��E��H1���l��$&&S�L�1Pyp������R�+O��d�.]�z�-�f@��X����a��H�H�%���+�n��������$	���$��[�2e�3/�ceP��������q3(I.[����8%�%�6m�83I�?�����K���q3(I�c#<5�
@��d�-�lwss���)W�\�N��f�jL1��0(I�\���c����e�K/�dL=�3n���3gv��������[�n���S�>}��_oX=��q�q�9r�h����&M���Z��$����5j� ...s���H
��d��]�{J2��5k�M�V�V-c�����n0`����(0~�xW�p��I�n��#;v��'OW�@J�����jy-����[�^.K�<8v����?_��Ue�z7����I�����$O/�%����W�Pa���M�4qU
�p����'I�I����d�B����[�xqWH�%�L�2U�\�Us�q7*�����->�����sU=����I���{�����ukDDDBB���'N\ FM�a��7�_�C\U������n$\�l�P���3_����z��eK��z}�����&F'�~����9�X�b
pww7x�@�V��c���eI�Ri��/���`������|�����Ir�����O����
�/ ��$o����I�g
���L��x��"s��.��G�N�����N����@ ]{� ���]�->���?_�U� ]1:IN�<���>������/o���gE�}%��UK�\J���q+�G���-
���j���W�7�?:{�?���-w%70��$�����7o^___��G�1��)�[	�b���%o�d�.p����;�]]Ezy>lR��-/�m�|��c��Y�*�����
���I���;,T������W.�uu@��O(�a�zH�4f�����,[&�Z�%s�T�f��$�k���ct��{�m�l���K�Y�$���;w��777??����0w����l��Mo�,����u�����[��P���i;\U�����V-��+U�sQ5�
$��s��1���G���(Qb���M�65�����/��r���*T���5�FFF�Z�����>>>
65jT�|���V*���[�]�ve���s��c��qww��~�f�N�>��~OO��.�'B�I���Ya�vJ��.��T��.�v��ep��H��HLL�}��e��{�]U�a��[q��
���wwU1�VL�r<��%��R�E���N��-��������m( [��/�[��y��r+���J�?��];�]I>]�vm�dR����g���?��m{�������c�]�t��!��Ly��7�([�l�����_�r�����{��g%F�!��%,�5���p���JwL�9��������%���d�'*{�X�pd���E={��eK�����Q�5�������,�_������-�&f�8b�B��8.�
���+V������#r����%���oW�T�L�2�$��0s�Lyj��qP[�����M)r�������

���3g��+�S��I���[={����w��U�l19-,�lt�=����3�x����\l�R�P���$��VN�j���7I�%(�.Z��=��o�N�)������f[zt�eK�����$y���i�U�K7O��b��_Is��b���<��Vn\�jy.����o_���D������i^�}F'�c���5�2F�2t����2���>��#I���|�x�b//�O>�����u�!C�H��	�~���4CCC��|�[��y�f�������%������s���O\�k������FK�W��X�<�N�d�W��>z����������,[�����%������D�n�UK�U����������/��~�lY����sz=�
]��U��aV-�R^rQ1��h�d���V-�J��}�N���bccm�%L&&:�i���[�Yr����8p�f���3g�l�Q�����CBB������/��4�T�eq�-b�������`�-[Z��7=��X�\rG+9]WL:zB���UK�W��F����+�Y�����v���n=������Kg�FY��^*^��=���I�D%��G��Wv��������z	��[���[����@���j�������Ky0p�{VC�����`"����g�7�-������N�Iu��Sd�����O<�M����r;oa�)�L�~o��+�����������-�O�^�|y��INhh���"E�h��������8��&��O�D��������rG�e���������_t%sv��}��5����������=<��������c��Z�w�(�.x���v&4b��S���������=��|�=���AV��t$W����-��+G�	�������w���=[j��p.���h�S�|��g�L���c�w���V-1������^�w���^D��4�wW	x����
��4U�t�U38���'[����qa=�������G/�Uhgh��'d���*sO����\��Y��%�c9����V���s��8f�D����ns,[�����?���p��g���d�qz���v��������<����r3���||��.{LB���u�-�n�i���]��e����TT�������5kV�lY	�����x����������[�x|C���p���]6����r��m�<�iJn�Z���i�j��u���-[��}yj��a2���
�b��E�=x��]�vy����-�4pt�U�?sN�bu_�;�����
fR��o�������l)x9����]pIL�����w�{����z���u4����TJ��s^S�Z���m
#���bn�eK��}{�[��X?������,M��<����4i]'m��_�e����xe���������?�q���Z�5_.l|%IHLP.��j��_9e��kD�:�<kY��]2�;��}���CV����y�H��9$����W>������������9�~{�����	�2+�k����������)5�\�J�o��������z�I�)?In�{xJsK�����'�^��]�\�W�f����;muN�"~i|�:U����;VY��P�������0�����<
�)�3]R��go_�z����(����\�-��hx{e��=sr�?#���7v�n���/���;����)�{X��V�1����I�i��K�.<x��iiJ�,)a�������m��@:9@*�9s���������_3�Z��������'M��l�2oo�%K�t���A��l�6m,X`�$###������%a����^K��g��e�o��*"nFhZ�����a���L���\5][����<�5**J�;������X}�&^)��������o�2���
[g.���y��
�����V��\�-7n��c�����h�������ly��%cKX�����.�qK3��M�2gzT��;��7�����9�f����i��uk��z�8t24������ac�L��}=�������V��M��}�8p>�������#�Ze����9o�JE)s����'�6,�*�]�����]�k�/�\n�ZO����\��s������|o�R�V�����p��/�Y��!���;?�{M��l����"aVGzG�-��������p����J��jky��f,Y�rz=J��A����Gj��,^���8h��{�-[b{����h^��n�����M%g����/p�j�z����5���8M%1q	7���I��rdq�]}cpT��o�L��_��j3��H�B]u_lL[��E�%��n�q��f����H��R�>��A��|S����wG���`"������&���?��\^�S��k7"4[�7�Z��o���D\;;{�U����Fu�)i������/�l)��I��U�5�>iZ"l��'N��~Gl�OQQ�4-����U��g����>�d��-t���
Z�x������Ck�����;N�����?w^�'�D���|"���f9R��Z���=���pm�A:$��]0���+��[�"5IRze�->��Az��������~
i�O����[�������I@*T���_jH[9s>��������4�?�c�f�����e�yyy����'�k���5j���l�d�.]��:V�R�����9��LG�O�U�gR�z��u�,R�H�F�����������3���|��v�b�i���T<�����P��u�x+�Oo�+�Um9r��F��Uk����������=���[1����{J�H��u���3�d+���W���V���pM���f��9������B>�)Y,Q+�?��gR�V�?���J�u��+�f����[��z>����U����uX����d}f�U�ygy�5������b|�g�b�A�jsf��i6��r���j�l6��m�
^������Q��d���5zS�D�qm��#�Z�t�M�n
�XU�������PV�Dl�[��s��N�Yk5����$Xe�!�.�v��n�:I���m�i0}�}%�~�`��z�]V��P�]o������Q.���QfY��KF�^�M���z/z\9u���r������#���\6������Y��������&%����^�x�=<<4���s���+,[z�S��^��6-eq�07������+{|
yd���r��M�����'�r��eKno���9�Y�b,�'�=����y#��[�Z>��X��)x���l���UK��5��`}����-�~
=��*V�Wi���<\��S>V�.y�kwi4uH���Y����3w�Y��-Y����v��������NJZO�a�)[���4>�.~]�y��bq8�m�I&���Um�6�	W���m����#�b������G�$iZ���j���v�R��V�La���;Y��Y�
���V3Z���[���w�+^oWaWx������+WN�������Go�����b4��<y4����}J�(�������j��Ia�Y		��K�SL_�����?����d��E���'L� �������,Y����aNHH�w�^��z������-[&t�����#{'l�b������~����p���>��ve�K�'3��K�����V�p����p�,\�O��v�����fLb����H��u���V?�woT��s�z>�"�����eK������'�����V����[�&70,m�����JV�A:�7���IR���q��n�a{t��'��`���U�T��o��_����P������$���q8��������N�Z���=
�Q�����L�2�����N~6=���y��?q1�F��9|4���}J�4y>����-Q���(y\UJHT4�Bz:[���m,-�R�N�]T�fbb���X���31Q���I�~_9o}����r��������k�[�4z�E�I2:�^�u��TsG��51����
�$<�G>�����493*
I��������3�+&���=�����c����u��;b��]qx��Yaaa�� ::Z����������Ybbb@@@�j��v���x{{���������K�(���M@���Nm�k�[N�w+�{���Qq	��;��%�����Y���%�"$I��X��X�o���w-.I��#s�W�[�,���K�NO��=�g����^���U�if���>�fu���R��:k��3P�.�����-�w��V{O+w��%��6�����^tM%@1:I�^�z����������c������b\\��K������������S�N.9r���+U�$	���~*_�|��}��p���
*��Sg��-N��p�9s�������C�Y�}��s���W�^TT�������x��96{�A��vE����Y���~|��CV��}����;V�AM�G�����wM%^�ojw������i��+8���G�kd���I���
E�S�M�j�^_)�=�li~|���_��x��,����/>�����?�����[��4ib�Lm���{��q��W�\1?����$IOO�M�6�1B�����}}}{��h������j��/_��;|�p��A#""7n����������e�r����i���"��c}b�����2Q�Y�l���U��W
���X`�4�������)���:���b��e�������VV�)8u���=�G�R���._^?�dJ����"���R�W��n��{h����Aa7/�����S�N��d�M�#�m�I�([�l����S9MU���mO���N�3����H+���W|c��q�R�����"U�Y_�+�Y�CNy���6�����������K�K���Pm������y���g����d�M��B�X_h#���k������$9y���>�����+_��y/��,o�)����f���+������S#�q��w�Mlo�����J��9xR�$��Sn�m�eK�hm�bt�>|xxx�����y}}5�T�9bp=@�	S���n��x2T�Z�f���4]�9}���V�_v�����xR�w>.��YV3g��Q��`��E�X_�3Q{�	�������l)�b�Nm$7����$y����*T����RnU���j�S]�vQ5\-�'���V-��'I��&����1?,��#tQ��4.���������)`t���+�^��S�#1^�s��)^�%@�����y�z��a�<�M
r]9�.i.���Su ���x_�����l&%���ybqatx"]�z�J��K��?uQ����?����L������r�dh.���s�P������2�B���$	t�uYsyX7��	J����������_
Y��NW�O�$<N{�x���N6�<����v���������^�x�$�	p'����V-I0���m�������u��g���z�t��$�������)S&777c�<;o;z�����]U
�v%I__�E����;Y�d9p�����1���������������dBB��
�-*���=����|��-kL=�3(I��W�;���E��K����$�,Y�~��������<�`����H��3g�e��3����` �3���1c��M����K�v���x����H��)5��U�����g�:J�������Z���?�w��;w��777???~�T�.��,��o���z����H�v��;w��#��?on)Q����c�-���Ir��E]�v���o��m�/^��n������m�����)����}VWo�^�h���]U��2:IN�<YB��+��]�f��1�!G�M��	�����-[
���rF�$�`lM����$y���Q�FY�H�!C����:\ �N��!cccm�%Lr1Ix"�$��+�����������-�O�^�|y�����Ir�����5+[��������\�xq���aaa���3�@
�$�6m�t����O�8��X�dI	��n�.��dk������077�B�
���_ e\�$UEL\5wF�{3D�q����u%����Aj�,I@:��)������������D��eKV1�,�%��)�]�Z��uQ)�Te�lW~^n���&%gu���"I@��r�<k��v���i=,[:�@��3!1V���%�%�HH�}H�}\�$<x�����������������Z���a����B��k���S�7n|����3���GGG���K�-�\��K�`�`��I����)��&I������_PPP�|��axx����t��������J��|�M��=3d��><s������)|}}8}�tc��.y��*;~�jz��R�y�T 0(IN�0a����g��X��<�[��(T��������M�V�Z5c��.���SF��j�=Ii�%��<�J���2dH���?����#GJnl���k��f�N�:?���1�R��$�={�)S��o��[�n�K��$�c��7n���f�����/w���TH%C��S�R�={�L�>]"e�:u$O�;��	������uS�k*�
F��5C��{�n���'�|R�t��#GZ��O��A���V-	/��.`h�����t�Rbb�����U���Y��W/�3��i�\����Z��T��sQ5Gr������8w�����?%�S�N���s��-#����kO�2���c_~�������G��#Gf����z`4�����|��,�c����{��E?�$��AI�}���������������p�������I�&g���8q�<P�t����;���J����c~X�P�*U�d�����y���������g��aL1��0(I���IPl��]��9���Y�f�}��?���{��eL1��0(IJnl��y��=3g����S�H���s�Vx��$+U���~����X�����1s�!��"����as<�^O� I�!I�!Ix2$d�t3��%�����A�I�����eg�j�]Py5���y��$��$��$��$���"��:g����P�\y]TH�p�3G6=���/>����n��O�-k'�	�e��e��U*���j�%$IO�{Q�.�X�D��sU1��$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�$@�d�~���N�:���9r��!��������U�V]�|����a���F���/���:�������u��kW�l�:w�<f�www��7k�����������L�"�d�$�v��-�m��M���-�_{�5�Nttt���%�5o��B�
g���?��m����+	0�i:��]�t��!��Ly��7�([�l�����_�r�����{�nb$���$�45I����r��I0s�L�|���0`��R�n]I��G��8qb�F�?@XXXPP�d��9sV�XQ�Z�h�9IJ�={����w��U�l)@RH�IS�d�\��`���^^^�|����u��C���	&����`����JK�B���������C���/K�,#G�L�+g�$�f�$���%������lLL��j���9sf��j��1�����^xA3A������ !!A�3jbb��"�o�>o�<	���eK�v�$�)�S�L�9sfDD���p��];�*)�H�"������`�$�p���8��(QB��;w���_�H�T����~@@@�$sv��}��5����������=<x�=�F���$�,Y��W������S��Oo��}TTT�n����#�f��]3�������}�v�Gq8����U�N�6�V�Z����e�����
&�N�8q��A+V�X�h��$����GZR�(@�$���C�����^�z�h����W�T��/����crc%&&*;�:��(���9�y���s����Z��������'M��l�2ooo����wo���b:���l�ddd�������[w�z��Q�I���>9�Z������iZn���i9|�p��,[�tm)..�����5��F���6����a����]3_Y�-N����vF2���%..����{QV;.?\��V[�?��y=��de!hF�y+�����e�1������].]��Y,g�\���V��u�T�aq�������b[��o�����X��iS�L���v'���(2Y������p�8���3g4�%<<\3�f���������2�aU��z!��v�������!�w���� �(����5�:>�j}3�bS��d8�KS���8��������6�;�zkK�`��r��5���,j��p�b�^:��^���v���ukN�GkaTL�v�I����)/..^����z+p�011�����E������	g�k��i6Y��p���~
�7H��V-��;NTk��j��l�����Xo�e��5�v�}��fz4�8�jm���V�p��%o��uKR_��������sv&k�5$^o�d�Zv��Y,��a�al���k�|kNy!!�����|
9�}�~
=�����v�l���{���X�U���SR���}���I�)&�
�����iy��-]�j�W����l�2[�gi�5�YoS�$����kkZJ�.��a�U�V:tH�r���%g���T���p��X�bpp�lI���|||�#��k�F��h�B���J��X�J��;wnll��� 2>��,k�<u8�����e�dT����>>�b��#G��k�^��l��j���2�T�\9Mm���Q�7����G�Q�q�VYo�������sE9��V�q�&�WS���G��VK�G�E��r<�^������G�f�j��}�s{[u�.[�%d�V��z��V��{J���>\��\9sI��N���G���X}g��9�b��9^W���i��� �_����S���bmw��r���^��Z�7gN�s_��_?{�G�����NXW����P�m�v�7@��U���L4���Y��/�Y,��Y�Xw�5��G������h�����sk�T{����%KM%n{�(kC-[��B��8�^�U������2��D��(95����m�
��*&��P�"�{d�~�����������s�jc��
Z��,�#ww+YM7�wn�O��c���+���6OMO�v��S�N>�G�02*F�u�j�I����a���4	���v��5�u�/S���]��(�3��C�c�j�Y��2k�VN��5��Y6�[��!�7�9����W��.�3���k�v���C������'�r��U�6��,���GmE�����_	�ZM����-KT�Z����lXlK��5��P��i�a�|����v���Xwp.E�o�d�)RD�X6�lVY���;bo$���w�]�O�������Yo��!��O�����}�m�f��:�>�Z�X"�^V�5�j�==<bb=t��d�5���d���� M�O�d����3�'���x���s|}}S�}�m��`�!I��!�z�	�)F��AV��{�������!!!�$�)�oh�qe�g����;3M77��E���'L� ������2�J�O��9!!���{I�ZH
�d$+.\�0G�����e��c�y,�����J�*���{�{����Y|||PP�<��G��QtM�������S�N-P�����ug�G�d����o�z$�$d��u������e��Q��_�s�NiQ����c�n���7n����f�
�t�>���>q����W�b����8�,111  �Z�j]�vU[���}}}e������(QB���$�d����N���eK�j�Z����;v���U��g�>{�lu�N�:-\�p����T��D��~��|��}��U8s�L�
����e�'Gq8���9s���s��!����}��s���W/**j���c��}��	���$���M�}����6m
��'O��m��^�Q1��*O�1B�����}}}{��h{����Q���������?|�p��A#""7n�����G��^*�I2Y5L� o�I���-[V�����83���?��)���v���R�$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$	��$�r�������V��|����O��
G��/_���b����n�����+[�l�;w3f�������5kv������{zz>��
I2����k��-��y��*T8{������m��w�^I�)��]�t��!��Ly��7�([�l�����_�r�����{�nb$���$�B3g���7n���-u��m������'N���Q�$Y1g��+V��-ZdN��n����g����V��x_9�gI2�/^�����'��[Z�n=d�i�0a���[
F�?@hh��*TH}J�l���<d�~��d�2r��4��A�L������Y3s����5j��?~HH�/��w???�$$$�CsFMLLT[�������'�2[�li�J�I2%BCC%�)RD����&I�������D�r���s���rG�e��������:t� ��{��k��qww��������� ��4R���;r�={vM�������};�8@rc��U�M�V�V�c��m��E��S��
�q'N�8h��+V,Z���������'�����+$������X���&�X0s��������[��j��C�����4i��e�����,Y��{�
��m��Y�`�m�������?����u��v�'����kY=�����
������������uV��*�]�df����(VWUY���N������V��*����j�T�zG���Y,!J��:��W�,��c�$��f���_�\}����	�bu)��VY���u1^K{��!JQ�(�7j�:Z,��j�?J9�A�q������*I,�K>W/Y>���&o~h��]�'����^,Q�������i��V[�v����w�X�����+V�8��Z?�]o��s��e�����D�Y,�J�u��Y
qA[I�l���M�f���Y,�JW�^,�����h�����z��~�?T
~����f�u�q.�]�X�(����j�H�z{��z������sHQY�8^od�t�lxL�m���m�Z�I�Z;�s��b���o������� �����;\o���+�J�Yo�_om����l�������[O�eGoP!����*y}
�8vN�,[�x�-�����i�RL3�U����k���JC�bv*�������LI8�s��e��z����f���zL���k��?�����B[�`[�5�����G���v��?�z�~%����D����5����>}���z���5�p]������z�J$����3���o�j����Q��f�����CCC���|||����v���Q�-ZDDD����.]Z�T�Rs������\D�#�'��d-O�)���J��TL��DIO�PI��O1��%=C%IJ?���J��T�$)��~*Q�S1��%=c�/��!I�D�"E<<<BBB4����x��)%���L����h����	&����%�Y�dQ������p���$c-�I2%<==�T��o�>�o������IbTO���QtM�������S�N-P����(�����L�2���#�_<�gI2�:v���[�q���1Bm�5kVXX��;�att��'����+��(0KLL�V�Z��]�ooo___�������%J��u�&8�$�B�:uZ�p���#<X�R%�p?��S�������p���
*��Sg��-N��p�9s�������C�Y�}��s���W�^TT���������gI2�<==7m�4b�	{�7o������W``�y�����4/_�������k����qc����=��i�$�r���$�l��e�x8?�3������u��=K�,�L��@��C���I'��Q�S%Jz*&�T���b�$I����S������$��b�O%Jz*�J��~�I?�(����S����I�JH�}H�}H�}H�}H�}H�}H�}H�}H�H���_~�����+T������������3f��
�������*U>|x�r���$88������c��K����_�j�!C��-[��J4���3y��.]���3��Y�����:u�m9r�,��Qm��i��������e���o����5d��9&&&��BBB�-jl9��s����s������W�J����/_��2�J����o���Z>D-Z���^^^����6-22200p��U�/_���i����Q�dq_�3V��[`���v�-x�[`;��v�L����)��-���b���a1�l�n7��:�3l{���t��%I"
?~�]�v�O�vm7n�x��Wd���Q��-[�Fp��e�����m�k��fd%���{��7<x��{�+V���3��/���_�o�^�zu#+������S]5�[�n�m�6m
.l�n��c�p��>���_���O�'!���+k����jd����o&M�O?�t���9rY�8|���3f���g�����?����JoF�|�k�6�� K�_>��Y��w��I�&���_���~�����mZtt�,����7o�\:g���?��9R��r����+��-��J�;�<�-��J��;\&Fn~�c��~%o~�c���v����3[0����I?=^�$R�����*U*S��|�]���������g����G�-��5k���W_}�a�#+0`@TTTPP��?���b���f�#+�����;u��!���c���S�re�`������|-����Y�f��������/Z���$9r�HM��={����Q�Fy{{Y����;w���V�Zj�;�����/�1��$9h� y������K�e���������������6m�����#�t�E:��A=z����������y�vX��[`�����vX�a[`����uX�a[`����uX�a[`��
���+1r{������%I"���Q�c��6�����z���[�}�]��:v����T�^��W^��Q�q��R^HH���X�m��`6n�(K�%���\�r�d�,��lYo�~�x��"##���\[�|������^�����s?w���Zv���+���jp%�]�����sgs��l�M��p����$n�/^,���O>1��n�z��!�>a��4\�Vb������;���-��o���;���-��J������<�-��J���:,��-����a�[����uXL����$�Z����avuM�4I��������<y�\��Q�4-.\�J�+fp%fg��
���g��U]U�e?&<<\������b�l��%K�:u����9r�<F����=z���w��fJ�*�g��S�N����~����j��adQQQ�o�����|G�
*^��������3d����n�&���j���9sf�vYD�����"}bc*qf�4�p^�m�Vb������-��J�;����������;������b����n��u�3r{������%I�i6k�,�\����.�A6�������o�����2�u�&�����*..�U5DFF���)Sf�����-��v��_��c�d������_����X�H�/����_��S�+��a���z�%0��_~�wd���%K��x����Y�f6l��eH/���CzQ���ey����Y�������Y[4�jKppp�l�tl���[J��_��[�t��U\���n�v{��`f�qU�$I<�v�������������!W�\��w�6m�/_^�xq�����?n��u�����R�-����,Y"�������S��Oo��}TT�t�.���r��A�����O��q��	]�t����������M�4I���#\U@�R�����-Z���S[
*�������+F����^�J�={�H_�������r����F�q�������]=�����.�6c��>7������d���t��n�p{��`���jI�x:-]��S�N��/��3���R�v����'�-[v�������{Exxx��}[�j��Q#�g�1t���={��W�������W�T��/����c�L��,&66644t��E��5o����^�"?��Cl���/��^{M���sW?~����NLL�<yr�b����f��Q�~�U�V�O�4m���w����z�i)\�ppp�����d��mz�A:=`l��V:��*�`�~6������o7��6�l��,����$��������G�![d�=��+�Hc��Q����S�d�����z�����{�2���o��i�l�>W�t��
���|KU�R��b�e���EsK��=�������%� ]�bEDD������������;f�N@��m�!M�@���I�i��}�����QL�����}���Oik)g��JR�W[�g�el�5��J��_%l����W1|��v���m���9,&=TK��SE>T]�v�7o�g�}6a�wwwWW��x�
��^�r��S�J�*e�|7n�(�������^�xQ����{����&��$___��+>�����!j1��4�[�|��q]�����w��Y���������e��E'O�4����g�:H�_�&��b�����wmZ+R������Y@��%���2�`��8I�p���z��6���[`;�
����j���tR-IO�8������v�TW�\�_�~������o����ed1[�nUL���/��Zj�����;��J�kr����m������x����W_��o�|GZ�r��Y���q��QL�{m��]��]�������e�5���UL��3����x�#�>

��g���
.C����J�*���g9[�lj��$��������l����6�J:�����b���v���mz��9_L:��$����U�����>}���C�/_>��^�l��l>���S�~�������)S��b�t����oZ����u��u���������d��u���������~���;wJ��/u��q�������>�������t��E�5�q���1�j�.U��y��8p���'J�,�6�[�c��O��J'{����v�Rw�KHH�oM	��b�����[�n���3��c��Yaaa����-����b�����U��8]m~����mo����b�O�$I��l�6n�������t������������1����R��3�&�����J���{�(������7��Y&+V����i��d�bX��\p�]����*T��}x����N���e�j���j�������c�)��������DU�bE�O�8Q���(n���p��2�{d|1���+���E�����F���w�n��+W���#g�����y=n������|�:t� ���k����W�2
8���mZ�N�dm9r���+U�$=��~��|��}��5�#7��e��a%Fn��c���b1l��#7�N~F�;������b�;�n��uX���[����/I��{��q��������k��F&Iu����}J��F~�j����?��?����^�re��Y���w������a5�CM�6

����7m��'O��m�:�D�.�G*�Y�����-��5k�6l���[W���w�ASM�4��s�,�\FDDH=�+W��T��

��\�r[�l	\�h�d��K��K�.���6���S��#FH�f�������z��R�;_V���_��2l��#�����a%�m��Y&�m~�|��;������b�;�n��uX��v����/I�5���U<��NT�Pa�����"	�r�r���a���k��������>2qu�f��*�^��t ���3�4���3qm%Fn~���
�3���-�����m�����-�3���u�
2`�L%�m~�)��-�3c��+1r{������%I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I�!I��k�N����8����(j!�2E�[�*$ktA�1,�xW$��"G�AxF��
�J���T����l���bD�r	�9/���ff���+��~��~���7L��f���`%	��JL���O�:USS����f���j777�v�	��VVV>>>�/_V3NN��;>|�w�^���wYZ�X���,��-��]�}x��(*��`%	&����������`;h
�U������W�������'�vq�����:���-�a��������������k��q����Wpppqq1m������O�A���KKK�TBXI��������y����nN�e�JiqF�w����p��*��\��e�h�$���*�X�r��
Rca*��A����0�yF��5(S�����liiY�l���{���������������uj�nu���'�z�]x�"O�P��E��6��6Q�l9]tRy����Cg-�I4L�EGG�J���[EEE��vtt��YYY�����u�D"K9r��J +I0�������*�#�t�0����k�]E��^��D"�y�������t6����_O��c:���/�<����T]���I�:��Tt_k�3}�����~:::j������-u*Z���E�6��1��O:$\k��<����������{c��<���uO�a�����177W�Jr�����_�J2%%E,��lra%	&@x���%K������g�����_�u�����}������=���
�M���qqq����a����4UQurrr��!!!���+))	�7o^~~�������O�>]WW��+�P�"##Y����������w�y�������������������*��i��K�n���o�����,a��={�Z�������P�)S%e�9s&�#��+��{�=z�6������t��y�5�e���;v����e������n�J�mjj������O����m�F����8~�x�t�}�-c	��CG���I_����e�g���S����r���z���T}���x`%	&��E�x�b��222h��P#&&f��+W�����������v�ZOO��������W_��^��>c�6uQQ�5������������6i������4��]__���eee�f�����MWWWll,���~��1�Hs��'-Z�&o���l�B�"��N��p���Bg*��������0�V^�����_}���JRH� �R]]M3�����;v��;w(^�:u*���t(�J������/���)�|���}||\\\rss����q�F�_����&ZF��:Z�:��5���e�a%	&���"����B���#G�$�<4Q�cBB�/��r�����%K���N���W�W#F��SRR���i�����:::h>�����{��vnnn��m2m�����S����������^���S�NM�<9;;�mFDD��]UU�����qa���`�Me�X�OqppP�	�f9\�����9C�I����]�x����l�{���������2���S`�����P�6a����7��a��P�J��
c��o������bSYR�w��5zM�����k��_�`�+��VYG�8���"����JL�0
�C,�������<==iJ~��K����2e��s��<y����������4�gddL�>=99�����]ZZjgg'<�������
�����izf���e��������������L	��c������a�q)�:44��55+kN�U"����PaX�P<���Z������VjU>q��q~~~eeel����?�=j�(�)|I���Z�_t��u��k8V�`�F�!����moo���555O�^z���{��_����g�6mZdd�G}D���M��q���!�d��w���,E&b�����y��1cf��M�}pp���CuX/EL��"��B%~3**j��I���.���I����p�S������������"�����'��iF��0���;�.2���_�~rS�l��0����W�~�f�E�������vljj��_h�������~���g_�jUzz:��gz!�&���������`bcc��O,((���� �&�C������$�K���O�R�#LQ�9
W�C�?,��b>��ll�
��g��|~�L�2��+�)`f-���:�3�k8V�/����;::f��i�g�H$���sqq��QQQ%%%2o`���(:���������hb���		�~��^Obi���^�,�ni����hll���w�hQ6M
�e�u(;��C�L�^�����
P�tr6��?��a%	�MuNNN�o�~�����������!C�����������\
bV�X���-<��7<==�M: '��Heh�����������G�>L����s�8\]]]��*++�����ltL�YQQA��0x����iS��Ac��1���\��9\���~�����*-����~X���Rjjj���a�V�X�`��#G:����RhRd�<P���;��[�BBB���i333s����)�����cs��a�'�@����c��U�����2:irrr�YY���`i������VS�L�������{�Q�T��m��y������0�r����W����r?�g��2����kt4�k8�G�������,%##C�������"%%%00�����YYY���.���^��'III���~����
�����G�����_����.�H�/_Ns����oi�^�b���G����SD������������>>>�
Z�fMii���wWW�?�����RlD�����l��^�[�l)))y��7#""�
V\\���Jm�����7_�tiLL����z����:88���_���!3n�!t4g��p��;w.��7n��{�n{{�/���������������5���g�����/^��eXX�i}R,V�`8��vJT\a���0�9;;_�r���3g���4x�`??�m��M�4I���\�T�"�rnzQ~�\�t�B
�a�qqq			m����,�����������'���'O�do�ecc�������������HD��s��
��=C��y���$��z��1��pu8��������+�+�f����g�Q�D�Da�[o��o�>���CjQ��C��.���������]f��A�����fut�=h����V���V�MYf�2�C'�k_n���Z�����9����D~�v�N�y�b{ut�����TZ	0����������-I�U(U�������J������a%	�3�^�Ub�{}LJ&C}}�����IoVI����/88j����o��I��������~��2d�)m���YT}�b*��oQ?[-�/\J�r��}����m����+�l�����$%LY-���r�����e�d*�����.����L�.���Z�(���K	S����hxw����*%���:U�wN�=����$h+I�V���$���{0�������`���`%	��J4��$h+I��_����k7�IEND�B`�
dbt3-jit-parallel.odsapplication/vnd.oasis.opendocument.spreadsheet; name=dbt3-jit-parallel.odsDownload
PK��EL�l9�..mimetypeapplication/vnd.oasis.opendocument.spreadsheetPK��EL^��hffThumbnails/thumbnail.png�PNG


IHDR�:<fPLTE


""",,,000999DDDKKKTTT[[[ccckkksss{{{���������������������������������������������������\=��IDATx��]	��8��nw��x��}���U�o�du4��m)Uv�=X� 
������b��~�_�x<�D��}������o������~�Gp�m����_��������\<!CW����f��A9��;��B�Jl��5�����&�u!Z��ERB����a��j��C����>)A��7��W������W�~����{y���c�5
<�JXl{�3������B�S���}���E^�}7c�p;\�n<��=��"�:��ig�VzV�M�'5�Rs��=|{���}'�Iq���d��M�|�'b���2	��6�H����3-V���s�Q�g?�6H��r�p�����^Z:�Z�>�56`"�;���\���[.��K�<t]�<O<>�k���z���)S�x����_���?q�^B(�xR��f��S�"T�z�����bmx�i���y\������p���i�`�5�#�:���m=G�*��RK��}�����0��xt��P���"
�s��	�`<��h;wA/0bA��w{��������D>a�P�2��4c_��8���P��J,-\��2�S��TIo-t��v��^�K���l����Z�2�9�ou�I�	�����n�y����UR�����d�un�O9���k�K�b���J�+�g`}?�\8����r�����������;}��=���ib>,��
m������31�i?������~��%a$��>��K�}��	;%�Y� ?���23._��`t��4���q��O2�*�1�{��F����d��:��k?�rTr�B��"�A/�+IH_�B�j���~N�\�yZ������?�������@�c���mu��$T�P�N�h%x���O��r ���A.�hI"�����\'�$2|Af�F���a,�A�#_���"i��q�-�_�yU�c'�p:�~�"P��;K�jjg�b���
�f�5�������F���l;��n?���9�?����~�a$��������4�-4I��Lok!id)�)�WA�y���D#l?����x���G��q��{2��B�!���<���[��V����4�y���v�ak����"9��d%��P��c������!��\�������yB�W��� a��J��q��i�6���;y�����Ip�1��x�B�\�gb�I�����L�J
��b��q���������B�7�Ov](�E\����|*���GN��-��"�G�_(���"���\����";��>���'kH�;x?������+K_s�.�>8��	�n_��b��8*�C������8�Z�4j�U��Fvo���R6�6{�g�@K��5%/<!��p��m�+�\%�$�%WN/�W�f��~�KF�u3�I���0sb�D�e��������� �5M��C�W��O����U���)�`�"�����n�49��5��\�{���W<l��=���I@:�6[�@��6�l.\���=B�6�r���>C��m��z�iJ��=Z���S�'��������_����C�`|���>� �+��'yJp�A�x�2��R���z��29FA��*=�4�S�����-rE��L���I?��L�H��|�5K'yu�������P�E�
S��g�B�s�F�iZ�lM�Vb��E�t~����'9Vc8$��Eq���G��m!�9T��.ax�s>����p����y���)�	&��s�Z��U����|�Gt+��YF���o��W�����N��������)��G�2pY�?J ���M 9J_�+��k�E@1WPU�BShG���j�<*	��Y���k��P�����V��H�?�^����3c�9c�v*N^�\�0"X��/8SC��v�
B����laU���4[�[g�,}�aQr$a!a|X�Q�8�Y��ly y%N�3=q������|���,��m���g_��
�-�[��V���/��R�N�3��z!]�U�$�R�E���3H������U�����b�C��� �����nr<q!�����f$]���Li]�p�3W�%Vp�I�iMXI�X�:u��	?�C��yj�L���/��<.���7���������6T�{���1��"o����\�������u��\X�<��I�a�?������"�I��*Fl���z��������(�S��0�8�������L�U M�����z�FG����_���c��%�/Qb����a�@������?����{�d?�J�}�g��A�/Z���@�!�����fVk�|�=�%����z�{�g%a��*�'a��g�(��g��=��U4����)}@*y�8���O�5����+e���n������J��r,�'{a��+����	 ��v{��[�����J�1�I1�5��9�4�6�h^VL��e�@�wQYR��a*�����@���'pe�>�u�`r�
���^b�|�U���cq��h�6I^"��%�t���m���	�X�I�.����8n�������4*w���`7V�Ie,�D[h{!��y���Lz({�~��h��J��:-`�y�i������������4�������8O����o������s������J���.(�&<�.��.�~cT������M&hSr����1������Y@��U��{��+1'y�c:�B&o���B�B�w���U�?�i����N��������b���4_`�{�~�)���ON��b_j�A"@�8����0���������e"�.�hgu�0~`��d����S��p�X9Ln�[����x{���s�k�J`t9�gF��G�j������>���;@_�`q*���e����2�N
�(�<�y��h����m �f��x����FWd%M�9t�l'�S��^��`QG���8�l5�/Z�M*tz+��mnLN��J�&�t%,�
��'�E����|���������TR�w�h�m��q��u�UE�}My�E�1b���E����kc���@��jS�]i�?��������mu�}P��^�y2<@a���jMf�q�9������s�#�Sp�G��y�����A�aX+$MJ2WF��bT3��@�)�7�Lb�?��c��cEhQ�O4�5:m��Y�
���h?+\fH�
e|����E���"��v�z�u��&�f:�/�'�J��~f�3K�}N��7�!�����B?b�s��2��@��#S��53�����q0��t4���=g�)�+���L*\*g�j�F����7���������9��������J?�8Z��*���6x�8_�T�C��8����8����p�V��Y
�_$��8X�^����A>J�1�eF>�$�����K��*���?�e���-�8���B��)>����S���:%fqBL�]��V�b��\��V��O������v����"������"��9v��CU��\�y�cU�d�]HR���t�Z��+��Z{Ey��>'/�K��
9��� ���mu�}����\#���Ok�'����<G�+�}$o8
[�f�0��l@n�H��8Z�s)4-���4Z���*�����$��o?���26��Uk_&4,�US[��)�E�CH�}r!����$�����=����Y�	��u?�����Kx��������h�vQ}����/��hW$�9����t�X��l"({�����J�x��C�������WZ���bl�1%������v[������{#'��~�Av9���jI`�X���1F�s�cJF�E��"��>
b8��9k����������� F�s����~�����^u�*;�����l~sd��P��<���x��h�zK��ep���N��9�>q�u��A���!�c��]��{��3��\4�m>� ��V���]����;'�w&<*�,n_(�[�{��O[�{����D~������6w-e�@�!�"GR"�����-f����������nO��V@*U�%���u����EA^c�%�B2����
�h��=Qh���3��*x�m�?���\�W�}��v�I#�sO>����8��	�C�}��D��)w����H�����NCe�;
I��:-��a�l��:�����I��y�VM��0[
�~��	�9[����$�:�Cm����%��S'WT�����"��LB��+4������e��@���+�lA�fA����~��bzE^q���������X���<�7?�������Kh��!G���f<������n87k��u���m)�D`8���~K�n����v����9�f<�q>�fk�[a���V��������X������I��Z�	�����]���t�k��W������)���KZ����POk��dU����w\ga�C;hP�F����������o����V�����[�}�a�9Y��d�M��<K�M�s]J�[	GN����3W48
��IV�	���z��xhX��)��y�c
���o����~��;�/��hb�����Pbq���,[h��c�"�~>�A��t��v`OZ
��"�����#���0�G����F��'��>�:ME8�~�>��|��9!��i��,m�5�W��Y�~�����g�����l���p���1�QrQV=������v3+W�a�t�4��|{�
D]w�2EK6��c��^�yj�]�b����������'�G��}����o����o>���]�q~�B��2�t3;�o1_u8�p�CA�:�<N�=���e�Y~��8{�m���U��))�fGm�{RIxqG��9���z����������?N��J���@�QpW{l��2T�;i���t�:����?��#k�8gY;����\e�k���V{&]s���p�u�m��!}�4�f/�y��E����1<;�>n����J����u�v4��:����5����s���@�(�'�b���	�>����6Q���^��>��y�`�%vN���r��������-������P�q@��M �A@wb�0 ����1Z��`g�,�1Gw:j����=gl���5s��E�T%7���2)�:�^������������WGk������N�`qG�A��N�l	��|	)
��!}lsG�v��O� ����y
w����1k5-�!H�����s��M����W=���h9��w�
��b5: 2�C�B}+���p����0u��sN��+&��2�����t������xbNX��Y�p��������?�E�A����_����[���Nr u��l�������yn��~;8���������&��r�V��ZH<�'�
��E���5�e����NB��f�E��J%/���=�b���>~�Y�g;�e�.6�u.v�Z���#c��D�9�!���p��'�����/t���J��TR�T������; ��N�(,
��5���g�����#� ���cV�,�Jg�}l�����o_9��k���C����C�G�S7�7�7�7�7�7�7�7�7�7�7�7�7�7�7�7�7�7�>��T_��-��c�b����b_=�W���g�w.����
y�����S�E����G��
�T���>
�+q	���N�lR8��5�F&-�����Y%S���7�����8���j�����r[��_�
�Fic�P�����o=(�N��~���9�������y?YDJy�9��4�JOrR�������!�n��8��������#��7��f�D��W�1e$\�����?���K��b�x!�5O�������>�Y�����8�����G�����N�k�?�Qt�7)�_�_��������w���IEND�B`�PK��ELsettings.xml�\[w�:~?����Y�^q�������������iH8I��?������"t��_T�|{������p�y��2�(9��?i�
$>
�U�Ng������S:"6��!$b�C!d^��	o,���1#
8�
B��o������������)F���:"j�jI�|J�?Q6��
���[W]}J�h���E���(�?������vP[��V�J>3�^=_�au���K��=$`����<��vV�"��V�n�r��8�04���F1�d#"�z���~y�%�r��P �����xg�D��F������m��B�!�)�e�d�U�����f�h��`MM.�t��y��wi�����i��}9���{\�k��^�����r$�$�/�Y^"?���=Q"�#��
��%S���C&�_���+9M��_��4�st�Q�y�|�+}]+X++���[l_�6�4,x@i�H�B=:u��Q�����6#���W��r��c�tZ��R=,�9'������S�]�CL�K8�,K�`�!l�����mN��Ux����a��Q=�+~P���A������CU3(NP��8Aq���g�Pt���������H���E�=|=��>�"E
�)(RxI
E
������z�A(�P�B�{	B�iP��HA��"E
/H���U��BD.���d�"��Ad5�������uX����+;�=�Q�=�2�����hg�N4�7�[ir��6b���������_SQt9 EmQL�4�����G����1��������!�h�� ��!�B!#O	��{,0"�������|_�����d6���BF�6Ii�?�0�.�M@�Pp���`yN����I� ����B?����7������	����Y�����7���3I������v�������bcI�q/��@�@�M���,�,����On�Cr����r��=��PsIA`��O	�s��t,��F�F|�^��=�@��� #,���AFL����/b���.�b���AG���L�������S>*4��4��J����	to��NZ��2��2K����y���Z��X�B�+�����~�D�2$-�p�i���B���(�.S.����4N�g����k��INY�X�����7��KY��Fh������fo�����^��|\�!��r.��Z�|H�_j�c�����r�e��N�/�{����&"�{o���wM��3pw5���F��?2�O_:n���]�L�������0;���~�nM�
du;��mN[�)��P�_���������y��8�������;�3��9��5{��Z+���]��'m�
�c?"/����OA��=rk\�����������O'~(�����s�I�O^��w�!��Aw�8�Dz�x�?����%-���������5��o�n�����#��j���<m�}}�����1���������m����zn"�8w����G�>szr�Y�C�P�'�d�
#y:��t�Yh�~y
X-�i��PKd��bMPK��ELObject 6/content.xml�]Ys�H�~�_��D�����������������y�H��6H0��_�YIU�H����v� ��*+�/�
��_�W��6���Z�;�v6���j^���������;����]T�E1�����f�����Z����^7�=����^�WYS4��l�7��������]�q�����J�>��o��w��};�����]
��k�=����7�� ���E5����/*��j��E2���X�����m7�������NN�z9���i��<�����e�j>��e:k�|���������/�����Y]��`�dm�dU���`��]��:��F�/��_^9��]e���5q�_�������P����"Q��b3x�}������C
7��
W0�����������������������%^�	
��)���AM����AL{x���}��~��o��|�=6.��x\��6[?J��pt�zZ���n��Yw��Zb?��vU7����.���`S�������o���O�>�~�5B&���M�F����
���P�G_/�QhQ��a
�����7y](+����b�/��x�6rEO@�������O��c�j�j@}�L��yt7���~���iT�E���M��F�����L6����������n�
|[1w����}����WG�7c}w���,i4�~Z�n�K�o^,�l��M//����|&��u�������Xe�xSf�z���0���An� ����C�>�?�c����t��k~����VE�.�������5�}��m�7�`$�������y'������w�}�;��cX���j��S����w����3�q�^N��hz(%~�����
������.��+f�c`��e~��_0k����?7�������f��l�������
�����J��g}�EQ�������	��='����@����J��zV����u1����,/Kp&��l`��hZ�S�/�u���|�ivO,��6/���M],��^C���>8��j��9<����Ht�GN�Ya���������O���p��U1K�S�!*����|��h�w��:��
���z������-��C6^u�&�i�8�GvuS�qg�E-{�"���w����+�E��_�i�u�����f��������_L��]���r����%�}al~o!��D���9��:�C])P��=*4?B��g)/J������\����\
�CI�Hn�=KY[?��J�Gr��Y�6gL�J�G��Y�N�������K���@��+�?���$FC%�Te1�R��a���������tD����-pU���1]^�����������3�'��V����P����}��mm�_�����d���>l�������nVfM����UV����*����E
������b7
�#�Hk��C���.Q�\�����q����t4���LiT�%��6��h]�������
����P���d4��h4|��:6�8����=F�[���Q0����}^�y9���~�������������z>�?D��U�����+'Z�x�����������~����X���\T����U;��<;�bO�S�a�RSp
�y������|
K���x���VY��C���;�r���������K����/w4�,����/�Vb"%�Uw�'F�T��������WUu>��\f�����A���f��^��i/n��H{�����e� �:�*�.��n���7ud2�?�df{9������\C<�y�H3��|��.-�:x������?��l1}���Bx8,���B���
��G���Y��v����Q����c�U�w!���|�O��*���>"�&�iB�7��p��7y3�����������u��w��n��7�:<v"�S�v_�����s0<���A�7��A�|�ZA�$��'�xA~$����A��pA�7��A���ZA~$��'�zA~$�O���A��tA�7�/���k�� A�rA�7��A���ZA~���y���a1�G��(��n��'�� u��������:<���V��<��uH�oV�c������8xq7������QX���_|�����K��t*���O�c���Q������i���#_.�a��� w����E�����]�!c����z1�u�F���n^5��|�|������M���������1�����mf0{�&z�����Y�@;T-�����Cg�.u�P�9�����C�� ��g	'r���������[���)M�K��Q��h�	���6��B>a6��*-�g�:�����@���#�b��k�-�R#��1��X9���M�Zi^�1��D�c��Au`���L���2�1������B��uZi%���[��zeT���)+���i%��h�ze��k}�~�����h�M����^if$��X�	D30ai-�%SJ �FY��2p�a����>����\�@�8�h�!xx02<Q���C�)�t�����kk��{`0�l��� R:51;)�t��Cd#�
NK��d
!t���b�0k��v#d�u3�*c<�=
�	D�Jx������:Ad#PBs�������$�:�-�3�8��N�"M��!C��;0{��O�Y��yi���~��!d1�Y-���$����_+ �*et����x�����	l!�J:>_I�����_r��typy���1r2'�$�
��k&��"�L	�s@=-US���9m�d�y����#tF<�9
�f"�!�9��`sHb�����_2��X���h�p"��]x�/�#'s���2tPsH��s�aO�:Z.��Y��%y	B�*�@��Il!t�a�R��-O�p�����^ �`���!�����YB������%p~ i4�P!�dN b��t�X/��B8��d�3B�7�`@���F�:&�U��9��?��H���(�b�	P�$�:&����O
e�s�� ��*���Q6��B����t@��L�(BN��1-B���������"�������`J�25�R��q0�B�V���k-�/^���{	���;���"K����`l2E���%Rs	�Kjkqm
#'s�������,���y�m� 2WV�
cO�s���o8���fSb�����;I������Wx!������+sH<����85C��1���<k BN�8���\����g*a�
DG����O��]��0p����#�a�Ppj����I
�1D7!�tB�pB)�0@��LES��Z��1C���0Sf��`�t� ]��8�:�}�aq�.E(��' !%�z�������:;L�?F����I�d�
��������(��f#d�x��|���S�������X+��{F9��EG��Q3kA��BW0��j���?x�!t��g�$t87�:�3-C%��'���c�bWJy�e�DX06V�%\B�BW'�i�<���b7�����86�m��@����0�]j�A�^:n�MwD�A�!�Z�49�!���4w�`�)�P&g�����49{D�\�e�^1����������d��c�t� 
�$X8�P�I���+R�8�O\��1�^hp�n!�'
c�p���	Y�Hj��m�I���)���K���\{a���L!B��
BDkP��Y��
r:G{'�3e�x��>����J3�C�Z'j����`��,����x�����:������0�������"��X���E. 
H�B�
�����(�!BN�b� <���nM�/M^��:5�
��h����#�.�IBHp�##�p��h����/F���~8��� F�6���i�7���1@�H�f��:JN6"�t� �����b�I�����a-DY� d	r��O^<D���\���)!�[o��R��5�
��H�z�!+3`���}���������V����
�����=��/�@�s�Xk��Z� 4O��'B���0H�	/|�Cd#P�y&�/��g�",�Hq��oe@]���TN���e��������&Cd��S����b����Ih�@��46|����Cd�hB�	u��QG�1�!'�>��=a��(	&�CIBL�B����@��'�b��
9)����0B�����J��N����1Dg�
�
�����ir�/F���3��aNy+1=��#U�"+�T�b��^D�[v�b�������	Q����@���Yx���='a�`%��F&�B��%Dn���^��B��[LRB�12f4��,>���:6Pp�A���GL0BW�S�3#!q��B����N$���BW��@B�x��>R��9_D#�T��'1r:7�!a�LK���]���4A�!�lYCJ�%(;K"F�_V(Yx���BW�����a$���t�km�7�&T�%i@�XH�J��#���!�l,������:��J�/]�~$���P�~xe������O�jv����xV�[����PK���n
E�PK��ELObject 6/styles.xml��K�� ��9�KYc,+��)���LM� $SA�
�#� KA��PYJ����/�/c#w=�F��d�����bP
U_�����[�r�t����X�pe��?%7;'V�L�K�iE�a��
7�2-W���4	��?�Y�<�������=����������C���.����T�h$�1hZj���P?.����`<�~(��k��N'���������*���`���������G-��2��������nT'�7��ez��ru|�E�z�c=,�����C����<}G����\G8{�3*��h��q9v��/�Lk����b�[�v9H�>�.;��mo�����[g��e�������k>�>|^�����p�Vm�T�p������3KW���J��2��S�
n�����k�MTYy�{L���o���j-	.��Y���5	��Z�W�kLa������
�����=N�����L�
����Ct�PK�P���PK��ELObject 6/meta.xml��Oo� �����Z�T���NMv������M� �~��g6ni������/��ZW�L+�Jq=��:��L����&B��!�E!�\��e75X���es)E�QL�V�L�Zf�
����i6�'�J����m�}��}�jSb�1�����t���\`�`Lh1q	^����R#�V�Z��F|���|���_���yu����[��H��q���B<<A��~���|�-���d�/A��V�� O^&S�V�t����#z������ ,�!�
Jc�-�HP��r�wa�q�R�~����JK�|��d_PK3��5gPK��EL
styles.xml�Z[o�6~�_1P���#il'��=~HPt�$���-Qn(Q ���~I���U��^l#���~��C��o��:!)/o�x+R&<�e~���G�2�����gM�.�I]�R!��+.��N��(wK*w%.���d�+R:�]�3K��l�����WK�5�#����l�m�T��Ra�N��_*|/�8JxQaE{V�3Z~�	JU�0<�N�����<���mhf����U�`�&!aD/&�x�[�����m����#b15X��W+A$@`�:.�)j�t���/��c>Asr�bq�p7T.���r��e��}��I���7�����4�CU"h�x�����{S��Mvc�&�.C��B�f�'A-x2O0K<��#
pqD�:�Z�MOj�
��P��ly�v6>U�`���g4i:
s.BH[Ht����S�������_�qj�O��\lE�����ej���A�+"������:���T6gHKC��R�\��-������W��t'���Pc���!�sH�*P7�uZ��&���3�pjf8!(%	��k[����>k#o�7�����#.!H�,9hA��M�-����������Z�QNJ�5$�<Q);�����jb#�7�5�/���7��Yb��T�����U����K���4_=������0��NZ�z��@��a1i���fq8���m���R���5m����lJ
Jc��WX�\���*�+"�^�N��
�T*\����y��$�d�3'�#�;����9���$P>��~��U �������8=����4
���wC��o`�~^�h_����;������O�����)��T���0������W�2X�z%�1?�b�����zU�W�'+9����<���D�$
�&^����c�n2\/:p�����n��U�8��2Q��
c��lz�iI�� :e�9M���-4���)���G��2%�X���D�a.Gf�x�]\����v5��$n	�+�x�%jb������\������)�F{ra�1��4E��(
M���)��u��W����5������5�N����.
z�U�T��4*9��4�J��f��^GR��������}�vq��H_���F<w�9k�����h��
����?��U��M�m���G&giq���uu�[]b��L���[/�,�/�V�Sc���l���Zv
\��(Sj��#f5���os���;\U�!u�r�UVr���6���y8��<�c�"2��
�k#���S4����s��,t#��`U~b�|V0i�Gt���}���y����Zu�a&em��o)\�kj�p%��#9���DS��F�*��@�O��9{"4?��7���l��N�X�6����|.�����/4��1��H�����S.�5��L�P�r-�|[	����	�����G�z�tBc��e�l��D�s�J�oH�1��m�����������Oz��+.J��!\��y@-��@W]���e&�v��O�������U?�wK�[��}}�^a8��xX������Ra����^4����5	rn%�U�V��VE����^?�@����������e��kVw��[;4�g�7�ZX�0�HQwPXxo��+�_��XG�����I�-��p���kO8���m�I��3w\��#����V��Y=���T8��F���	��������
J"���i!���A�v�7���&_�Gu8Y���K�B�/kfPk��N��`��Y�������_������u�lF�	=�k/vO�A��������4�l{���n������C��	�������|�8��f��;�r��i�~/�v �gST�6�>? ��bg�dR�
�I��/pU� d�@�E�KmPt��(4?Q�X���������5����6�]���*~��/�z�����������t��5�~�m�����x���&h�?PKn$���S$PK��ELObject 9/content.xml�]]���}���l��vR� 	b��Ll��;I�t�3�>pIH��U���������t-{����8�� �{������M[��W8DW3����\/_\���7Az����n�����uQ���XwA^�;��L>�n�M���m�����l���J��]~]o��>u����\i��j�����t'��������tf]�}�h�����RT��E=����
�T}���r����\������6�����C�@��Y�1�|�K��C����t�"��J(�v�C<�uW����O�u�����D3Y���>�j�~9yD�_�&����cCW��K�������*���$��(�_?���j*���I�7�f�����|]�CW�f���������~8Z��);�8����������>�d=<�5�^
�a�+!���)*�������?��b��*�������;e������Fl���YL��[d��}��OwUj�.���[Uv�����/x_����xx|<����M��O`4������T��A�]�o��*���ki�\�z���F4�*�*�����;���74��\N^8/Ee��`��f�:X�r��iRo������Y=NkNM��X�[���mi�o4���\�jq���gr�ruk3�l��2��y�#v{{cb}�
:3�\������������*���K�\Q.�N�e|5����isQt��y���`Se��$r.���)<�?[�l��F�I]���m��aw�{���������}d�d�{)�F�T4])�������U6�����a8FG���O.�Y���M����������T	��ReQH���������p�yc[�WV�t�
��p �`�>T���J<�����~>V�cV�-�Y��gut6����3�����|U���;��\�����l���D��,(:&������y���I�r�W�B�eQ�u����1d�U�4��Hs���.�5"���tO��Jd�E��6�NS.�;3B� {Tqm�R-N�[��:u��8a��E���T���|��z����~U�#y��!!�o#r#Q_��rrs#�;)��n"{�<��eK�e�e�v����(p�Pb��&��=��� ttF����f��p�aN�?>y��G��[6��g3vVu��Si1:�l���}����j+w�q��Z\�b)�FmtN��s��@����XD�/J���Z���E�|`_��3^�����6�3�	���D>�5��ENi�-_�����]^d�#�`|Q"�}C.r&������I>�D[Weq�s���>��bO�r���=�<w����i���t{c��[���,��H�BJp�2��uF$HB�4�__�7b��*���i�d/����9����%������C�o��te���r�$!����R������Po�1�����_:�����|���h�f������W����O7�����!��h�w��P�v�Q|�#t��2H���_�R�������Y2{��[w���LB|�:@��v�v�K�.f�g�}Ww��W��q���Y&D���Z<n��ym#�.���af
6U�Y#����n�<�c���{~�����dW�r'����J0k��U�<���[|��:��}4aRG��>k�!R�e�D�.r4 !e�~�9N���A��)R`ow]��y]72Pf���b�FQ�A��R�%fd��B��19S>�U'K���J��y�&�7M�	�{+�a�g}Re&�
�9�2���J����u�b�)n$w�������>���~��+���$��;#���k#���!j��y�.���,���G�p���n���f���$������h�������r7���2L���0�_�����B��M]���x#�X-�\#�~F�)
�s(�j���NT��_]BAr_OP���
�����K(H���w��D����w�P0:��o&(��D�LP��%�����	
�=Q��|{	�s(���?Q��'(��%d�P�������)�(����_��>,*�G�_�;-�8���<_��������;��\��j�"+D��!��u��P=��������Wvbi��m�go��Q�DF�r8�����M��>������N]/�������~���Q���FmB
���g��o�C�7sKr&���Uq�
��XH���iO1aZ"	n������1-�������)6LK��m8�C��7����'��L���V�;1�N[��Z�Az���D�]��,[�D��@�]y%�:� >E���|�t�^{x���xg�ENZq����[�Q�q�"{���x���mLZ�D���8i��v��	l��4v�3�I�����O1�p�o�)���|�)����`D<�p��>�|�S�8�Q��J����O;��s.�|4�4rR0�\����[��A��sJ�i�u$��9�=>�����5�����p�vl=f[�#�6�y.���s
��� F��� P|Q�R���(��w.�P��������"`|�q��)�-
c��;�,��B"���^�{�}������g���$�~vc>�$M��)j�b���0&���w���cK"7��_�Y���/Nyy|������
��#���/��r*�-�$I=:�\,����q�DQ�l�-�G#��#4c"����!�0��2�[h 8Mi��/�B��"�\���c�Px��Y��Xf���.�Y
4=S�/c��L�)����g��� `&�U�0��:r�F��d%�����b�{���8���,r��-*�0a�'�E��H����\����=�l��P�"p������c$E�X1��Q�Q��i���`gl�������	BBQ�eY��%�KU�@���x��E�����<55�fL|���p\(�I�-!�=��(���{�� ����9�Y9F!K�����X����#�Pn��=r���!����YN�(J�HQ
���x�(LUL�4�D�e~�1@�zC�>(��{z���E	c>�F��(���dh0>��������0��T�{l
�bci����� ��p��q�\p;$�\�R6zb0�$����#,����X��I�w)�#�)�o�9���c��K�06��cS��������\���a�����c���� P|�����/�����ao_e�C���~�h(�����A��
�����\p�dC���a�R����1F����#@|$�1���X�1"~7��x��B�����3������'�1JsR�3�r��b�Xe������;������=W2����NM<��g8>?kV���RD�w3�G��8KG|�\�.b������e�_BFt`�T�����[����Xh�:D0���_���S�s6RS#P|L�N��i�r��M���,
9F�qi��!�l
�bK9wo���mT���3N#pZ&�]]�����-��X}S��^�A��":��A.��P���8����+z�/����r��E�z���X�1Bl��!8M1O���B��L�&�{cF#p�&��nX���-)�=h��w�MN*�Hu�,���S�O#@|QHg�"m!0��c�}F�i���W.�1����b����K~,��z'-�\@p�/P�E!����Y���p�`lq����0��P�6�)IyN!���|��0>�x1�"p|�-����'�mAt[�D�t!r���1"��>�F������"@|I��{_U������%YLQ���5�hJ������w�-r�`�,+jWD�MZ��R0�I2z�l 0�H�y���K��B`�8����-��SNG�c��{��p>�(��������.�����wQ9�UT�P��R��x�t��5�cK��i�r4A�������%���?����H<�F�A�9��H�C�����������G��B�����+����^w����PK��~���PK��ELObject 9/styles.xml��K�� ��9�KYc,+��)���LM� $SA�
�#� KA��PYJ����/�/c#w=�F��d�����bP
U_�����[�r�t����X�pe��?%7;'V�L�K�iE�a��
7�2-W���4	��?�Y�<�������=����������C���.����T�h$�1hZj���P?.����`<�~(��k��N'���������*���`���������G-��2��������nT'�7��ez��ru|�E�z�c=,�����C����<}G����\G8{�3*��h��q9v��/�Lk����b�[�v9H�>�.;��mo�����[g��e�������k>�>|^�����p�Vm�T�p������3KW���J��2��S�
n�����k�MTYy�{L���o���j-	.��Y���5	��Z�W�kLa������
�����=N�����L�
����Ct�PK�P���PK��ELObject 9/meta.xml��Oo� �����Z�T���NMv������M� �~��g6ni������/��ZW�L+�Jq=��:��L����&B��!�E!�\��e75X���es)E�QL�V�L�Zf�
����i6�'�J����m�}��}�jSb�1�����t���\`�`Lh1q	^����R#�V�Z��F|���|���_���yu����[��H��q���B<<A��~���|�-���d�/A��V�� O^&S�V�t����#z������ ,�!�
Jc�-�HP��r�wa�q�R�~����JK�|��d_PK3��5gPK��ELObject 5/content.xml�]]����}��PM*y��@�$&�I���[����[��[y����YJTH�3�_|4-���������� �4�h����_W��c�vU�~uECr5+�yST�������]�^���w7�bQ��u���U����Y�����{�]��WW�v}�d]�]��U�]��u�)���k�����H�?��o7�������z������3����E�=L�Y�U���/��7?vu�h���M�W�V<����WW�}������(l���J)��t��|Wo�mkS���e]j�nNC:wuWe�Mm���7i�]���di�>��������qy@��>k'�
S�7*��7*�{WY�'��'Uh�����}�]M��u�Ty[m&�ik��7M�k���P�\F��k�����m���W=?Z=��|�x��'��G��FP~��t��������*w��G�����������r���A���l��L��p�R1o�M��;a�������_����.uU�mQ�������W/�X����x�sS	��wP27�����t��� �!�]�f�E�]+��5�W>n���EYmn�O��|���G3�����v�bg���4M��T�Q���\{w���]=N{�M�?q&����}�����uY�'G�&/)`W�.��}�b[�&bw�76�!��3�u[_]�/�U�
W�jm��T�����X�W�����gN ����2�VYl�,/�K�{�{
����.�f�1iR�n����M�����z�����4����e�f�{%�F��l���fzX�G�����fmi=�ct�8�����|�l���Mg0��i��� [/uEtkl��J�����*o����4����88Pq0[*��{]>�/�:�z�����[�l5}���lV�_�g*���Q9���"����^Tu����]�2�&J�	���YP�2A�o�Z���(���(�u��u�b�"�;e����YS}�o�����rO���c,����V�����"�u\�E����-@�:��
�0T���T�}
�����Iu��T�x����<m���R�����DC�Y���M�)A~��6����j^�T�[��`Q�]?z�^�Z�f��#�����D������+���=����o��)��''�~���{�vF���,_�Uu�TZJ�=�>�{_83:����Hc]�e�,�V/LN+��5�gz e��E^,8#�7%����W-r1�M�|`]��,Y�����2�+9)	a������+9��l���D~�j��"G������"t��2_�ok�����sJtM]��g���s.+��(7�}����}����)�v�M�7����M+�B��d4��WV��R�)���4o����r��*�u����W��n���Y�
\�e�������]K����*R�a�0�#��#	�D��}��o�6�����_�hF�����|��m�>��mk��7�����ct���� %O�����P����l���"`1#�w����������}X�e=K�����O��]{�rY����-���^���5V�IKC"�^������lm��(o��m����M��A�����jJ����b����
E�����Tc�|W��{�?�����VY�d������+}`�k���&0�Yg��:#��N�%_F|���Ne��OzxF����M�\�M��(��*`�K%�ca������$
���I�����zWi�/�*�<:����������n�����Q��B���Y]��s-�V���<�&x�{fwJ��>���~
��k��#$��z�J�4f�q�<�]���W�����q<x,����L9�����M{@��l���Q�$�9�z[v�os��)�z�<���\/a�2�_�������MS���&��T=�P#�yZ���H���ST��T����P��E�7ST|s��o����*FgQ�������)*�����,*�����SU|7E�w�PQ�E��ST|�������*�gQ��)*�x��?NQ��K���E�ST�p��&-a�T|��z����cQ�E��Z�{�n��R`�0�{G���C`�u�Z�}�e�w)��u�,��^v�^����*�b���}���6���hU�p��Om�F��`����J�������������_�Wf�gy{�)E���g��o��g����������IVL�q1�(7mw�SLt#f���%S=Lk�RJ>������q������s����{`Z���z������T;df�}S��Ik�4�O�d�(���w2�����-xNG��(c�i,�
s�is����/aKx
�3�i���}.t�D���9���{�����2I|�p�D>qg�K�N�9��� �M��l���$��O����R�D��L$`�Y��`�.�}<�4e���!���~{rp�	�{}���\g9
i����G�8t�bc)]�!X|*xr�,��&�%��3Q���'$���"X|iL�`0�Q6���^�pL�*�!��(k,�%�x�Kl4��XD��@�2�4RjM�8f�V� z�I1r�B�|�Ez����$���"���H8F�P
���!x|)�#>��������C�!X|TD2|��S������d�_4��?��OXlLH�l�X��vX&�lx4@,����4t�ac!�,��"�Xl��s��L��� h|q7����$�|9
��s���,r���E"��G��.x,��'��NXlQ,I��m����4%��lX�:�$H�
��SJb`�E����pic��
~��"uXrG��-���,t�b��l�bK���@K��i9��_����t�SSMCPL�����$���bC��G�g!e��Q5hi�H9i��lKh
�F�%�)���-h"0/:�/��C�����y�bK9!����Ji�������q������Y�/
�Z"���`���/x�,5���w@��)�C���L2_K}���Vf����/6�)��T^��r1J�5��0
	�S�Y��HB����2��hZ�"l@cK���>h�>�d��+��|����
}�H/R�H��:�`��q�2���"h|�')�3_Bc����H	���&R����$�i_'���t����o\R��N�<gG���������Wj�6���������A�|��d�;����d�W4��=!an���-JY������)�!�����"X|���t�r�����hl���p���q*8LY
��S$<���w'����g_Jch�.7����"�Y4�O�#�����A:`�qJ��-`�	��hi4-i��	8��E,���,��fB�����K�\.��A|{���[��IIaJ�,6%`q_B��|A[p��nA�I:�(6ZJ�Y�?���#M����A.���C�Rx��"x|2}Je4>s�����H�@2
��	���_�Rh����pEn,>"�(�Z�r��?�u85V�*��hq��
�2�AH�zZT�~��AH�j��$�:�Ah����A��?[��~-��F��iv#��-18���������.�����? x|2�	���o���� ���J�5�B�R
���bc��!�BH���d��t� ��a���k�\.x�����e��������w�A�-�465[Q��46J$d�^/�����o2��okI����C���
|��
dH�����$ ���I�8��tc������A�KtB�X� <��n!22���9�O�	��?g|�> �~J����d)�����x
w�-��'�gM
��&B������A����z�"h|jH@:
`���Y���A���c	�g�����"����<	^�8���)��Xl4�`��!h|1g�4o���C���C������-R}Zg���1�A���������:���'�]M�]��>��u����PK�}���	�PK��ELObject 5/styles.xml��K�� ��9�KYc,+��)���LM� $SA�
�#� KA��PYJ����/�/c#w=�F��d�����bP
U_�����[�r�t����X�pe��?%7;'V�L�K�iE�a��
7�2-W���4	��?�Y�<�������=����������C���.����T�h$�1hZj���P?.����`<�~(��k��N'���������*���`���������G-��2��������nT'�7��ez��ru|�E�z�c=,�����C����<}G����\G8{�3*��h��q9v��/�Lk����b�[�v9H�>�.;��mo�����[g��e�������k>�>|^�����p�Vm�T�p������3KW���J��2��S�
n�����k�MTYy�{L���o���j-	.��Y���5	��Z�W�kLa������
�����=N�����L�
����Ct�PK�P���PK��ELObject 5/meta.xml��Oo� �����Z�T���NMv������M� �~��g6ni������/��ZW�L+�Jq=��:��L����&B��!�E!�\��e75X���es)E�QL�V�L�Zf�
����i6�'�J����m�}��}�jSb�1�����t���\`�`Lh1q	^����R#�V�Z��F|���|���_���yu����[��H��q���B<<A��~���|�-���d�/A��V�� O^&S�V�t����#z������ ,�!�
Jc�-�HP��r�wa�q�R�~����JK�|��d_PK3��5gPK��ELObject 4/content.xml�]Ys�H�~�_��D�����������������y�H��6H0��_�YIU�H������l�+ ����}���U9����������������������q���z�o�bQ���y5�Y��v<��-�9����y��;����U���:[��y;;�6�zw�y<����_i��r������6�o����{���������:�zsB�o_TCo�o�����6Y[$\�����wg�m�9�N���&wrR��)��O;t��l?nsS����l��y �L��OwcWy�
�/��YZ����z�h�6{���v9�"n�GD3������
����������U�^����
`����?�B�J+�E����f�4����UU�Y
7���+S��s4����wu��u4|���YV���V����F���`�{��h�� �=����>�_�����u��_<.�M��%S%���������`�&hK�y�nW�qw�n����v�\o|[�wB��y{��nr�g��l�
����nc��@C|��g�Eu��)@���/���u���n;GO�m�������=��"/w�b?��������7�6���8;���a��Q���01k�����1
�8$G�[JQQ �.w@v�V��������E��!��:��y������d�h�iU�;��p��X-�2?�^^L<s���,L|�"��1j�|V��r�)�Y���z6�_br��]��g������zy�3����5?�^Xd��|����nY������u[��(8	<������u��.��9�<��SL���A��M�mgm}���SWm�8�l�5��PJ��E�	UdS�/�r����]CT��������~�`����5n���Y���Z����/2�Tf�+�|YAE��+~���EY���/���&�,P��@��e/��*��Yy3����|�����,!�,����?ci�O5���y�����}�=����|��6�1u��n{�����v�:csx���]!��u�g�1/��2��K<��ZfPC^��Y"�:Y)�@\��^D[�k�����W �?������^�� =�xQ�M�<:�I�hA��M=K���M� ��G7�����5�e��W���bG���������Al?i��9��U��t(Y�����d�/��O�-t������y>����P���
�)��g)/J������^����\
�CI�Ho�=KY[?��J�Gz��Y�6gL�J�G��Y�N�������K���@��+(3~()i��J���b�vK!���B�����G����M�.o��j�����ty�_��������3�'��V��������}��mm�_�����d���>l�����]K7+���J��*�w�c�+�;N��
�`0fb��qrdim�|�a��kT7���},G�}�y4�o��S�y	��Gm5ZW������t{��4��c���J�qVG����7����@��#�����(������G��m^��f��~{����?e����Q�!j���~�cVN�t1��P�_�lf{~����fh>?<l�6e���:���������q
�)������	�{���*_��z��G��j��=4�Y��/������>\vQr|�5�rG���z/������(���s?1����&V�o'_U����j�Y�3_������h)S*n��H�������2� �u�U�U��n���7ud2�?�2��x�VUz��!��<L��ee��>�K��Q�u�tt�3�r�7����Bx8,���B���
������,�Q?v�~���Z@�X����*���e]�>�'�q��OUE���eB7��9�Yy�7��S��)�o���9ZO�Ed��7�:�<v"�S�v�v���p��x"c/�!��o"�������|?H��O"H�&��0H�^+����$��o"��������8H�O"H�&��4H��^+�O���$��o"�_	���
��A���$�4o"��������<�*'�]V���hk�E	���Q.z��}���+n���B����������u���:��7�u���b ��;^������?
������R����+	Y0�]����=�\�U�m.�6��>���:l?��J���"�����]�a�x1�?�b�#�F���n^5����4F�1z�.�(�3��1�W�cp�B?��Q�����L���38�S�gq��j�W�dp:t����R���?$$��=CH8��������N�M��F3��^*�8�'�+���u�o0ek9LIf����SN�W���+$�b����b�Sn�2�^�-�e�O�O@�VJ��ZE{)���:p���x�W�B�A�6�d�2�\�&f��?�Bs�=6k�27��������;��i	O9�^��v�_���.1G��"��x�p��� `i�������	��Jy�BF_����j��#�N�\Y��3�{L!t��*D�KL?F��k)�b��\rL!d�=�����N	D!����O9�Qg ��smP�I 2�1���K���/��C�q@3� :8&8g��T��������I_aD��slL�����$Vk��7si��@'�b��"������V$Y)F��e�i;/�UA��e%o���+f������ �('�������d�E:�Jc�Gu�=7L��!�o�`J{?�Ir���H	������z��D�Cd@������7����V;!�a��$#"�N�e���IN�Vu0�FH�9@a�jP��2>iQb���w0C������,DJ�T�>�<D?����*�n��NJ�t��#�~���2:"�D�����~D&�#�m��a�ZX7�O ���O-�
tq�@dp�aC��	� `�d� b�(3vm@j`��e��9���A)��4
/`�0+(����4i�b��H�a�L@���Ga������o��m��Yw\{���
�Ad"�Z����8�O1t�P�I���9.g>B��\6
`��Al��I�C�e�e�*�Y�p�@�����C�Q���Z�G�!�<S6Y����U ��� ��4�C�J�>���BT����^K����XBI��!��r��Z0D�^>D��������'��{�0 s�U�+���CtH����
�2|)��8
��1o�Nr3��������s�����N8�l�Q�
,>damEZD!VZ�T��Ez�(���b�����_bkL��$\���	#$����@ZHk�LjQIz'`<l!�����Q.!���.�LfF�� B1.\��#d���S����]+B����1���I���P����\�
a�Bc)�	���K�qC���>�H�a����RA��R��6BN
b���Az���g�+��!B&�#^I�5�K�n-YX�eX�����+v�V�����
B�������@"Q0J :\X��@b�O�]BtBC�ca##��.��I�t"���:����_�!�z1)��v�B�mqB3"���X���!:-8���,��q��!: �N�:��fAtZ�x��q��d_Cta��2F����5�N�-?���Mq(��1����,�Z�I��cp1BW�*�9��2|�!t����1	��$�c�N�r�
E9x�����	����!d�w�`
]1.�c�tA v	�s��Ao��������r/k�������`(���>Y2�:����5D[0�dkAt��
��]8���C�����
���[�"\5�����`��~�N�Mxs�OB��C���(��%3P�d%=F���*:S%E
B��*��g)�9��BGZ�p�bR� �pk���0�F�l� �P`�P��p?	1t�P;��|>}�	_l�3��8'j�`�l����!�/5�AV��i��h1D�
%�	�'��#"��l�D�N��bv�Y@x1���y&�)"�h(n<��r�k�.�y���������p�-#�p%���Z'�#��Yx'����+"�l��?�?B����B�����,YI��n*0�|����#��M
��@7����u9�.�~A�
L�%7P����=Q�BX�f>|{���K50BF�Izrpzt";E��Qx�����E2�(�e�7EC��O������^i���`�x�:����#���1r�` ��������&r#���q��1��m'�w�1�����Z0(���'0�p%�C3��t'%F��C-.�vzX$��&���	/J;����-�X	D���a�H3���V�@�Q�$��$��L��a�&y�Ct]�tP�@W����	B��H�w��ph	#t=��<|���F3��1D���K�w#���`du	B�r�f�/(eKCt^����P�I�W
0t�p�!����R��{'�;�B����9�`r�
�������0|f0U�c�ps�!6M�H�#t����$�L�����[a�_��/A��9��;4��B��@z���.w����������������}�W��U�n��j�����PKO�`��PK��ELObject 4/styles.xml��K�� ��9�KYc,+��)���LM� $SA�
�#� KA��PYJ����/�/c#w=�F��d�����bP
U_�����[�r�t����X�pe��?%7;'V�L�K�iE�a��
7�2-W���4	��?�Y�<�������=����������C���.����T�h$�1hZj���P?.����`<�~(��k��N'���������*���`���������G-��2��������nT'�7��ez��ru|�E�z�c=,�����C����<}G����\G8{�3*��h��q9v��/�Lk����b�[�v9H�>�.;��mo�����[g��e�������k>�>|^�����p�Vm�T�p������3KW���J��2��S�
n�����k�MTYy�{L���o���j-	.��Y���5	��Z�W�kLa������
�����=N�����L�
����Ct�PK�P���PK��ELObject 4/meta.xml��Oo� �����Z�T���NMv������M� �~��g6ni������/��ZW�L+�Jq=��:��L����&B��!�E!�\��e75X���es)E�QL�V�L�Zf�
����i6�'�J����m�}��}�jSb�1�����t���\`�`Lh1q	^����R#�V�Z��F|���|���_���yu����[��H��q���B<<A��~���|�-���d�/A��V�� O^&S�V�t����#z������ ,�!�
Jc�-�HP��r�wa�q�R�~����JK�|��d_PK3��5gPK��ELConfigurations2/toolbar/PK��ELConfigurations2/progressbar/PK��ELConfigurations2/menubar/PK��ELConfigurations2/floater/PK��ELConfigurations2/images/Bitmaps/PK��ELConfigurations2/popupmenu/PK��ELConfigurations2/statusbar/PK��ELConfigurations2/accelerator/PK��ELConfigurations2/toolpanel/PK��ELObject 10/content.xml�][s���~�_�Rj�e��EV*�=���C2[��	R�	�,i��o}Z��tL�*��6�5�����
����j��h��^���cv1*V�zV��.���������]��y9-.g��nY��lZ�:�ww���
����Y]�y[���|Y�����^��]����~����{��������n��a,�7�>s?8�{���CocA����z��m��k��r�weB�CU�~{wq�u������~|/�u��p���G�O���wM���M'EU���	��n��������1I���M�M��O��~^���������`��c���p��Y|�2�nO��M~�����l�Y�+�E��6�z0�����u]�I
7lhO�`LM6������o��h���g�O�j��x�<&4�'0"+>3�~D{�1�������������cz[,�������r�v�� �&(�$�z�������w��-����[V��{@wC�lvt(�#'��a�e�����>o~�BK��;8���b������` �,�Qh^����\[���)�W�m��	��W��x�6rEO@��,�����t�1u�-[0X&��2�G�f�0�qai��y���ML�Vv�����O����;S����]��u5��r�����������\m�y������d�h�iY�z�p��\��e~1���y����40�(�M����f��\�U���i3����0�q��[<���=���������
�O	������y�,��p),��-�&_�����������E�j����zU���fxn:��t��x�Mt���u[v�it�]�{NSw�����"�T,P���P�g�k0N�"���` ��nO��r^1_�C����-�����5�����k�2���q=y�9� 3�^��2�?����b3z^V�n���~ha���e�	�(x({�@��h��Vw�"�-g�b�M��g2�����"h�j|�k������{�=�*��E����1M���6:�����v���9���b�H���"���0fe��1�����,U�"��vYN�4E�J8���nD����J�"������q�]���p�P�e��i����L�">����f��;(�HA��q���A��/�pi����I��:�����?��Ql�����i��*:-go���d�/��O�-T������e1���	�P�
�?|��O$�����s%X�]I�D��mKy&���|�6��������w%����,e[0&�w%���,e'��|�]I��E�7 e�����OFC%��U9{�V�`�����(�=B��������F���g��=M�W������/ga�L��|��H��mP�[�_��6/o�b��b<�}��A�e�����Vy�nEpy�7����-�)]����`1f���Q��|�x��U�����?����d����y����T5E��\��z��������d{��$�}GJ{w�P#YL
+}�y������������������#3z}ZuE5������O�3���;��bQ�f��CT��(�bG�s��F��{���]<���f�4_�E[������)��!�lv�C;,k�4�0�5E�����?�����3�D6j����y� ������O����8��Gf�y�iv��n�REBci������k�SSwc���-�u]_N��w�w�9�E0������Hg1cg�,(;����|Cd��Y[�<�X�z��A"��qu���@s�Q�,��bvf��v�W�~�)\Z�M�H�����=N���|^��E�x\��;a�`�5����\���������{��]��)gG�������nNH�-�C~��K�{����+��wi��C4�����W�f��L2`Y���c'�~���r����,v+ND"��m��[��!������Q��"��^)������Q��?��W
��!~8��[��!~|�?���Q��"��_)���������?
��W
�����L��yU�=$��
2���\��}my[���o3��U
�n�9E�Fe�E>+�Pc�-W-�6�D/����=�V���AX=��/>l;{S�'\I���e�O���+�sh�x��C������]���C��)�W!������������W��4o���M�&��e�L��c�z�M�(�����k����s�&J�+|v^�`�mJn�w0u�^����9�t������Qw?$����@H8`��|�6��R��3f��^Zm��	��`6��B�.[��q�h�������u�oX��k0,���&�dN!�1���8�C��^k.���1ml�p�.��&|���;�a����z]�V�
���?B()�EN����aU�WY��j�-�N)'�F������������"��x]Yo����L������B�gvZ:nW�!
 ��i#�3�Z����I�1`L\9��kC�
h%�Q�)�!2
Xx<�����g������w�0-��1����� ����tJ���J*�q�E����q��6&����)K��K���������E�K��u���������=F�d���28'
�����%�6�0�����9��jEi�^z�����&x@��Rk���U�pFYP�	� ��\�(�:���a�C��F!"�fr�'��
x�9$�^Z�d�A�\��h��#gs��$Z�}�i���:p�"�Hc�.��w�
��B���R���\(B��:�s!�)�
�J�P���l�
b�L<�3s��t�:W���^9+8�� B��
"���s(| ��\C!�� ��0�C�Vzn��0F������k,������u+�������� :
 ��\0���I�5��4 ��7i�`�4B�#�"��uNKc�ln 
���)$��~1��&�
�]�Nx��d��
F��w:�:)�d81�]q�����p�
�!t�����a�gD1BV�1�^s\
.1B6�g�����B�1F��"�H�&��/�!��=�@�	�
�\A��Ga�(������"�N��������	1B���py/�Z���]mn!��R[�p��&!b�U�)�\ F��"�H�Yn^
m����4�!��*�~����O6DWp��'UR� �NakV@�j�$C�
a�))��'�+
d���Hx�;4��G�g�v@���U���p�H
Az���'�p���������ITD��N0w(�ZLB���za���d�At((@����DW��3*^J����'d
@aLR�����A�{���2�K��N������s�H���[,0�5,<���� �N� �9q���B��,7��2��C�!��d%���9H������e��z�a<?B������+��=�yh�%��B��BUlU8��#�����{���1B��7L�9��Ba��@H��y@�6�!��#�� n�����+�S|�a�a@��\A!cB(J
�D���\I����!�L�C����(����q�E�!�R��TZ*amZ��af�v�d���*	8'����0H������
���F%z3+���b�&�rQ���&9o�;��X��6�K��jQ���]px
3����C9&��IH��]>�I��O�@��I_*����.��B����V�C�>j���9��(���[� �N8�F�"�FP�B��<�FBW�0��0K��!������mS�&e1D�
���[�]������O��M��G��B��V�`�\'m�9��{����p~-�a��(���0:e��!t��X7�3e�v]�:b�����1D�����g`���,��=8{g`��,����	�j���q��
��)���)({4T��'� F��`����#�ah`��?`��pP|*���O :(!���uX��D�F���Y�a��T��t��PP�I/�����C)L�	;�dr�C�s��+�v��bo(�@�IXF:������Kt��#�2,���(�an^���Y���At�!������C�f��;!Q�!B
Tc�[&�L������z%�O�(�A�\'�Oc��qL
�DB�"��F�pJ�q�#�����oP,m��a�jb�r*N����?7�v#����������[�q�"gs":o(��}�7�U� ��m�CE*���B6h�#u�$��#�LN���V��d���1DX(@M��,!-OEY(`����������B	Hi�q�B.��J1t>w�T_��/�_~�Eo��C��;�|����$.��;�.T��e���sB�l�����SIv�!����W!��U��+�����\�����F��!�NX{m�L��"F����2$��Lq�����w��@d��$��p��=v��2P�t��L��v������>�u�&�Ct6���>�
G��
 �,7P�xu8Vh��u"B������H�W`��� ���K���������D�|������Y=�[�.������PK�I����PK��ELObject 10/styles.xml��K�� ��9�KYc,+��)���LM� $SA�
�#� KA��PYJ����/�/c#w=�F��d�����bP
U_�����[�r�t����X�pe��?%7;'V�L�K�iE�a��
7�2-W���4	��?�Y�<�������=����������C���.����T�h$�1hZj���P?.����`<�~(��k��N'���������*���`���������G-��2��������nT'�7��ez��ru|�E�z�c=,�����C����<}G����\G8{�3*��h��q9v��/�Lk����b�[�v9H�>�.;��mo�����[g��e�������k>�>|^�����p�Vm�T�p������3KW���J��2��S�
n�����k�MTYy�{L���o���j-	.��Y���5	��Z�W�kLa������
�����=N�����L�
����Ct�PK�P���PK��ELObject 10/meta.xml��Oo� �����Z�T���NMv������M� �~��g6ni������/��ZW�L+�Jq=��:��L����&B��!�E!�\��e75X���es)E�QL�V�L�Zf�
����i6�'�J����m�}��}�jSb�1�����t���\`�`Lh1q	^����R#�V�Z��F|���|���_���yu����[��H��q���B<<A��~���|�-���d�/A��V�� O^&S�V�t����#z������ ,�!�
Jc�-�HP��r�wa�q�R�~����JK�|��d_PK3��5gPK��ELmanifest.rdf���n�0��<�e��@/r(��j��5�X/������VQ�������F3�����a�����T4c)%�Hh��+:�.���:���+��j���*�wn*9_��-7l���(x��<O�"��8qH���	�Bi��|9��	fWQt���y� =��:���
a�R��� ��@�	L��t��NK�3��Q9�����`����<`�+�������^����\��|�hz�czu����#�`�2�O��;y���.�����vDl@��g�����UG�PK��h��PK��ELmeta.xml��K��0�����-��1�f��T��T�]D�%CK�������d:YT���;�smH/��{�����
��h[������/�D����VU�A�V�'0�?�+��j:�,e�o��EWw�'������luK�9hQ.Mm~g�����x�`�1M���Z�+w��f�J���)��4�xc���[jbo+Yk�A����!/�}l���7���xlX���ax@�:���3�o�;�����n�p#��f���'�'��1E�
i 9I����;�����5T��w@$Odr��
[R���x�~��������~�����a��M��
t9�����G00�m�?�����c��
??����������sk�vX��TB$4�B��q	,�)
	4T&��"Z+��-���s����7��84�k��!�QC�lKbNV��*o4�S�����%�PK�A�lPK��ELObject 3/content.xml�]]s�8v}��Py+y����q{kz�c:����I�V��@���%jI�m���%7=�uW����:yp...@P�����^|.��j�o�p���6o�j�~s���~�������M�ZUyy]4�����Q�l{��B]���m����v{�d]�]o�M�]��u�+���k�����H�?��/7�������{��\���g6����6{�{���D�/_5s/~��h�(�7���&�x���oo���~w�\>>>��4n��K)��tlp>��=���U���.5Y��1^�������O����}����li�>��W�����y}D��>kg���v/-�w/-�k7Y�O���������{_h7s�t�@���v����������/��4� ����W�����m���W=�z����x�9$�����FT~�n::��;rY���rW�����/�}������W��m�g��2�����&���5m?
��0Uo��m���>>�u���n��`U��TC_
��sU>�)��/��\�J�{�
����5�v��32(���v=�B��a�LP3� _��+�Je���:����u�;n9�\��p^����Io�4��S���I����g�v�4�vzh4�jz�I����������-uY�'G�&/) W�.��F��*�L��nol�B�E6������t5��>m��i�Z]WT��Wc_-oo��9��#*���du����T$j,���-8P�b�\��mv&M����x�m�ln~��e�U���g
�a�.Y���^	�S]Z�}Uv=,����7u�m����Kt�e:��'�����h�tUo���:��mz3T�l��Y���E���{���*o���U1��cc�8�m����.���WXM���KV,�[�_g5;���W��B�b�_7*����l�UU����UK����$������u�&�K�j��E�WEQn���kCVY�)�_�4�����}[f}Tnv���c]f��h��\��Z���C�({�qm�R3-��-@�:��F^�Q���T�}�����C��f����~S�y�R�C���m�[��r��S��2�S��6�6����j^�V�[��hU�]?��^E�Z����'rgOU�uzqDw�o���+{��g=�BO~r��'_��`�h�|����Y��]:��s���y�+g�/g[��NR�Khq]�2j������?����������#���D>�P��E.(A���G�%�������+��,��a�E�����G�F���)�����������L1S	�w%��D�"ge�B�����5������*���4���\VhQn�|����}����)���M�7���O�����O#	����w_�="��$&X��I��}[��\����?�����n�`���������������%}�kA�r�	v�P:������[�f`w����]$����r����}^�Y��,�:7K���ww?���?�=�O��/���}N�g��g�%���?/>m��^�-~���mq��9u�.���������^���kk�(h+�1�0N2\_>���}X���<l��evu�GY[f+����t���Q�V�*E[�>��L5���������{�l����?���W�D�k�
�&*F�Yg7�:#��(��$�zB�������2NY2u�4�	S�`{�4�y��*Df����Z��XH,�$`I���q��)��]qTXo)��b�r��'g��z�VZ���p���M6[Tv(�H�[Sh;�<���=W��iu:�'������m���/k�|X�����1�,�!*���A$�b1���y�-��~9v���8xO9	������]��3�I�D�>��������Qo�t����3C�r��e��~��NN3�wM����]�<�P�xZ��������sT��T�����P��E�wsT|w�������*����~���OU���_BEv?�Q���*~����K���E��sT�x������*�����:U������%TgQ��?����YK(��>�a�_`�j��9\KzwWz*6+�sX�+�F�"{�3���YQ�z��a���2j��]qt�������^,c���7���qR��	�r�(����l���"��+���'���m���O��Wf�g}{�)E���g��o��=o���LVT[}��$+f���V�O��;���)&��]��Kf�z���>�|�3S-x+��)3s�?�����������wj�9���#��Lth�<8i���������
J���Q&|�>s����-�4�1�7�!���3w���#8I-t��<s��B��\"���CN��g�A���b�	"^��i����!xe1��H�E���~���c�i8-t��?sW���Q�H)5�i����x�p���#:��<a�^��O�7�{������2c���n�0��$
��'0��1�3�xg���-�)K��hj 0M)I�45� ,H�F�EF�`�y�+c,��; @2�8�*��ev#a	F!���q����SUp$BQ5����!�F��D,(��x@��8&B|�X(�V^�h���������MPl����:���D�U�E���2	�N`jR�h��A��x�&�g������r����.�b��0�1\��&Z�	�q@h��b&�V#��":Y�h������-���$$�Q���%)g<�3�����d�j"FI���#��N
��H*I@h0>B�����T�`3m��$9-����*��������
�p�P�M,P3JKD����cd�O5�G1Vz�rFB�����d��B��|b�A���4I����vR���� ~��1Z�)���nv _:a�-�)e�m�������	?_(6&�ZZ�O�����"`~�E��E.6���#@F������1r&��l��15!����!0UVLX����z'Oz�@`���#&~c!8F���!�F��H,)"^tu���F��jSD�H�p�i� )SF2���	���9���������~9�!����T%j�`I�;@@�T�>��W�AP�����H��.����
��xD�FI �C��8GI�Y�/�	�>����T�,�+�������>$��v@��$AZ`��
~?��,H�R&��v���������`�`�Nb��4�!@|i,1�����a�"&�R�X������T����b�p����$��#t�p�g�P�
�~�����C4�c�C�������a��_FI���!`zb�
�i8>���O#`z
<�q�,|��A��c �Mc=��)s��� ��0�'��*�@�)C�S���K
�f�4�=���^��S���	
NM:�r�����)�J��`x������?��0a���cdI����Bp�R,�H(�:�#'2x~9Bpc�� �������j��w��u�1���� 0F!!���%S���� p|<e�v-�H�����f!��B��<r��Bp�
�l�b�q����Q�
���#�H��s|G����K�$d���L22Q�@`~C���>8LU����!@|j�b��fr�����e6�*��,���������������O:BPCTY�R��r1�4�8xr:BP�
5G#F�q&2��`F1��L�D"�v�.��$@�'�y��|�#���� P|i�����R���LK!������N\E�}QJ���a@��h���\,�":�H��
I�?l4Bp�s9a4�J�����O�q"&d�13bP�2o���4B@�B�����
T�T��o
�J�������A����{vM	���bT�JY�0Y`l��`c�A0�j$8�c�C�,Lb���:�1!�,�,t�����Z�k$Bx�
��\8��9��J#��8��Q�i��(6��'��&(	�V9LK�B-5�%��W:���4|7�Pl\p�|6�r�O�.�n��3~��������W��OE�?l�m���W���PK��M���PK��ELObject 3/styles.xml��K�� ��9�KYc,+��)���LM� $SA�
�#� KA��PYJ����/�/c#w=�F��d�����bP
U_�����[�r�t����X�pe��?%7;'V�L�K�iE�a��
7�2-W���4	��?�Y�<�������=����������C���.����T�h$�1hZj���P?.����`<�~(��k��N'���������*���`���������G-��2��������nT'�7��ez��ru|�E�z�c=,�����C����<}G����\G8{�3*��h��q9v��/�Lk����b�[�v9H�>�.;��mo�����[g��e�������k>�>|^�����p�Vm�T�p������3KW���J��2��S�
n�����k�MTYy�{L���o���j-	.��Y���5	��Z�W�kLa������
�����=N�����L�
����Ct�PK�P���PK��ELObject 3/meta.xml��Oo� �����Z�T���NMv������M� �~��g6ni������/��ZW�L+�Jq=��:��L����&B��!�E!�\��e75X���es)E�QL�V�L�Zf�
����i6�'�J����m�}��}�jSb�1�����t���\`�`Lh1q	^����R#�V�Z��F|���|���_���yu����[��H��q���B<<A��~���|�-���d�/A��V�� O^&S�V�t����#z������ ,�!�
Jc�-�HP��r�wa�q�R�~����JK�|��d_PK3��5gPK��ELObject 2/content.xml�][s���~�_�Rj�e�����N<�8���d�j_!��	YR~}N$��$eh�c�U�������~N7��?=�����n�j���N��$_g��X/�]���s�������"���U����m�U��������G�]=���*m��z��������M���u�������4�s9��n�w�?�covc�{���3w����u�8�f7��������������6i[DT<����wW�m������|Z�����:t 8�m��5�fy�������n�*o�����>I���]^�fM��Rm>/Gk���	�d�i=Z7���x�|�x���w���'dbf�����_��P��������b3z��h����R�
��v�2B�����~|q�c]�y�
�^��e6p�Zc��3������������zx��O>�������|��_���M�{��N'W*gu���v`�b��i����vU�6w���.����P ��������E������v�
L��;(�u�|�����aP�����CZTkXD�-���M^J�����	�����x�6ryO�y��;1,��c�*Y5�>`&����;���i���iT�E���MdM��c����fK\p����K
���.H�
|[�%��nnoz_�u���I�������\E�&�O�b��������h������fv���3`��[�2?6��f��Y�J�dS�Y3�A�"td�D�wL��a ��8|�i����=$<��W��tU����3��-�:���7 ��n���8#�G��o��u��;�y3�4{y���?Y���M�m�m����SWmg8I�^���8jz�1�����,�)�	)��1��	x�t}
t������+V���U��V}����n���V={�:N 3�^��
2�?�q��U?zQ��n�pa�+��h���z�3�����w1�Xg��<O���<_'Y^��Li���_�4���_n�<m�|�i�wO,��s�,��nL],��^C�I���N�cW���x{�K$�&�����g����]^�K*�e
9����"����J98�:�zm����R'O��!�
�{���@^�'5X�(�������[�cv�Pg�����D^�����
��~���H�oO"6������U��E�����:�zQ�c������K����|o��F9����9$��+��V���[Thz"i����XF����'j�o��s��w������e���f��O�B�2�uN���OH�2�
�������k��o���
H3�+.�(��r���b�v���d!�U�{���������F�����������^��?;*���>cd��V=��s����&��no�����������y��^8y�j��L�f������]����`w��E�8
����)�zG0�����G�VyW�nn���k�'�|�q2����R��y	���O�j����|��f���f�M���y����Dy�������{b
�0I�o���o���'j�4��n�r�w�	����'���;��|�����W�U-��jG��R�K��u�;����?m�u������E8U��MY�IZ����z��z�
Kj�L�3��u��?S ����uv�K&�4�UZ?���G���8���;"{_����>m�^G���~���c�r=��V���J*cM7SC����������o���8��S��|JD8��,�EM�>�'=������2�pV�V4O�%������H�t\\j{���5Tz�t^�_��-���2f������C:K���r��8���2�����8�qoB�`}�0S�NZ��[��j���7y�u,�b~��6r���U}�M^����]��s>��C�$�KR#�?�-���~��L2��a��x�cGg���X�C�r����������mc�H�����0���L|?���/�D�L�i:��?�a�Oa"&~��g2��&~��[0��&~<���0��E�(���?�a��g2��1L��"LTo��Oc���L&~�t�1�1-��,���xQB�}|���<�&��u�k��6���(+�w��]0*���y^��a�nB���&z�G/����Wm&{fu��}�a����1�J4-(�.�=xt�EW�chNy��C���]��]���}�u)��7.���Mv�fy��lx��l7�����9gc�2�EL�kr�H�&H�������9������M�26W�*�9�`�m��,`\��{�:�����.u>�X�9����cl����W���l���gl�-�||AS��QL)��T�[_����uR��K�Z)"��
�����:/���z|�K)�Z[�X��:/6��P|
�VJra���B��+t��D����r	��%��&��9/������:�qJc	�H���8<�B�*VT	F��U��|���U��?`�]�v2�����\��i�$�L����B��hc@��I�(!
:���e��|�F��C�d 8�db�6�B�@�c���5!>�6���l��r�e@@�i�e\H��$�A�H�;�L���-LHa���1��1R+5������}o~�BVk���D	P�<gDE�!L
(g��T!!��d`���o�x(A�����9�0��������8K
 �2L��:T��'�2���6������P��	2�{��VP���U���wk�f�+r>�'%a��I���M���k���z
�bn��	"�1�=F
`�z���y�VV�V ���6��(:*<q~*�$\R)������c^���A>6 x����9�@���0J��GM6���f$�S��e��(��R��t
�@tAB(����#�!�����	
��<*	�j���A5Q�C�a�.�wc�&Q� �ac����Fe��\�x�	)u�����`Z�J��D ��a#9���G�B�����oU��i�qI5��A�B�7�ph��Y0(�0;��^Ah��|WS�D�r1'�%^���!����)��5(���?4���2!,���(y�5MS���a�<�0�+� JJ��������s���wl<�q
���^`������G���+���:"O|s��A�e9�$r>���Z+
���@
�(�5�J �B�����A�����/%��V�	��Xr-���W��=�#s�xDDW� ��R��j��tF��N$d�:�V�byb$d��5�|�8����#B1�g��'r�a��x���PKDj%��v�q���R]W4��G.�|�DL��t4R(�����`�/�VRF��������\C�7Z@A^"��R�,L�������o8`�N�g�#X�s������V4����_(whJ1a	��9�&�x �_PXz��@!&(�~i"_�#�]
)�����K�!��'L�4����!��gTsI	"��}q���"V�85�� H$�P���d=�rn��XkT.��������F��!�)
N7�Jm~��&VA�a�#���n&�A!v*4� h0xc�N��Q@`y�1����k~�=��2TP��t9��{ID��ZsB��i����
L�_�����s����-��[��B���}�BW�)�;Fq�G��O���n�0:S�#x[�Pz��W��YQ�\�	�L�<U��`���2>U�!��*��B��&~�(�#���`	���U"4�`�(~��l�ZO��/>V�Cx(`�T�e���#�V�N�����`\���#�MN��`��UEQ��Cx�q�Y�($�����G��_���n� � ����Z��������L��w�#�Z �<�P��`!Z�� kMu��#�s~�����+��PPw�+�C��jP�������� �fw)�T`v��\@hZ*p{L9�#s�Q�sg���4,JNBO��bL��[JC- <=��X
~\_�^]�!���C��YSCl�<
 <u�Dj��u����9��(P���9`�	M2�07�!c���a���G����#���X|�-:���$r��G�����q�@�C�r.��oETF(
����xo��f���r)!#������6��k�\������
H��[W��x[�C�&B��8�Q�@X�os'[!Z�!�6���i\UK
�!r1��3���a��m�&dLi���!h�w����@0 ��^� 4
��TR���51Sj����V���}�C;�C��Dg>����Y4�a�dAh�,��,W��n]�x���5bPSw�E�W����&D?�sE���}�!c ������ v���u��f�_Q;��TA�vo��o��|	����Zx>�7�p��)��H��
����k
O)���b���dA,P��
.��}m~�a�b��$�����Ya�;�_�!x�sk�wu	����w�('�E�A��M���&�u�� �t��&�t��!��*��Q����P�>���a���$��-�}�/PK<��"��PK��ELObject 2/styles.xml��K�� ��9�KYc,+��)���LM� $SA�
�#� KA��PYJ����/�/c#w=�F��d�����bP
U_�����[�r�t����X�pe��?%7;'V�L�K�iE�a��
7�2-W���4	��?�Y�<�������=����������C���.����T�h$�1hZj���P?.����`<�~(��k��N'���������*���`���������G-��2��������nT'�7��ez��ru|�E�z�c=,�����C����<}G����\G8{�3*��h��q9v��/�Lk����b�[�v9H�>�.;��mo�����[g��e�������k>�>|^�����p�Vm�T�p������3KW���J��2��S�
n�����k�MTYy�{L���o���j-	.��Y���5	��Z�W�kLa������
�����=N�����L�
����Ct�PK�P���PK��ELObject 2/meta.xml��Oo� �����Z�T���NMv������M� �~��g6ni������/��ZW�L+�Jq=��:��L����&B��!�E!�\��e75X���es)E�QL�V�L�Zf�
����i6�'�J����m�}��}�jSb�1�����t���\`�`Lh1q	^����R#�V�Z��F|���|���_���yu����[��H��q���B<<A��~���|�-���d�/A��V�� O^&S�V�t����#z������ ,�!�
Jc�-�HP��r�wa�q�R�~����JK�|��d_PK3��5gPK��ELObject 1/content.xml�]]���}���l�}iH����z3q;�$}H���t��%)-JTI���__|��dn�k�3�g����=���vo�y\U�E��������Xgu^��������@\}s���z�(��:����XwAV�;��L��n���WW�f}]�m�^��U�^w�u�)���k����2H�=U�o��������z�j����Mg�����&}�z�j+Euo_�So~l�`QK�W��+G�x���o����ns=�?<<�4���'I2�W�gC����t�<�U���9���]]:������vuW4��I���W����ay@��>m&��n������Ks��U������$/��~�q�j*�j�I�5�f����{]�CW�
f���������~8���)��q�gG�gi�
���}��vx.[��C�+!�7���<4n�����O?����t���x��\�]��)�('����bS7� �bz���"C���Uux���������Mew�\}9��e������C2���!v������5?v�j30����f9�B�z��&�����x�M�.�����{��U�;��\��t^���I{S�����#�I��v��g�f�8�qjh��b��Q����v�������Z�&G��{&gQ@�n�
 �v��me������\��|��L6W}}u�7t5j4�?�����R������c_�oo�{�9�(:D�Y�J�`S�Y!I�X2�S=�s�h���eSo7z��5��p�M�w7���2�"]�����0��,�ts/��H�MW�L
����M>`]�
��p�����\23*���-;���9M������ZE!�sI����E-�Q�����!��n��������j~�������������{/���/�::�����L��zDv�����;��\�����l��\��,(:&���;A��e�K�r�U����</�AVT��!��j��G"��dLu��)�.(V���>�*�E�L7�MS.�;�y�>��6d������^:��
�4T��le�}
����|��z��U����F�4���
��"3��u)'��"����6�&�w���^���[��`Q6m7z�*��%v�m����c�:BGG����c:~����{���������_r����������xUu��Si1:�h�X��pf~>����	�������E���G�i�?�x�������EDP�E�|�P��E�)A_�����Xd'9��(��A���q��_��J��XdA�t���D~i5vy�)��������i�-��5�}�&��m]�����&w��e��e���=��w�/�����A������[������H�BJp�2��j�H:��1��~U|}��WWah?wO%{��m+��J�����.m,����m����RT����CB���R�*Q�=B�y����7�
���w�g���E�4��FW�7�������������!E���a����������]������������+��/4FH����Yoll��bY�����)���N���������!'�������q������b�-��.saS�]�6E������Q��4���� ��B��O���_��uvo����j�6O�J�-��h����>����bp��f���2�"H9�������6!�l�"H���u]_gu����v2UK)���������%�c�8Lb��A^��4l����3��d���)�"��~o�V}�Tf�<���+C�,���=���nT
:����n���-����x����~�������bJ�_����$��?�"��y���ic����g&�,�J�]7th�f�eGd��!��E�.7��������G�az�����z�o�r�
;��B�j.�q�3�MQ�C��&(���
~7A��.� 9��o&(��D�LP��%��P��	
~���OP��K(�C��|{��o'(��
�s(�n���NT���]BA~���'*������9|?A��'*�~J}��CZU����aQ�e��y�P��%�^����5����ee���^���H��Q������P�������9�7vbi��}X������p���g�6�F�p�QEn_g��:U��������Uzgy{����h��3��o��o���L6�ku����c!m(7M{�	���&��<;���t����:e|�
�U�6��!��7��������-��lwb��6�O������o��;IM����"iw�]Q����)�L��;�����%��lg��4�N������������I����+p�h��0�xo�N����+}
�g��>�4}O����N��Z9��#'M��vd>En!����-:i���_�I��B��T�I�����Ob]�9�=
��.���������w��yeuF��z�I�3=Y���$I<>���E� 	�
�h1�3N�D>�g4#bD�0>��<>��EM�`<�
e�Ln��1;��{����#�"�P!`|	g�x|��a�)rG�**)*@>��(f4�)��a���E	������R�;^�2`b�#w�#`|(����c�D��)�-�)�}>�y������FF6��	Nb�P#`|D0>��@KNg�d,���E�E����>�B��8��;�
#Mh�*���E��A���qA������9�5���cT#K|�c4�!G��o-��������}�@�*d��c�$�S�G<�-4�,?��QCp^�^Eb8"9
|*�b���@CSyq��u���#%#F
��$�T�@Cp�&��<mH/���)��]=�3w��"p�
���(���rY��n�.��5
���\�
9[$��C(q��ha������!n}�`�E\$��N#`|r�������� <�
���
weg��%gZ�O�\��9��"p|��n 
�H"/��1���F�1r���g4��"�b_T���1*�:�B�yQ�Y����XB��9M��G!���Rq���zu�3j�1�$�	��`��� 81wwb,�����5�i������!�4qS^�\.������H���e�0�QF<>��"�A�c�&�b�!�,���XLS�c������\�D��E�h�E�yQ�Q�5r�t������D�=\�#`|���s0@p
�,��1Fbl���c�� 8F�e ����'>�B��8���"�K� ���,3c������!�`�O#0|\�"�a�
 0F��>���4%r)��[�
�������T�aa���1��3���B�K	��h����(bN&�A�[�Z��"!|>����*:��F���&�}
���u��)���8!>������\*p{�E���a�m�Y�1BI2b�#c�"�P#`|���{|��Op4������=�j8EQ#�B�E)#d<.4t����
&B�����mB���!96����M!���)�,��`����c��1���b� A��Q���.By�F�>5��R��xZ�'�(1rg�b�B���>�1�n�` >Jc��
R�����Z����n�X���c{����1�[��\pk\��V��:*�,�IDD�RC@���Y{_��aP�4�G^�;`p���KB�KF���
b��@��u��8#9s���.� <�aLGrq)�S=�&���)��!f�e���{�,���m�����"PjR��//�G�g���>q�!�s���Q�_^���?��������X�@�91���D��"���0���aP�2D�W�w�����7�w�}�q"�"�QZ�r�����O�p����S��K(��y��C�{��-����=B���q���B�1F�O"�86����E.��}w���:V�#����1����G�(2:� >b��<M-�E!�y����1�Nq����nB��#�=>��0����n��8����%����W��Oy�mW���z��o�PK���1���PK��ELObject 1/styles.xml��K�� ��9�KYc,+��)���LM� $SA�
�#� KA��PYJ����/�/c#w=�F��d�����bP
U_�����[�r�t����X�pe��?%7;'V�L�K�iE�a��
7�2-W���4	��?�Y�<�������=����������C���.����T�h$�1hZj���P?.����`<�~(��k��N'���������*���`���������G-��2��������nT'�7��ez��ru|�E�z�c=,�����C����<}G����\G8{�3*��h��q9v��/�Lk����b�[�v9H�>�.;��mo�����[g��e�������k>�>|^�����p�Vm�T�p������3KW���J��2��S�
n�����k�MTYy�{L���o���j-	.��Y���5	��Z�W�kLa������
�����=N�����L�
����Ct�PK�P���PK��ELObject 1/meta.xml��Oo� �����Z�T���NMv������M� �~��g6ni������/��ZW�L+�Jq=��:��L����&B��!�E!�\��e75X���es)E�QL�V�L�Zf�
����i6�'�J����m�}��}�jSb�1�����t���\`�`Lh1q	^����R#�V�Z��F|���|���_���yu����[��H��q���B<<A��~���|�-���d�/A��V�� O^&S�V�t����#z������ ,�!�
Jc�-�HP��r�wa�q�R�~����JK�|��d_PK3��5gPK��ELMETA-INF/manifest.xml��An�0E��"����U�,*u�
=�q&��cG����u"T��%��f��,X����v`�4:%c:"ha2���|�?�od�,J�e���!
�iwzMIm53�I�4/�1/��@gF�%h�~�g����������}�k�	��������X�q�L�K�B�uZ�s�T0���\@^+5����$�Z�y�I>��
R��JI��tF������,��m<�������Fs�\��GZ��J)����y/�����]Q�a�qs�KX�������������������_��x��O��r�3����c��#�����?���u�
e�e�
e�(Sl(Sd(ST(��By7:�Em[]��j�j�����K��<aG"8�f"`�"�?4�o�f�
���K��0�5��9O�8M���l(	2������P���{��.�{@Y���X�PK�V�l��PK��ELcontent.xml��]�]���w�_��
�������K!�bF��d���@u7,r�_���k��f��[�*���,ME<N�|����k����/��~�����o�����������u����~����_��������������������{�����O/^���4��o��~��w��������ww�������yw��w�^�������w��k�w��:>���Oo�����������������|�����w����#��;/�����;�7����/���W����Oo~�-����������������|��?���1���^�1����_���/����o7��������/��2���d��~�A��b��J�?�����47�n�bT?��~���q��������_���?��e~���=����Jz���^�{��|��W��������?�������;��Z�O.���7������www_���
�?��u���������x����O��_��.��n���r�����E�\x9��X��G�.��_�
����_������������o���~���o��t���W�~
�����������O_.����;G+~�n?~z�������'����������^�id�#~��7��7?�[/�0^n�����o��b�����������/���w���>���b������7��n�������	_���7����}�'�d�s������G��?������S�)����}���n�����[�������������1}����������k����M_m���x�
�����/|?�/��yu���������9�����{}���Oo���/�7������6'�}����~���v������3����o~�G/����������?����'��7�^�	�7�o�}//����������W����������;����o>}��o�p�����{~�z���|��r��~~������������>��������������_�R>����n.�o^���a����{u��e�S�yl��~~����w~���������7�����w�����������\��'
��7���_���������:��[�{}����������g�j~��W:~i}����~�3U����r��~�x�����7�n����w��|��O7�����������7?��8'��o>���������x�����7��#��������^�?����O���W=����~��_�?�o}#�k�/���_����t�X���y��~Q~������0���o~x�i�j���?��}��o�\�_��_���
���4��/|��.�����d�m���~���~�_?�����������o�_�ps�����Y���?�}���������_��Z���t�!?�Wzw�z�H��}��v������7���y������}������~����S�������}���+>O��G�^��f�������w�_����|5�����}��U_��7<�j�W��]��k��6��5J�����MW+>�l�����7y��#���[���:��z=���=�?�G�6�����V��6_�)����QUZU��f��6�������_��"�a���R����u����z-B�<&��V'u��_��6L�uO��e�k�7�:�l��w�H���o�
��Z�p����7~|����&����k=B������=�����7o��������|�����7��n=Szq�����(��f��a�
��L�{�����O���x��7?���$)������9�7�g�?���O����e����6��'��������>/�_�������X���0�?�x{����~�C��o�C�o?�������g~����oo��}����~�������S~�q}��}���o��?��o���M_�O~������G�'���~|q��v.c��m>���{��������x����W�?�v�����q�~��O&9�����o�����k�Z���_�|�����?���������������������]�����'����?p��>���E�/�?������������]����"~�K_���w7�~�+���/������yp�/���6*���!��<>�Ma4��?XsI�K	��������^��k.�u)Cy~�y���K�5���T���<��i����'l6��	��^���
�������B�$�&a����o1��0P�k.�u	�.O�K�El��\��8)<�}\��}�d�%�.n|�lf*>a7���M�C����r	{�.<���my./�"{��,��OO?r�Xv ����%j<=��c?����^����������5���D
���7Lga�%�.Q����.`�(����%j<=�(9�{���Kz]���{�@��Kz]"����4�.����MzCr<=jK�W�\���6��\�i�J]:>x�GT�� 6��g[����I���1Ex!Z����%j<����ck����^�����kF����Kz]���k4
��
k.�u�OO?z����XsI�K�xz�65
k.�u�O�u���l�{c�m4�Z�[h�5���D�����wr��Kz]�.�.����_�+u���1upW�9�1���J�Y'����#g�Q���Kz]�������,����%j<��(
_�&k.�u�O���<`^*6/)v�O�����5���D����Y�o�'k6)�����)����I`�I�M��J������O�l�k7�^�����N�l�kw�V\������Wj���c<������0<�����t����r����������&�6q���|����l�k7���M�^�6l6���W�C����Mzmb�K�^�����'�[afd��#L����/�z`N%����%�K��:�a�����^��O.��k.�u�H�B����6{�.<���m��Z*�m�J�Y'5�^B���/����%j8=��<VZXsI�K�hz��z�����Kz]"���._X�I���{���{ �	����^��G�L?
61����$n�HW{���\������G�W���Kz]"7���W���f�%�.q�RWk-X�%���t|�:���AL^�{��,��N/?��vi���^�����c��tk.�u���z�6�"/�l���p�|$7��`��f�^��}�s��i�YsI�K��>]�`��5���D����etV�����%n�9���a�%�.q_t�~�����YsI�K����G��K��R���Q�>o"zj��W:��b8�����{�nOXsI�K�xz�6�"G�"k����w=��6�����B�]+	m7$����&�Y���^��Q`�I�M�.�S�����6���D��7��7m�l�k�e\�k�m�����&r���XG�0F��&�6��.�r��.|�Wj���c<��&R�^���xM�J���(5����<���N�|R=���z8�[��)a�&�6QC�iH`Gja�&�6QC�5�t|j�63�v�YOAZ��W�l�l�`#�K���MX�I�M�^���Q�� ����&n��G��
k6i����z��p�f�f����X'��i�b������x������"�U^��9<�``�Te�����%�zls#����&n����w���`�&�6qk�����OX�I�M��9����M�5�4�������6^X�I�M���k6i��[c=�B5�����M�m��X���z�>�`�&�6q�}�|07��t����]{k�������+
�"?U�H.�y����M�m"o���g+��M�m"o�6w��M�5�4�D.�<��@�%�.���c��KJ�5�4�D.��e�@X�I�M����#�7	k6i����������6k6i��\��bJh%�f�&�6�+�s�����ty@��'<U$3����N`�I�O������,$�|���:<��}�������'n}�T�x���6�4�����T��	�O�}���OEZE/�f�&�6qk��V|w�a�I�O�*�u��:����'�>q���"<����'�>�+�����M�������������OCr)`v�f�f���xt-g����M�m"wN)��Y���M�m"wN)}D0�<X�I�M��)���{�\�M��)f��*���S��o�&j.iv��7��V���5�4�D��2�����5�4��N��]?�<`�f���	nA����Z)�].������f��Yxs%�G�k6i����OC|_c�l�l5����� ����&j�\M�8	k6i������&�������%j�\������M�m�f�k_�|G�X�I�M�,|�7�:�PsI�K����V(l�&��ty@����$���g��X|*����&j�\-b7��M�m�&�����IX�I�M�$|�G�[a�&�6Q���z�� ����&j��ZX�I�M�,|��c��5�4�D���^�w��RX�I�M�,|R
x���f�f��i�����k8#���ty@�W����6jexs!W�=��'�>q{�Wz������'n��2�D��>	l>i���)e*�+x��	�O�}��J����np���f���R�"q��!�����'n���H�`��	�O�}��L�����+ ����'n��u�����d�&�6����[��&8a3��5��S-9�|<���`�����f��������#�O�|���b|N9����N�|���f���2_��'�>q���"�"�l�l�j|�Z�$����'n�xq��'D����&n���p��NX�I�M���e�O\X�I�M����H��wk>]P���S=:c�����v3 ����&j*�]H>c_AX�I�M�L|<��l�l5��M�.��f�f��y��o"6=
k6i������������M�m��������f�f��i�6[k�\��5������&�6����,@�|�b��������BhLP6�4�DM��"1��9}���f��y�T$������'�>Q�5��<�����'�>Q3�5�����a�I�O�T|+2
�~�����'j.>��x?�a�I�O�d|M9��g������'j:�����6�4�D�����S�wP6�._Sp��T���	yH.���/6�4���2�\J����6�4���2�\\�����'�>q���)���v��'�>q��'WCE��
l>i���e|.a!�]�6�4���2�\I�'l>i���e<��'x'l>i���e|n�c������'�>����Mv|@b�a3��Q`��T�"����
Xu�f�f�������Y�I�M��q��h�W�l�l7w��a��f�f����m�������&n.�����c��5�4��M����
xt���M�m�f�s���#��5�4��M��!��/�l�l;��W�A��}�t����t|�����n�_��{�����/�o?��|�}�c�g�WW}��:��Y�&5���������Z��u���x6����
�����5�k*�U��RO=B�����&�Z��!��#6���	�Lje�f�k��������V&nD�&�:03M�dR+7�^[��D�&�Z���������NjSC����0"6=
{�*<���l����;.a�s���hR#��G��Q���JjU��S�R�W��5���D
����'�k*�U�O��f�'�
k*�U�N��&zX���JjU�F�{���W�TR�5��z��/p�5���D���\��'f��Lj�n��b?���HjE��>�1����������c<���6�05��a�s���hR#��G�Vi���Z���������,���V%j$=���k*�U�I��O����XSI�J�Hz�r�UZ���V%j$�f�^�;���JjU"G�S������5������Z�Zx0���JjU"��n=6����5����]_]�c���6{�*<��
�8����?�^�x?��$��^'	���7k*�U��k:���k*�U��hz.Z�m����Z��]�S�	�+M�TR���t����Y�5����n�1���4��d�{EmDS��}/���V&��#��:�VH`�I�L�`z�C�x�dR+w�V\������)���c<������=����s���xr���Z+�>6l2���P��%��L6�������d���g��JjU�F��*�>��dR+;�.�����l:��3c��bK`J-���V%n�5{_�TR������Vi���Z��uNs����<XSI�J�<b�4a`�������c<������yl{.�u���Mj4�V���KXSI�J�`z�1<+-�TR�5��z�v��TR�9��;�/q�5��nX�=�kDzk*�U�{����f�@M$�"q�A�y���a�5����}�����I��$�"q�-]ML��5����MG����"a�S����x�A�m�aH��^�x?�����8�����V%j �\��[���JjU"�{�����KzWn3��:�W�a��&�Z��=�si�����JjU���B�`�aaM%�*QC���Jk*�U��*k�<��5����}�����[�5����-B��L,��6��T���1�op���������~�I
���b�����Z�����y��}�&����J{�Ko`(-���V&n�����0-���V&��������Q`�I�L���5��-�	�Lje"��s=v����&�Z��/��y�����dR+�X���v:a�I�L���������N���y7�Z��C}��&�I���n%F��:�M'�#��������OX�I�L��z
�K��&aM&�2Q��)Hi�6	k2)��UOA|��2�X�I�L�#���#`1��&�b��mF��l�(���X&n�����`_taM&�2��Y������5��DMM�l��s���N����[�yO���<����������S�6����X$n5��i�K�dR,��z��'����&�b����������k2)��[M��3k2)��[M=��k2)��[M�|�	B��L�e�VS������U�����3����L�eb����������
���T�!�H;�ws��L�ebi����j*)V�\�r���dR,�D;���dR,�D;��&M$�"���S��� ��L�e"�g��<,�bM&�2q;/��j����L�e"�g�1��VX�I�L���T
��HX���x�
������~��Z�5�6��M'�:q+���
=`��M'�:qk��!9�	�	�N�u�V�OCb`����b��u����j��5������������M'�:q+��!��������X'n-��pFK.6����_�j��[��N�ubW��()�N'lB]���m�S��3S���������L�e�f�����F��L�e"wE)#����5��D��2�_�����X&rW�2�kYX�I�L��(e���L�5��D��R�G�,�TR��'J��}�6k2)���em��'�k2)������}�r����
��<�
�.��Psw��N�u�f�����M��L�e�f�S��}��&�b�������,���X&j>	�i�&�b��xsy��m��5��D���lSvK)���X&j
�6��y���b����#&0f�dR,����������N�|<�Tu �<�c��&aM&�2Q��F*�*��L�e�&�K�Q� ���X&j�\�-a_AX�I�L�|�6�Dx�[���X&j�`Q��&�b��	�\�F[�	k2)����/A�\X�I�L�|	������L�e"g�K�v��t�8���cO������������b������9d�W����b���P��L��5�����2���
l:)���e��~�k2)���e-^�N�tR��#Jqc� �M'�:q��TBD�5	l:)���e�_md�
l:)���em�:>?m���xI���T+3O��:�-N�tR��2|���	�N�u���/CzkS6����_�Wl`����b�������vy���b�������W6����/�gsk�6��������tR��N|M8�	&k2)��]'>���wv6�.�(�}���1Sq�z	��dR,5�.���{aM&�2Q�%H�g���L�e���{����dR,5
��
xd��&�b��Y�1�`�6aM&�2Q��-H{�L�d�,5�=��.��)���{���L�e"��[���@M���!6���*��	xL������6��D��cvq��c��	�N�u���s��9
l�?a�I�N�|N8���$���X'j>'�1���	�N�u�f�s�	�Hp���b��i�Z�r��[aM&�2Q��%���Y�'l:)�������|r����X'r"�������6�.^Rp��&��T<$������N�u�v��4����5�����\��
��^`�I�N�L|�7��:m�tR����4$�v��tR���xr>u����M'�:q{��	'����tR���xr��vd�tR����4$D,��dR,�����o�3w�&�E����rDj��k��	���L�e�����B�:8X�I�L�D��:�3�dR,7���&k2)�������m*�bM&�2q��9�d���5���M����P���X&n�Fi`{aM&�2qS�)H�'���J�Ubg����L�>K��H��m:����������~~�������7�n_���Y����\�s�����~�I���!��;�5���D
��L�:x����Z�����#�/p�5���D
����G3	k*�U�M���<`V*6+�U�LO=|�	k*�U�K�E��$���V%j(=��`?����Z����\�R���dR�rw�.��R!�u�t|��7��e�J�4�^�x?�����S��"��5���D
��C�m�4R�5��r�9��"-�TR�5�^�L���TR�5�^{���`M%�*Q���`m����Z�����i"��VXSI�J�@z	�</-�dR�p��R+������Z��[5WB�
{�*<��
�lsSl��F���g1��@z��x�w���Z����������	k*�U�JO=�[�k*�U�J/=
x�.���V%j(�������JjU���S�\����JjU"��+�;w����~���:6������V%�s:�sJ�yk*�U���:�`�{�*<��
r_�cD{$n�:��Y�&�����#�TR���t�#�5���D�'��������Z����s��s�YSI�J�^�s��X��-pzU����s����k2����6��.����Lje�����J����V&n,]]�vi���Z�����Fk�Q�_�L�����������q��s���xr����rl�DR+7�����i6l2���N��Ll�w�&�Z�����o|j&���V&v@=���+�g����w�m��BiX�)���V%r#����
k*�U��#����W�7k*�U��#�e������Z��=B�G;�{�*<�sr#��0u$�:4�&��G����9o�TR���G+����6k*�U�������
k*�U���c�T���k2����C����UXSI�J�P����_XSI�J�P:�4�Yi���Z�����>�q�fM%�*�Ci�:�}���Z��y��`U��^�H���t�I��*�tc��9��c4������7k*�U�I�Z�{���HjE��>��J�5���1�F�0�9a�I�L�H:�u�0:XSI�J��;]�~`�����Z�����#�'�
k*�U��&���x�&�Z����M;X5+���V%n�\����������c<�����1��;���g1��@z���/����V%r$�6)|E^X�I������9%����&�Z��������-�6���D>P����'l2����]zN6u�������V&r�>WGDOc�dR+�u[��1����V&r��+y�o����V&r��JH�����T���1�ups�����-�u��3OjH��_p��`�I��2���Rj�]	k2)��TOAz����L�e����������L�e��S�1�>��L�e�W�b��3m�dR,����T���k2)���`
�=�g����X&na�\�Z�n(�5��DMM�l�G�g��^�L�������\_�Go�6{�#�'?UI33�.��V��HX�I�L�zj�k�`����L�e��S����[	k2)��[O=)�3;X�I�L�z��t��	k2)��[O�[���`M&�2q������g����X&n=�j4�h�QSI�J���9�D����&�b����K���k:]��Xl�*7$j��E"���X&v�v�x��bM&�2��sNK'�5��D.�N�����&�b����9����n�dR,�P;��L�5��D.��)�}��5��D.��>����5���.�n�����5��D���$x��X���x�����������j��;'l:)��[]�����N�u�V�OCr�`Y����b�������<��M`�I�N�j������r�N�u���������tR��"|R2����X'nM��]�'I���X&nU��nB�wN6����_�$����M����M~�{uf*�\�`����J�U�&���X+z�fM&�2�;��\�W�7k2)�����7t5��D��RsC_�]���X%rW��KG������X&rW��#��E[�4�D��RW)%>/Y#�2������P@X�I�L��{�7<�BX�����S�NQ+����+����b���ws%���$���X&j���`���&�b��������	k2)����/Aj�n*�5��D��� !����&�b���$���k2)���������<	k2)�����}P��L�5���>&��V���tq4�3������g}��1���X%j����|�WX�I�L��{
jB_L����X&j��\���5��DM������fM&�2Q��%H_��dR,5�^�d0��dR,5��[j2:3m�dR,5�^�gl'���X&r��o��:KaM���	6�y�W��5�����	k2)���<���@{�l:)���%�:z����b��]P�!nE(���X'n'�iH�	��l:)���
e�zg+���X'n?��Z�|�W`�I�N��(����{��M'�:q�����X�
�N�ub�E��T�}�6�.^R���S�8�T<eJ_X9a�I�N���iHo�='l:)��[�]L�`��	�N�u�V���z�g�
�N�u�V����u�!�	�N�u���g���M'l:)��[%>���*X�)���X'n��4����l:)��[)>
�}���	l:)��]+>7D-bNk:]O�Z��zp�L���c�)��&�b����w�;Qj*)V���o?��5�5��DM�� [g�5��D�������dR,5	?flr�dR,5������L�e���[������L�e�f�����U�TR�9���$�k:]����OU����cve���6��DM��!9���	�N�u������|�u����X'j��!����M'�:Q���^�S��M'�:Q��iH�|���M'�:Q��5��a�6l:)����OCFm`��6��DM�w��#�w����X'r*�������	u������x3s��\�!��A`�I�N�.�������N�u�v��$������b����2$v������b��]��!}y��M'�:q��'���V|���b��]��!��{�
�N�u�v���h`�y���b��]������Y`�I�N�.��v-���	�P�������������vk2)��[-�B�	��k2)��[+�|K��dR,�R|
�j*)V�[%>�(
��;X�I�L��-��
k2)��[!�V���U��2�Y&n}��R�oj���X&nu�[���)�fM&�2�k��", ��������t|�����n�_��{�����/�o?��|�}���g�Q7Ws��j(�U��Lj@�\N�b���f�V���ts%��m��5���D���5��)�5���DM���ctl��L�j5��v���+����$j&�\h<�IX3I�I�@z��m�7ii���DO7��g�5���D���K��� ��KZ�A�f��6����Wi���c<���V\(-�Y��^�p?��������#��5���D���zN��-����$j=��8&��f�V��1�Z�R�R'a�$�&Qc�5��O��<��5��;����m�L�j5�����`?Za�$�&����Gh���f�%����:������5���D.�����h��J�����:��>V_�U��Jr5t���F��i�Y�����1�[���IZMbWC�'	k&i5�\
��&�"��+�c�`\a�$�&�����o�
�m�5�^
�F���KZo��=�{-���Y3I�I�������������$����(�w�*M:>x�������1��*�Y%���)����L�j���i|,���IZM������JX3I�I���<V�	k&i5�{L��e�	��	k&i5�}B�Z�:�`������_���s�J�KZ]��"R]J�+����$n]\�=�����%�.q�js�*��[��t���1lp�S��V��P���g1��@z�){,�<asI�K�Hz�Q�7�O�\��7��z�p�l.iu�K7Zg9asI�K�`z�?5�	l6��3���j�����IZM��Ss��f,��L�j��HWr���L�j�����Ik&i5�EL;.��N������9�5�������~�I
����&M�L�j5��v���h�f�V��a��c�����5���D����uLga�%��r]B���X3I�I� :���G�5���D�S.�{�����$r�b��NQX3I�I� :E�o�L�j9�N�exNZ�U�t|�5�QtJ1�7X����~����S��������$r�bJ��k&i5�E������x������{�&ZX3I�I����
�Y��f�V��gp�\= 
k&i5�E/;�C��5�������r�`���f�V��/�M;jB�I�5�����<�v4|����4���1jp����w���~�I������L�j9�^~����	k.i��Qtp�z������V����������'l.iu�|F�
}����%�.q{G�����!�\���3�q�'n
l.iu��j�\��\Z����%nm�\�r�o�k&i5�m�1Z�R|�.<�#n��]=�Y���g2��hz..!��?���x8���p9�����^����p���}a�%�.Q����^�X%����%j8=����gf��Kz]�A�����5����� :�@�a_AXsI�K�s�A�k.�u�[�kk��&��Q��O�l2a������x�������U�^���a?���+���7�%a�%�.q+���>��k.�u�[9���
�k.�u�[9�|�`+a�%�.q+����{k.�u�[9=�|��l���$n�����e!��Kz]�VNO?�I��$�q+x�<��;���Kz]bW���t�=�b��K��,<UT�-�.��o�k.�u�\�]bF��.�L�k��������Kz]b�c�v��\����E4[�\�����
��\�����P�Ia�%�.���k�M6k.�u�\��R��\����������b��K�	��{��Ff����y����Mzm�V{G�c.��l�k��;�T��M`�I�M���)H�\m6������^��
��6l6���[�=�ZXsI�K����GJ`py�f�^����S�Rn���&�6q���t����	�MzmbW���Pl�O6�.]Q�Z>�M:3O��)����^��Ixt#����YsI�K��'mD���YsI�K��'md���f�%�.���L?�\���b��}O�wi���^���O��#��5���D�|����R�L@�K��'����`�%�.���eX.��t�z��Ou3E��.�\�� ����&j��\-�c�����^������G����Kz]�f����65
k.�u��}O?�HXd*����%j�=��Z!����%j���@`�$����%j��������L�k5�^; �]���IzMb���j��i��M�����������g����T��IXsI�K��;��b������^�����#��m��5���DM���y���^�����#$�k.�u��xO?J����XsI�K��{��=�WZ����%j��\����f�%�.Q3�5�$�Tpa�%�.�S���.`���f�����a��zE�Z�]\K
<����&�6q{~gW[`{
��&�6q{�d�{��n��&�6q������������%n��9���a�6l6�����$�#�"xO+����&n����`Q�	�Mzm��<��MN���6�����z2�B1��+6�����{2'��7-�|�tE�k�T�
3Os3�b���	�Mzm�����+0�<a�I�M�*�"y����&�6q���k��-+N�l�k�<�|�m�����&n=�d��4a�I�M����j	<����&�6qk�� ux���&�6q�������B^��&�6����j��'N6�.
(6?����~�_�L���=g�k.�u���{j���,����%j����
��Kz]��������Kz]����������^�����?`����)v���o?�`DXsI�K�����*�IzM�f�[��-���Kz]"'��d���R�������Te���;VRn���	�Mzm�&�S��[���f�^������V3�����&j�����2�������&j�=YG[b{�6���DM�� -�}�6���D��� ��N�l�k5��i5c����&�6Q��)H�
,B9a�I�M�,|m�C�o�k6]����S5�ff�!�\����f�^�����+�7��
�Mzm�vO.���-����&nw�9����8a�I�M���s+[�F�l�k�?xr�{|�a�I�M���s+4j��
l6����<��m?j���&�6q�����������&v��Z/�]����K>�	�SE���p�K�����5�����w!��dp���^��U�����p���^��5�����5n���^���������5�����_s
����Kz]�V����{o�\��������`�%�.q+��\S��k.�u�]��+P����:�:����t|�����n�_��{�����/�o?��|�}�C�g�M�r*���_��?���j�UC$p�&�Z��u����.��M&�2q���}{�&�Z����p�������JjU���S�<�7��5���DM����+k*�U�N�F�g���JjU�f�����	k*�U�M�����E\��Lz�B�����2�[�:U:>x��T��k
<H�@�s���XRc�iGs�5���D���4�W�5���D
���&,��TR�5�^3M��J�5���D
���x��XSI�J�@z�Q��H�DR+5��v���M%�*�����.���Lj�n���)vlj�TR������#��������c<���6�p�'�u���Kj =�(}"�PI�H�8z�Q3������Z��q�������uaM%�*Q��9����Yi���Z��q��G������JjU��k�����5���D���������Lj���=�k��)�YSI�J����������JjU���.��z������c<��.�sS��a�s���hr�V�zD����JjU��������JXSI�J�C����[v���Z��'*N=r��<XSI�J�����=a�TR��,��l�G)����6��~�8��V`�I�L��G�:��`M%�*qc��O����	�Lje�n���V\�_�L�������*.��1�N�:G�Y�'7�..��@k*�U�N��%w��6�������-��`��6����
��&|Y��M&�2�#��bk�:�X�I��Qw��K��5�������RVi���Z��oK�}�&aM%�*qk��L�<���TR�7��3M�M��u�t|�O9���!�#a����9��b4���������5���D����R�w9�5���D
��n���bM%�*�#�%H�
k2����{K�2�����Z������r�BaM%�*q{AN=z�&FaM%�*q����V���h��^������OI5���Dn[�CS%a�S����x�A�mmPj����^�x?����K��J(���V%ro����j"��GO?*��LX�I��m���/<b��M&�2�{K���s3�5����=���R����JjU��S�=��
k*�U��"k���g��JjU�������]����Z��E(s�+��{�*<��
�=����{���,F�J��%�
k*�U�K��&��;�5��N
�X���"x��	�Lje����������6���D>Tx=���L6�����.=W�P��i�&�Z��m���
�i�&�Z��/��Cw�dR+�\�����VXSI�J��k��'�M��N���i7�Z;�_�u��3OjH�n�{J`{i�M'�#�������fM&�2Q���|����dR,5���$��5��D���lYu���b���ekl�&���X&n�QC
�W�dR,�9�\�:x���&�b����G�	�YX�I�L��t�69���{�2<�����������qx<�������uq}�+��&�b��������~�dR,����QXt�&�b�������}�&�b����K/s�5��������?��&�b����S�\����5�����^K������X%nY��k���dM&�2��z�o��/���t����4�*7d&������IX�I�L�"������j��>��E�!6��3aM&�2���S	�i�&�b�������L�5���.�������5��D.���7s5������bh��PSI�J�"���
6j*)V��������"-�d�8�`O��*sdf�!�����W'l:)��[��\�)���X'n�4�t�M�	�N�u���OC��)j*)V�[��h��i���b��5����z��5����_�M���'l:)��[~��q�l:)��[	���G���l:)��]��C�����M���|�������xr)������L�e����������L�e"�C)#D����L�e"�C)�G���`M&�2������M5��D��R:��>PSI�J�^(sT�^(�5��D��2�@h�t�&�b���P�&�.�H�Eb��s��w�Q����g�������<�,�`M&�2Q���J����dR,5�n.��Q ���X&j�=g� ���X&j��f��P�6k2)���}���w03=X�I�L��{m�[���5��DM��M�����b����Z���CX�I�L�C��"'�d�8�`�SU0���B�
��L�e�����8:��fM&�2Q���z��	k2)����}�3v�5��D��� }�WX�I�L��{	��j*)V��~�-�o
ui�&�b����$�����X&j��f�����fM&�2�������X���x������5jxs!��~)���X'n7��b�	��N�u��?���8`�6l:)���ex��	�N�u��@���^���N�u��A��x����L�e�vBY������X'n/��:5m�TR���Z��6�6������I�)O�P/)8�?�j�L�Sq54��	�N�u�V�OC�[�����X'n]xq-����'l:)��[^\�|g��M'�:qk��z�	|^w���b����s����:m�tR��B|�_���)'l:)��[#>
I	�E|���b��U�s�����l:)��]'���=�u��M��#
��<��3f.�]o>aI��&�b����w!�����5��D��� ����L�e�&�K�:EX�I�L�<|���i�&�b��i�1�`@X�I�L�,��T�2�/�Z&j~�6���dM&�2Qs�=���k2)�����[n�t��b����������a�'l:)�������MZ�����b��9��p��X|z���b��I��p|
`G�6��D���!�w�;����X'j�w��c9�	�N�u�����:���N�tR�5���Q3���M'�:Q3�eH�������X'r*>i�G,L=a��%/�S5�f��!9_X�{���b��]��K�U���M'�:q���	����M'�:Qs�iH�m�U�N�u�vO.x��q ���X'n��B;:����X'n�5�T0?a�I�N�>����2��-�tR����\�R(����M'�:�{��)����6lB]
��*K������c
k2)��[-����i�&�b����)c1���J�U���n����dR,7
w#g�g��&�b��Y��m<���`M&�2q��)H�aM&�2qsp7��#�dR,7���f�k2)������������i���f��������������w�?����p{�����
�EF=\/������~�I
���y(��IZM�������� ����$j8=�(#���f�$�&Q��iGk�����IZM���s���-�<��5�^rd����f�V��q�\�BK`�y�f�V��Y��#��m��5���D���#X�-���5�n�].�(�U�t|��4��e�G��*��Y&5��v���[,a�$�&Q���Z)���5���D
��=w�.OX3I�I� z�35`;sa�$�&Q��iG\`�L�j5��vT��&����$j���Z`�k&i5�EO?R�`	k.i
u�Q��a��f�V���������,�U�t|�5���!�)���6{���,�EO;z�.����$j�\�l�(����$j������5���D���MS���x�f�V��Q�\�B����X3I�I�(z�X#f,-�L�j9��~t�
�����[qrw�:���-	k&i5�������>��5���D�K��(���{�&<�C
��7�0�oj{���,��8z�Q�C9�L�j�kt��`?��f�V��-���O	k&i5��/z�VEk&i5��,:���8�L�j�St�	���\R{E�4S�:}l:.����%��"���iI`sI�K�8��T3z'����%�f-��[�%�������x���Q���)O_��?������E?�������%n,=��!��6����
���w���o�\��7�.��v[<asI�K�p��2������&�`f<�]J|�UX3I�I��j�1���ea�$�&q_�t%��|����IZM�V6�T[DM�����$n1�>|7Q��4���1pP]�C���������~�I���q���k&i5�H�e�W,-�L�j5��v�����IZM"������������
��i���I��IZM��ZI`E��f�V����<��s�f�V���k���@X3I�I������6������$rk��b�9��Wi���c<���6�p��N����~�I������<���{�����b�$�&��G��;���IZ�n���B���\���{tj�ai��f�V���q�P��&Fa�$�&Q��iG�[��5������5��`g3a�$�&q_\�vx��Y3I�I������`a������x����[C>�*��Y&5��[���mq�m�Z��Q��i"���\��������k��)����%n���G�
�Y`sI�K�s��T��m�	�KZ]����z���Y�\���/�k){|^Z����%�k������!����%re�k=��N�\��9���V}�W�t�;>x�G�j�a��<|��L��M���v<Z���x@�uw�e���f�%�.Q��|i��k.�u�PO?*Xt�f�^�����#��k.�u�{��>%����Kz]���~x|^Z����%n����[���Kz]"7��gl�&����%r���X�&�U�t|�:�3��8N\�U8<�`8�T���h��^�	k.�u�[;���k�S��\���v���
�A�\���v��PK��\���v������`�%�.qk���������%n���k���\���vz�5%���d�%�.q�x�\x�\����w�6<gJX������{����|�����IXsI�K����GDKC6k.�u�\�Z����YsI�K������5���D.����m�\���(;��K��Kz]"e�1�D@XsI�K���s�_�?P3I�I��{��[�����%����R�K ��ti8���OU��L�Cr�����'l6���[��\	���6������N.�T��Q`�I�M���)H�	��6l6���[�=����!�Mzm�V~������o�l�k��{N7�V��
�Mzm�VOAj�������&n���X���M6�����_����]����KW��Ou��L��K��+k.�u���G���k.�u�����R���5���D�~2��������%r��2FG��l�\����I=��`�%�.������N:�5���D�~2����`�%�.����{3�e���Kz]bg������l�����|>���<���f��Mzm�f���c�&�#�Qs�i�G�X�\��5��~�
>C�\��5�^~���
k.�u��{/?|�����Kz]������� ����%j�������XsI�K��{�Q#�,�\���������5�.
'����
?��wvat�1����^���wr����=�YsI�K��{��F ����%j���l|"����%j�����eVXsI�K��{�5��U���Kz]�&�k���/m�\��5�^~��}a�%�.Q�����
��k.�u��|��&�=�5�.
'X<�T��Q+�������6������]�=��P6�����wR���TO�l�k��Iq�����l�k�������\������#�d���&�6q��LAj�N�l�k����V��4�����&�6q;��muh`���&�6�{��	'�_�����+
^��Zn�Yx*�����K`�I�M�:��Z��r+����%n��lz�������&n%�$���6����������l6���[
>wB=$��9��&�6q���t�C�x6�����_wi����
�Mzm�����f��$����&vUxq��g6�.
(X�T��Y�w�6�����IzM�����;4������^��9����@�$�&Q3��GE���Kz]�&���GXsI�K��{��u!����%j�}��M���Kz]�f���$�H�G�����`_AXsI�K�����H `������T����;f[������&�6QS�%HD��<a�I�M��{	�x��	�Mzm�f�S�k�V�6���DM�� 5e,�:a�I�M��{
�+�s�����$j���(<����&�6Q����.�������&j
���{&��&�6�s�5����u6�.]Q�����r3���(���A`�I�M������#�AN`�I�M����e2�xW`�I�M�$|
��`?B��&�6q{������*����&nW��|i^�6l6����|m�F��
l6����<��7�9�	�Mzm�v�[��"xb��f�^��]�����g�
�O�|����u����$����%nU���xpr>XsI�K�$�����+����%n�F�
|��`�%�.qS��GD���5��������; ����%n>�h�/-�\��7�^{ �@�`�%�.q��5��1���Kz]bg�������}�6}��o������w����xu�����_��~���t�z���"�n����
{���,�M7FK�I�5���D
��<��St�5���D������zZa�$�&QC������m���V����Z�<x��f�V��q������X3I�I�0z.X�'t��Y3I�I�(z�3�Y*����$r=��<�DXsIk8����V;x���Wi���c<���V\��p{���,�DO;B�b	k&i5�D�����L�j5�..���9i�f�V��Q��g�HX^ ����$j=��^
j�f�$�&Q��mX�&����$j=W,�;��
k&i5�E�}t�s���KZCr�ul.H�����$r�u�{�*M:>x�����T���^�p?��$�D���c�f�V��5�)���,����$rUtJc`;sa�$�&���S�����IZM"WE���^��IZM"WE��6��L�j�*:�V�����KZo��m�{H[b�5���DnJ�c�D�L�j�%u	=��`������x�A�]BjhG��^�p?��$��.}�!����$r��iGF�n�L�j�_t	����Hj="��.!$�P��5���D�=�h���d�$�&��D�����4YsI����Lu�gt��\���E��J`�6����
��k����
�KZ]�n���F0V�*]:>x�G�Uu5�O��������7����%�.qC��b�vi���V������5�7�6��������p�,����%v8]]1�g�l6��3���j/���5�������jE���L�j���9�T��I�5�����l�vx��Va�$�&q���b%�pV��4���1pP]�C8b��S�^�p?���F����-^����$j �6(
|HX3I�I�8zmP|�r'a�$�&����Zk`�������
9�.��-;�5���D��s]�6k&i5�E����c�5���D��s��)
k&i5�E����k&i5��r���xl�Wi���c<� G�sY�h�����1��(:'��l�L�j9���x3�X3I�I�(:���q����%����8_x��	�KZ]"�����Jk&i5�{"��)���
k&i5�Fo;:��~�f�V����\�,%�L�j���iG���L�j��d�3�sR��9���1kp����{x�{���,�F��`Tl?%����$r����/�\�:1p�����lj&����%n��Bh�_��%�.q;H/=�����%�.q;H��`�E��%�.q���K��6����}�v.[��  ��%�.q�����"����%�.q��5�40^:��t���1rp�5�����U��Lr���Go
� o�lR<��xz�VB����5���D���mdpn>XsI�K�xz�1|�]Z����%j<����yi���^�����@]�����%nQ�����(����%n�*���@�$�&qkx�]~�\>P3I�I��t�Y���j�^�K�����m��c���^�p�A?��+����9����Kz]�VM;��6�j&�5�[3�B�`3a�%�.qk�]l�(����%n���#�G�
k.�u�[3=��� ����Kz]��LO?���j&�5�[1=�(��@��Kz]�����C_�?XsI�K���9�T�hqa��K����Ta!����&"����%r1��|�"����%r1v)	~Id���^����9�'Nk.�u�\�]c����YsI�K�b��x~����^����5����7k.�u�\�]���{���Kz]"d���5n���^����5���k6]N�I�S72��]��kG'l6����'{�V��r�Mzmbw���F�����&�6�{e_�p���&�6��e���~$'l6����/{�:���6��������Bp��
�Mzmb���-B9a�I�M�������t6�����_�W�}���t�����S��3���O�������^��Yx\�vBOE�����%r������9XsI�K��'�g��va�%�.������D�\������k�B��5���D�2�����5���D��2�@N�\���J�{o�\��;���
���#���/�S�LQ���K=�q�	�Mzm�f��5��c��5���D���!glr�\��5�n�����QXsI�K��{�1:������$j���@���\��5�^��Q� ����%j����@��\��5�^~$�00a�%�.�O|���>�3�f��K�	��T���;����".a�%�.Qs������5���D����'l�&����%j�=���bS����^����Z���KXsI�K��;�s��5n���^�������}a�%�.Q���|G;�
k.�u��|��t�t�\��9�^+W�P�l�4���O������^�c�N�l�k��wq>U�P���&�6q;�dW[�`���&�6q{�d�z_H9a�I�M��'s�)%���l6�����d
�N"�mZ����&n��5�x�����&�6q{���P���a�I�M��'k�I	L6������i<�G`������j�a��)�x��	�Mzm���S�1�}���IzM�&�k��y`6�����&j�V�IJ�8a�I�M�$|M7��M�O�l�k5	_����t�f�^��I�$U�����&�6Q������;a�I�M�$|
[�J'����&r�������6�.
(�T���1�p?������Kz]�����V��S�5���DM����@�$�&QS��x�����^������#����%j~���� ����%j�����k.�u��~s
���\��5�>�@����Kz]"'����vL�vL�Bl8�S��3s�X]�-c��	�Mzm�&�S��S�m�����&j��)\�O�l�k5�������N`�I�M�|N7#���������&j��.O�l�k5���0��	l6����������O�l�k5	��T�v'p�f�^��Y�TnK(��t�zbi�_y������Cr�&��Y��&�6q{�OAb�`9��&�6q{�'Ws;������&j>�)F��6�����
�\��q)����&no��
��'^	l6����|m�G|�.|�f�^�����V��5���Kz]�v_���;�
�Mzmbw�7���;a���O`~�T"3O������L�k�&���;X�r���^���.�RP�6k.�u�[�bO�=P3I�I�Zp{n�8XsI�K�J�9��E���Kz]����P��Fa�%�.q���������Kz]����X3�"���Kz]bW�OCX�$���i��o������w����xu�����_��~���t�zG��"�n.�6��G�Y�%5�n.�������HJE�f�S����&�R�����������5���D�����W0��DR*5�^�L�����HJE�&�S�=q���R��!��c���i�T#j����&���FJ5"G�����7��5�����T��^��m��(���c<���V\���*z�c�,F�<�{O�}��&�R�����#�baM$�"Q��)G�����HJE��S��}x���R�����cxL��&�R�����c���
k")�=���RQ�6k")�>�;������JJ���8js$aM$�"qWV���E:>x��T���^��R�k�g1���y�)u`���&�R����XmZ��g�&�R������T�^UXI�H�z��3�8���T$j��=�����HJE��K�#$���T$r�����I�5����s�@�Q��w�5����}"�Z���k")�����G�~~a�Q����x��]�\,��G�Y�%� �=�"u�K�+��9��
u�&�R���N9�O�?XI�H���,S0��5����=�p���,���T$����^l�(�������F���G�I�JJU�F�������'l*)U�B���0��TR�w���n�����<�
�n����G�'|���,F�E7�{m���aSI�J�0znw�F��M%�*q���z��l*)U�H7�s��m��M%�*�#��
��l�d���e���
�}���R��}����b�~aM$�"q�t#��m��5�����cZ�x���&�R��	��<4�@�Q����x�AmN9Ex��k�g1��z�(9c��&�R�����4|?�XI�H�z��F�~~aM$�"�����N�k*)���{B�>��DR*�'tjxs���HJEb��|�!���T$���.R'���T$r�����H�5����n7�r���X�5�t|�O2�=�k��	{���,����W�tKaM$�"�{B{���5��jD�����^JXSI���m��]�1�
96���D
����c����FJ5���V�lB�DR*5~�r�V�)�`M$�"q�\M9x���&�R����M9r����&�R���&S���Ga�Q����x����[���O����~cI����Gx#�XI�H�z�3=�+�dM%��7����>.�JJU�v�n=��6J'l*)U��:�TB�U����T%nG�9��{2���M%�*q[���&���6����}}v�����JJU���M;Z��O�TR�7�Z;������5�t|�O6����\�:����~�I�=��Z�4N�d�;����t�p9aM%�*qci��$���N�dR+7���g�P��5����
���
���Lje"��|�`��6���D���|����dR+���n��YSI�J�����N�}'�1�����:�k���e:>x�g�@s�Cu��B��q���������\��2aM%�*qj��Gj"��N��4�`M%�*q���G�Xp ���V%n4=���}���JjU��.��`�k*�U�[5=�H�����HjE���k�	�Ni���Z�����h�s��5����N��\>/��t�r��Se��b���AXSI�J�S�@�	k*�U�|Nb#�nn�TR�5��g�����JjU"���J��YSI�J��[O�J�5���D.�n��!����Z���1��+z�fM%�*��c�����BM$�"�_%p��d���LF|n�T����;��4<��M&�2�{b�Q����&�Z��]�{n��6�������}mp��
�Ljebw���g��
�Ljeb��n#�8W`�I�L���s���6�������SH`���&�Z���������Ljeb�{��P�N�t�pA�
�S��33��Z����TR�5O��>��TR����h~iw���Z���MF���q5���D�n2���Kk*�U���d���R��5���D�n2Z-�Ni���Z���MFkWi���Z���M��5�N��5�������mY�eZ��t�r�U�OuE�����V�'q�Lje����u�#-	k*�U��w/=F�v���JjU�����V:���TR�5��z��2 ���V%j��g��XSI�J��{�41��bM%�*Q��G�vo�TR�5�^3
������Z���8��KB����LF<(���=��wv9���k�TR�5��.�\� ���V%j�=�(|�-���V%j������TR�5��z�����fM%�*Q���G��'��JjU���S�T��5���D�����+���TR�5�^z��}aM%�*���)H��x/�d�0�`}�S��F��.�P��o�M&�2q{zg�����7l2�����$��I�{L�Lje�v5����3p��dR+����lZ�e����V&no�5���M6�����n2'��3�����V&n�9���w�&�Z��N�6h��p'l2�����$�2R�wM6�.\P�R>�Z���Sr�D���6������=���`�	�Lje�f�{����q'l2�����/?���	�Lje�f�������>a�I�L�|M6>$|fZ���V&j���A�TR�5��V����M&�2Q�9���x���&�Z��	�������ta<��O�����{7|�X�$���V%j��]h`����HjE�f��p�-���V%j���(����JjU���{������JzU���{���$�H�F��{�/	k*�U��wo=��9��JjU���[����&k*�U��u�dx�4Y��B>��f|��}f����7l�=a�I�L��;f��r%aM%�*Q���G�)O�dR+5�^~������M&�2Q��G�����&�Z�����l|��;a�I�L��{���������V&j�='�0R�7�6���DM��*��`��6���D���tS���6�.\P�����n3�07By��6�������\���o�l2�����{��gG�M&�2q;~'W}�`�<�M&�2q;~�����E ���V&n���r�^�6l2�����{�Q�z�6�������������N�dR+����
���l2�����{N7��{O�t��>Ur�����~x�����JjU����� �W8XSI�J�p����nM�G��_��$��`�/#Qf"h�1�I&;o��C(����itkH�z����C]UkW�J�B:f��kP��/=<VD���ftM���%����[7M���%����G)�p�JjQ����bh|{y�JjQ���M�&d<W"���%����G/~����Z�d�}5�>�Ik(�EI��72�K�'�N��������w7�������?���/���{��_}�Oo�;x�����7��������������?l�������?���O_�W�}�����~�S��x�����I��/��_��?~����hC����N�����������J�����������e��3a�?��w�����N���O?��������o>�������o�����?}�?����/����������o��k"��������������_���_���K`@/���������50���}�`@���+`@����
������-0�o����k`@�������������}���O_�?��x:��3�����oo�g��������w����>z����q��������7?Pt~�a[��Hk�?��z���7_������o�|�����_��������,<�R�\J����J�'X����zt�����1��_�1��KdL/�1�D�������F��52���1}���dL� c��+dL��1�B��
�����E��-2�o�1�F���kdL���cM�M��E����zU������e�����w������v���n~|����m��/���������7�>���3}#���o~������A~�O���?������n�W��!�����?����4�v�@���~�_�I8�;��=�b(7���/zF����E_��>||�h(��Q�����g�g?�3?�*���F�����nv~1�|P��[�Y|������;#�����^��X3���v����G����[_vxDS��xA�O-���~����|A�����X�����c��]������v�{���������%��:y������@$I|���B^>uTj=|t��L��,$;��2��	����\~x�E�x%��$�iGX\��Gtx�b�����/��0���H�_Lm`7�H��.������6��/���s�s�x�����G�#2�]����)���������:����z��c����%��-��R�,aD����f0�'����e�Q�/_��\��������RO	�\���.>������yupu�
�	,~&�Z��\q5��y����H�r(�uV_x���$�l|$�9�|������Y}�N=������3�����N[�����p�n.�B�wl��~.�[��k�D�������7�	��~�M}w-�["���Hw���vlv�}=x�~�8{���mI�V�~�������������P�C���9��X-�����
:���9�e��BR�K!��x0���	�/m"|���q8��m�_���bw',����2<�9�����}�u�����b����EBN�5���wz8��+z���m��9�f�/=<�9���1��}s[�B3��zGW����1	��0]o��	�/V���8-[���VkF����s���]��/���,~���?��g�����k�d���7��������~4|�^�h�B�hO�p�-�=�up���x��VO�.84�/�����rI1��n$��R���K�GC��q��2����������|S��/y����+���p�������I�\����%��i;�~����Q�n-�����������a����^������G���y��/���������g�j��-�K�NQ���OU��E��w_�/���0^x7J�hHN���3�2��O
�����K/��^��@{���P�^=�+�u��IZX�rm_������'z��Mr[G����)������,����K%��Q��/_���N
.��	��`{G�BV_z����#V_������w�I�lLpK�d��[E�xWFD��%�GQ��D�K�m�F����6��%��w����P��)�oeH|i[d���r]��
�����	����=8_�FB	�K��
�"�]����o�_8���cc5�/>���3�^|n�h���k���c+]{(KP����=kLn�1$Y{Y$�/�X��]���\|�&1��h��~���U����;o�B@���/���g���{O�����_u��4��S�����5��F��I�������]
�z�������U�y�f��������0:xC�^��WT�5�~�&�v0�a���8"\:��@��jP����D���|���/��Wz`�Y_x|�;�64�%������<�����V������7��O��S�� m�Zh��������';zT���K��'z��]Hu������_D_1�����-,��p�����]~t)z���x\�D��*�����hxxh�G�'VG����+��������"��/K%�I�*H%�/�iG�up���K���R�@�����Ln������a��,��x���4e=t���/����K�B�����A{[��Y~������/l�%KDC����3���I�����m���D)~�k'��o�O�>�����/�O��'�����)���{��'��{%�X��>�����_�;��H,�]M���C��^��B��c6
�FW+\f������D�������A|K��3k�y�c^���]������A�c#�����w��|d�//>��|��������������7?���������x�������?��`�����i�����?�|������G����?��Q1������=#�����/���?||�h(��Q}9��������_����h�J;�gle~��������?}�����u�����������������7�?����oS���e$�{�c������>l�]�������{�|������]��_}���#���O��:�O#��*�}q��#�G���~�RBd���Rwp3�+����:k���>��m���]�?����lBh4�s�����[p����>���J���s��m������/��q����kA:�Nz����FH��G�����/�.����3�)���zh�"R���!k�cO�p)���z��B�_^��+�����o�{�����{�{�iw��/��Y���F��>���a���!���gP�h�|�5��w�n��!����>�2�����������F�R^�>b)�����I�R��V��S����)R:$�x���
����i?S����E�bt��<~���:�e�rHq��}v��h�����8�������J�C���s�^����w
�;�|9�o��f�Tmgz�w�wAsL�����O�"L���pgi�/>��o~�v&���y�^�iv��~�#
����p��:��1��J�~TZ������G��Y	?��[�9�����'��u��C�<��+���pg)�;��~����Y���jE��>�]�?d
���G,�6�#��oS���Y?����E,������C�x�kv���^�iv��6������)U��Y���!���c�9R�Bm���w�.�+�d�_�1��R����]�0�<��s$p-8J�(���4����.l��s�Kco13�{6��[����l*-d�o��Vw,������g����F�-��B����2�k���Q�~�������.Z
�g���zWY�;~�������������i��s�|�S�����v4���zW����4��
�7gP3����j�����u8f[p��Kn-DOID�{l|�Y��������]�\r��E������������������W�`�gu���+A?MN�Q��C���{,k>*8f%x����5�B��r������xH@������p�=�]�e���|s���/���,�Qw}��f��������hG�G��8��c������2�������]�h�e�����l�F�/w��������I�k���Q�w~�����G���s���;�M�<c���PC
9�}���2��?��i�O��X�I;Y��9���J�����M>���sO�uM���w2���<~��kL������]A��c=~����-A����g��~�n����KA��������rK��\��.�~����g
�U?��2m�����4����m�0J(������]��<x�2r���g�oW���Lt��W��4������������I�/����Rw�7����g
���ii���gA����yeX������Y������G�����v��>^>~�����T�o�}kr������X)8��w�V~?$���<x(�����(Q�-�~��y��%q�����u�b�|��p<����"��wy_��������A��ek��~���{m�#� 9�7��1�3iO�.�H�����q�|�����
��2����=�i���G�g
x��C�[���z������:V�������U��������H+D���]���zz��SN>��;��w^�>�������k(�����Z������!k�|4��������s�CY����g
?��Nw�\<a`�iC��s���y5��F������C�����?/�TO?n��,���x^�7|�0�u���}��C�o��'��{�DP�s����!y�����g$�2�����~y�9�����|��0��G�Yf������6;w�<�!����Fj)��:z�uCoP�q�[���_*E�hY�{�h���|s;�mkYS�m���#������o�f��H�}�i�s�}�s���S�%d�x�xWc�/���/x�K�9�o=d�6x>E������s���*���a�Yax�+��������p���17�^�5�T��5��V�]�>h�p��i=��|�(�]_~��s5�<tB��E?����6��T7:o��g����3o�Zu���vR����Bw��2;�����3�s.��5�]Np�����X
���a�1�y�9�	OL�����V~W�w�Y�����}1��G�~�I���S�����������;���,xZ��e�w����x����M�Y�$�K*���'��n��6�3���rXNm_]���17W�|����Q'�9����>�g`K���D���0��G���W����������~��p���.7�B�A����V��Q�W��m�)n=�M:����b�;�+�JY�!��:���)Z�hm�S�|�*�����_8%����v>�<�����F?*����u5�<���{�y�������=wJ�S~O	�us������}������}������2�3��Z�
u�9��b2�QU���'��b����;A�������)c�)��{�{�qL��o��g��S�i������:}�O7��7/z�iW��������lrw���0_$��O�+��n�����/�>� ��Y�/�|�Q�C��pf�����5�k��"S��o�����4�O����vn-���������h�[�������y/��Y���[(��\���t�A��>s����G�i���G���
�c�p�k�8�$���I������:�x/�~�6-l����:�uZ;c�l�L_}�c�)n�]��Lv��� ������R�:o������;7=�T����33�6��c�Yg��_�����������.'���u���=���<���Ib|��P����p�]��!3�i�.
�>��6���u�u\9�P�Y�������]�.��,xz�\*��\��b_��c���/����gwF���9��*�i�6g��&N�t�9��O���K���N?�9;Jwu����pLw��0�QB�V'�����.�mx�������v+_�����c*m�5�:��\0|_c����~s<���������xu��s���=�wV��\P:�B�r���{<��t_����%���kic��Q*;��Y�!���|�� ���H��]��7<z�� �Q��>h���6d��7�5�[��;������?j�p<�2�<�\lh��7���:��0r\k�|�b��N��/
��[�Z���s��c�*�>k����5Z��=+	��=�]�������f����������_���/����f�������_Z,h�Y�������8����x����O7?l�;O�n~|����m�/������_|����m_��_>}���_�����������/7�H9���������_����E���?��������q��������{Q�������_���o>�y����c"�������;�;{r��y�pk�����N��N���P0c2�b�{���F�^���';����M���%6����$m���t��/�DZcI/KO�&zK9z&Mziz�F�����#4��h�K��4��CSL����h�K�����A%B�M��h�K��t��CS.w��&Mziz�.;{�������������^Q�:-.�vW��_S|�4�>8��C�7n�9�]e�~s��$��)*jX y������Ml4��I��&@F�`?�%6���$jY����]�>�����h�K��eM��r�3������&�4�Z�H)wu_�-L�5���$jX3i�:���&�4���t�^�\b�I/M��5!��]�3~�k�&����m��Bo�����X�����?����Ji:}p�������F�w����o�+���1����)&�����b�I/M�����7�&O����%����q�vlKl4��I�v5��u�:�b�I/M���	%�H1G�����|W��/�DZcI/K���i���]�x����x��9��U���=��b�I/M��	�5��b�I/M�g.���=��c�����G{�F��w�B�|_��?�	��UM1!U���Mzi��UM�p[K�&Mzi��UM����]�b�I/M��������_\����z4���&@z���)6���$}���(�������l���
���-����&��p���<H�Mzi���R�ow�y�5MSl4��IvKY\�
|z��WJ���#@Dy��s����o�&��)*jYSL��e8�lb�I/M��5RK��5��F�^�D-k7
�x6���^�D
k�#��1#a��&�4	�=��r��Oza�6m��P��Zb�I/M�5���~_b�I/M��5�k�ib����&��n���Kl4��I�$/��+x���WJ���#�?d�B�		-T��W:��bBE
k�	�lKl4��I��f@jL����F�^�D-�m/�n
��h�K��eM�4�#s������E�z5���h��)6���$]��%���Mzi�.��s�x5tMzi��9����&�KzY/����K�mb�I/M�'y\:������Ji:}p���t���|�)��)*]����vl�Hl4��I��u�5�e�7����&�:�-��c�#���w�5�[s���m���h�K�l���b�`��%6���$��:�c���%6���$[����UP�6����&�����,|��&�4���-����Sk,�eI�� >Bm`��%�R�Nq�!�[q-x���_��?�	5�	����b�I/M��5g����d��x� D
��],�i��&�4��%�V���)6���$jX 57�(�Mzi5�9����\b�I/M��52��i��F�^�d��P���ccXb�I/M��O(j9�4mb�I/M�����_M���t������*��E����	�)lW!!�&�O��T������Xb�I3O��5!22�Xz��'�<�����<
hNM����'Y���9���O�y�5�	�Q"�?mb�I3O���w�T��O�y�5����U��Ml<i�I���%�T��b�I3O���w=e���+����"�;�3��w���J'�R�F~"Y��w��Eg��x������Kc�&�O�y5�Cs�F��O�y5���F/,����'�����>�Z�I3M�-����z,B.����'�����5�i��M�i�-7�]k-`cXb�I3O�����������f���$)Wxw������S��|"CQ���py���pKl<i�I���p�u0>-����'�������*7Kl<i�I�'D��h��)6�4�$��q�����%6�4�$�������b�I3O��%	�P�?��x���lJ�rI`��)6�4�$[��i�Xk4i�I���p%���MlD�?����S]����[v=5�=�Ik4i�I��$N�h��)6�4�$�f�)��<��x����;�����;�b�I3O��&�k>�P��x���l��D�����x���l�IZ�z��7����f�d�Y2">�����x���lkn�U�y�M�i��6F!�g��n�����}��;t��p!���%6�4�$��3"
������f�dk�"#�����x���lmB$�.��x���lmB��!�O�y����!'t<g����'��*�H)`��%6�4�$[_�����Zb�I3O��Ux�V���Kl<i�I���p����Q�����wg����y)������O�y�m�Y\��Ij,ifI�}fqyx�D|��'�<����H��]����f�d�g"-�����x���l�L^�B��M����'������NeSl<i�I�}&m�{���&6�4�$�>��J6�=mb�I3O��9))���6�u���������;�������x���lo��B��OKl<i�I�!���O����&Q��>��3��x����?������nO�y���T���'�<����HD_�-����'Q�3����&6�4�$��3"�W,�[b�I3O��8C2z�<�%6���R���S=�����L	���%6�4�$��3"#���O�y��	����vKl<i�I�!gD�o�-����'Q����~Sk4i�I�����w��'�<���'D2��\b�I3O��8!����-����'Q�i�c�O�y��7��l���F��S
V�z��^��x��0�'S�j#J3Q�����V��6�4%\��Sf�"uSmDi&J�%gFR�b,����'�*��H)x���F�f�����*sK/���(�J���2��P�j#J3Q�����%���TQ���FN��R�UoSQ���G\�h��Mk<=���_���/��0<����f�d�r�������F�f�D]r�FCojN����&Q���<q�Z�I3M��8���Z�I3M��8R;6��5�4�$��o���6�Sk4i�I�?�^8M�h�M����D��nj�&�4	{��N
|l>����"6���7$����=�'u�6�4%������[���(QW<���/��w�6�4%��3#������6�4%��3#>���QSmDi&J�!gF������(�D����H�)`��[���(Q�|�:�4|���F�f�D�r�7.����|��(�D	;��#PF���[�1u?S`}��*z"z����3X�n��'�<�z��H�)���)6�4�$��"����Ml<i�I�/�����'S'����&Q�������Kl<i�I�)'Dj�	�V��x����O�	QO[q��x����K����\b�I3O�9/a��n�&6�4�$��3$�w<�b�u?Q���T�)$��P\����x���l���z�,)6���f�d��3")b;�%6�4�$[��8���j��'�<��"��S3��l��'�<�V"gD|����'�<��!�nd��||O�y��BN!g����,6�4�$[��R���K�Kl<i�I�9/b
-A>����O??���?�������?�����//>��|�������,<�\]l���9��b>E
l�����y�
&�0���lFO����Z�D�k69�V�Lja����0F�#�&6���$jZs�������Z�Dk6��' Kl0��I��&>R�8��`R��W����M�Lja6�9*�a�q�
'����gZ��3�+s����G�z�����z�5�_��?��5����=��r�
&�0���G����i
%�(����G���,mb�I-L�6�k2xwq�
&�0���������Z�Dmj^�Z������Z�Dmj6�Gx/��
&�0	��LHJ�M����Z�G�]t!�^��b�I-L�&�j�M�u�t���3������z�K|�3�<�S�>5�a<�b�I-L�����~�e�)6���${�::�X6t�
&�0����V~�'���Z�d�S�y�%6���${��7h|�q�JjQ��MM�����b�I��\�6us>04-���&������p�6���&�
6-5�X������g���&qx^4�����g1����?���E�)6���${���M�0L��`R��}j�#���
&�0����]�H`�%6���${��q����A,6���$}���[��O���vK%[\+��[���Lja�}W\��b��Lja���B|�p�Xl0��Iv3Y\/,���	���#N=Dq�I,yt,�Z����g1��F5//9�����`R��Q���>�%6���$jTS���782mb�I-L�F5����_k��,@6�i����hKl8���e[�%Wc��B���Z�d�$'W���B���Z�DM�����^b�I-L��h�
<�_b�I-L�gwlbW-�u�t�����0�\G���%���)jR���|�a���Z�DMj^^J_�-���&Q���M	�L,6���$lTo�(_qo������E�:up}���%6���$[���h<�Xb�I-L���[�����PR���M�xd��_b�I-L�e���Q����Z�dO�(�D����������g���[*�M���s���|J��nq�w��`R�tm��B��Hl0��IAujw��g���v���[s9���Kl0��I��zs!�����Z�dU����~�
&�0��#�.g�0vj
%�(�(.����i�
&�0�^�-��Z��4��Z�D}	�#�4v����G�y��V\�L�O����g1��&5��Z��RKl0��I����MM�Z��
'��A��.�y_�un�
&�0���%�.*
,8/���&Q����-%02M���&Q���G�����Z�Dmj^�j3.���&��5\&��D��`R��#���xr�
&�0�������)�N�Nq�!�Uq�R�$6���)lT3!�lE\b�I���Z����*[b�I1N�f�w}����
'�8����_�G�a�b�I1N���w%�
���`R��aM�T�c�N�q���i�J�u��5��$kY{.�	��[b�I1N��5�^#4�Ml8)�I�'Bz�8N,�N�Nq"��{�f>[���sxFA����cQ�:7���k�
'�8�������q�b�I1N��uh����-�N�q��?}��=�%6��$�^=��m�
'�8�6A�n����N�q�-V��1���pR��lY�����z;��b�d�� ��rSH�A����]n
<Yb�����<��(��q���M���'�����
�Nd�
'�8�vp����o`�
'�8���DH����pR��lGJ����;��pR��l'���/��5���b�d�DR:42�0`�
'�8�v5���:h�/���'��������iN�q�~L����DZ�������*��+���-El�[b�I1N��"��F�]�N�q�m����'N�qu����;��
'�8���L.�/���'���DH��N��pR��l�HZ���8Kl8)�I�/%g���8��pR��l�"�t���N�q�.&F���'�����wF���O��[������%6��$��!�_���N�q���B����9���b�d����UJ�6Kl8)�I�z����M�P���l����'�'���&��)H�
���pR��l�"�����b�I1N��S�����Kl8)�I�~
��;��Ml@��������XI:�����Uu�
'�8���,.���Yb�I1N�m0��1��3��pR���#��W�`����`R�l��J�3R��pR��lLZ�R�R�b�I1N��0�9�WS��pR��l#�m��/v��pR��l#���.����p�(Iw���:�'vKl@�;�`���"����|h`��%6��$�a3:_*���pR���#��;����b�D�-��.vSl8)�I���S[�)6��$��o������pR���'��W����`R��#N�_���pR���#��^h��%6��$��������&6���Q���S=t�t�Gq��������b�D]�����Cz�
'�8���LH��+����b�D]q^�BL�Kl8)�I���SF� NSl8)�I�'BZN����pR���+N��@�`�
'�8���DH-�c��N�q��9����Kl8)�I�gFZ+,�u�������b��/�w!���]jJ1P�5���D��6�%\U�;�
���Vm@)J�gDR��=��b��+�S��}����b����{7b���
(�@	��������Sm@)J���w1V�>����R�p�q�j+p���6�%^i��N���mjC��/�6�^yu�W0)�Z�I1L�>���W�8i
&�0�z����=���Z�I1L���H�R��5��$�� m�/Y��`R��/��&�����`R��'������5��$�����*�NL���&Q/|����DRCI1J�.8/]�=�����!6���N5$��`;��5��$���\�h��[��(Q�)�zl'p�6�%��3"=���Vm@)J�
gDF;"��6�%��3"���Q}�6�%��oYQ����
(�@�:�)p�����UP��u���(
�G�Mm@)J�#� )
66����)����'���\�BEKl8)�I�)'Bb�����pR���ON��R��aKl8)�I�%�����`Sl8)�I�#'Br�iN�qu�9���N�q������L���&Qo�s�>��Z�I1L��8G�Z���Kl8)�I���������N����OUqB���PXz�
'�8�VO��~5�j�N�q��1�]�	|����b�d+�g�SH��;���b�d��s�_�4�N�q��.�=x�w�
'�8�������v�L�a��+N��v._b�I1N�U���Q�*�Sl8)�I��xq~��7��Y��t�?������}w�����~~���o~�y�����>|�u�8��6�����g1��%O�+>E���Lja�-wB|�1\b�I-L��N�p�u�HjA�-qBt�q�Xl0��I��	��SkL���&��&l�i
%�(�5�E��,mb�I-L�M��e��E��`R�t1N��G%Sk0�ue���r����%�N�Nq�!�[���vLX����g1��5����Kl0��I��&>���"o�
&�0����G�
,!���Z�DMj6�T,:.���&Q��sjK�ZCI-J�&5��8�F�Kl0��I���Xb��
&�0	����,�����Z�G��\t�$��Lja�5����fO,�u�t���3Q�rp�f��c��s���|J�������Z�Dmj�#�&6Sl0��I���\%��en�
&�0���lJ*��o�
&�0��`y��5���$jS��}�%6���$lS3!������pR�;��M�\�����Lja������r/M���&����A�&�N�Nq�!�hsk�,�u����O�����������Z�doS�5���Lja��MM+W�b�Ij �I�.5�6�~pSl0��I�.us5�*�Lja��K��N����pR���-�U\O	�r���Z�d��W{��0���Z�d/��zm�%6���$��,���1kb����G�w��F�b���:g�Y���E��J�����`R��E����D02M���&Q����e,�Zb�I-L�6u�>��|���Z��mjJ�r��Sl8���e�%Ws������Z�dK$��7���`R�lOF�#
�,v�
&�0��	`>���b�I-L��w�G��_'L��8��]iGC�MO�u����O���|�2�%6���$�>�w���Y2�
&�0��O$>zv.���&����5?<�5mb�Im�"_��l���Z��+S�V�/`�
&�0��&B0���`R��QM�&�>�^b�I-L�/h��<�Xb�I-L��w\�s��a��:a:}p���|ej4z���9��b6��R�P�M�Lja��LM�J
�5�%6�����2u_�N���v�5�[s��
Zb�I-L����9v�Ml0��I��Qq#��}Kl0��I�iu1�����Z�dKWG������Z�d/��ux����Z�D}���������D�������S_y,�u����OQ����a�=���`R��IM�$_�rDKl8�
�6u�.�
��Yb�I-L�6uI���
aj
%�(����G����%6���$jR�
�N�Lja5����,���&��5��;�Lja�}`B|�<p�Xl0��I� ����gS{�(�>8��C6�Jn���<}��s���|
��LHM���pR<��6��My�4,���'Y��	�~�
'�8����v��Z�I1L�f5R3��O���'Y��		����b�d�jJ�J�	�N�q�5��k1V88mb�I1N��5-_m���b�I1N���w�'|[�����G��H��4�>�g���9������9��
��;��)6��$j[G�Y�/NKl8)�I���E�:I
%�(���18�����%6��$jZ��5Bj�N~�
'�8�v�.U��1,���'�~5�~E��_b�I1N��%���x�����b�d_�S�I�c��N�q����]�=���P��(f#>P��^���E���PR��l�F��{���N�q���8\��y����b�D=q"$��%Xb�I1N�i��)�8mb�I1N�=)�����nN�q�m9\����&6��$����|����b�d�WB�`��)6��$�B�BN`y�%6���Q��	OuR��������%6��$����J����pR���/N����sKl8)�I���3R��%6��$��3!�w'N�q�����K���%6��$��s�i�c��%6��$�Q�����c�%6��$���	�����pR��tu:Z�|N0P����wF��O�[����@l���N�q�����+xj����b������vD'N�q��7B"��y�
'�8���LH+`��%6��$��s:4
�Xk0)�I�?��/�,���'QW�	�9���Ml8)�I�u�p�����
'�8I�N��N	��Xk8��������ZIz����b�Kl8)�I�f�x3�#�%6��$�
�)��}���pR���'N���#:mb�I1N��0�����NSl8)�I�&�S�EM���'�v��yv/����b�d[a�b��I��
'�8�����Z����%6��$�g��<*X�b�
�{g���~�����ct��m6��`R�l����N8�{-���'QG�	�5���6���'QG�����S��pR��l���Z�l>6���b��;m���N���pR��t��s�;mnb�I1N��6�����,Kl8)�I��f~N,6��$�i�<�[b���~����I����^=�	x�
'�8���DH+!a��N�q�����[��^b�I1N���pZ��Sl8)�I�'B�O`��%6��$��o�������b�D}q8�6xg��
'�8���pj,X�\b�I1N��x�������pR���/N!gx<yb��t�|��h��^��+zr�7�D����R�lUqB$6�1����R�l]�]���ar�
(�@�z��H]�Nb�I1N���i	�%��2o��b�dk�o!����o��b�d��"mT�2�UP����0N�����a�jJ1P�5�)+j!D�.�RP����2�yQ�{�(VR�~�h����S^],�cjj
&�0���.��/��5��$���P<x_ej
&�0���H��L���&Yo�����Q'���&Y_|[������b�d=q�6mV~�L�a���	�\�'���&Y/���Z]'���&i���������!6����S�����*x�{�6�%[]��{�`���6�%[_�zWZ��[��(�
��HJ���4���R�l�qB��X�"�Km@)J��8/b#e�Mm@)J��8!2ZD�j,��(�J������u�Vm@)J��8!�}����Vm@)J��x
.��-�UR�~�hc���W^���mqVH�A��kw���%OKl8)�I�!�hSA�6���%Qo��)b�qj
&�0��� ��)�&6��$��S"}�vn�
'�8�z���<�5���pR���#���:�k�Kl8)�I��t4�ORCI1J�N8���xX����@��SU����Cq�#�b�I1N��S�k���N�q������#��i�
'�8�VO)�w���b�I1N��S��
�L�N�q���B���q�Xl8)�I����y�V�N�q���B������b�I1N�uT���l;����b��+�d����k�/N��xM��~�����x����_^|�������6��Y��)�<�vn��r���t������)�N�KZYu�����Kl,ieI��N��R�b9Kl,ieI���P��Y�bcI+K�F��N��K��X����K�����1,����%Q��CM��Xl,ieI���P�{���%6���$lN 1��r��h�j
W�v)�����d���G�U���q$,x,�UN���N����Pp�6����%������+X�m��%�,����P����DbcI+K��)��V�[bcI+K���)��!��J��X���l���J���yKZY�-������"��X���tumJ�S;q.�������1�o-bY�KZY����!aaij����Gt������M�_��?���4��p�ehKZY5��,%`���IZI��9�d�W��IZI5�9���YbcI+K��4��}+/����%Qcz���u=��X����1M��\�#�%6��n�e�M7�s3�%6���${%��;X�s��%�,���P�	�F;�W����#�9d#���"x?q��r���t���&<���B�bcI+K���9O���:���V�d�M=�I��X�����i�&���&6���${o�{���m���X�����i�����MZ7S���
�������V�d���S[�,����%��)��������%�,�n#i�J����*Y:}p�Q�(m�����1,�UN���NQ{��Ah�5��X����=Mx�*�mbcI+K��4�����ZbcI+K��t�.��0�`��%�,	������[wMZ`��j���������V�d+ '��@{�L����%�~�����y��%�,�>H��n��IZI�=���x��I{�$�>8��Cv�|�78rl����g1��
����bcI+K�
y�6{�Z#I+I��)��T���Sl,ieI����Y���qzS�z�9������V���Mg�3\nhKZY�.f�cK�,����%Qc���|����7����%�b�)�� ����V���Ys
������N���8���:�}K;&��W9��b:��N�B��IZI�9�G�- KZY��9�r�x��b�I�2#jN��r�`��%6���$������V�%6���$����0��H�J�l���j
�U�%6���$[�����m�GZ9����+V��
����V�D�
4��Wh��*I:}p��,k4��p�>�W9��b:Emi�#���/`��%�,	��Hki�+�&6��Q[�di�n���X����-]���/�fk��%�,���������H�J��-���f���%�,���iz|.����%��4�6f�e����V�d��p�p�.��H��7;�J���%�J�Nq�!�M����E��W9��b:��i�w���Mz'T��.�PAh��&�4�����8��t�KzY�5��k���Kl4��I���h�3Xlz��&�4�Z�Hi_�Xl4��I��.���n��&�4���������F�^�d�j�g�t�Mzi�u�������*i:}p���t�N;���M�UN9<��a�D��l[D��)O����%Q�:7r
����F�^�D�j$u�Xv��&�4������[c�Mzi��9��1�Mzi��e\^�Xk,�eI��Lp!'���Mzi���o5�4mb�I/M���	�Z��iMzi���I������O�M(��'2e�0G[��M�b�I/M����5$�A]b�I/M����<��ZcI/K�N8�Qj�N`��&�4�vc����-����&�~���Z�>�Sl4��I���pi���Mzi��R2\�m�6�F�^�d�������Kl4��I�-�p�D88��h�o:1�'<��#����rH`g�%6���$�� >���tKl4��I�	'@B��M��h�K�����f���Mzi��7@��r�%6���$��3 -�ii�%�,�:�[Z���h�K�lo\��g���Mzi�mgA�f��/t,6���$]y�	�`L/��t��b{�^%>��Kz�a���}�Ij$�%I�'<r�[���h�K����f���rKl4��I��p�|�c��&�4���n���}�)6���$��s���iMziu�9����&�KzY����2�e��&�4�vA������6����&�.�l!U�;�b���o�U=pr��?/���������Mzi�mkY\��MP��h�K�lc��Z*l�2�F�^�D�p$�����Sl4��I��eqi��a��&�4�6���:���Ml4��I��%��6�S�%6���$���		���F�^�d[�V)\b�I/M�]3�+�Xk4�7������"����z��`�Mzi����C�.����&���#t���Mzi��9���w��F�^���f�c���F�^���f��<��.����&����Xw��Ml4��I�o�H����)6���$�7����t��h�K�|���[��fnb���	�r��T��$��^\�%cr��&�4���H)bk�Mziu�;_�n8M��h�K������a4M����&Q7��
m�@�b��&�4����H�b�q��&�4���H����F�^�D�p7-0o�b�I/M�n8�B�x�Xb�I/M�n8o�"���]����&�#�Te�$�������'����^�d����|*�a���x���l�p�8m����Mm<��I���R�:���'�<�������-\j�I/O���9#����iSOzy���'w�t���x���l
q�8i���wSm<��I��8E���r��'�<I���u�+��-�u�w�V��:������ZcI/K����6p�;i�%�,�:�.Pb
����X����+N|4����KzY�u����������^�d�p2��;i�%�,�:�kj����X������lk0���^�dp����[���%i�����1��h��.��3>�tJ:�17W[P�j�I/O����w��rZj�I/O���Kp>{�����x���l�p"$���E�Vm<��I�~8�`}����'�<�VgBj.`����^�dk��
b���j�I/O�U���Z����j�I/O�u�i�174�j�I/O���)�$��Ba�j#����y>U�����>���Kl4��I�����
��.����&Qw�I>��-Kl4��I���k�R���Mziu�	�\|���Mzi��	�R��>Kl4��I���+g�a�Mzi��	��c��Mziu�9j,���F�^���p^�j��/��tO���T&$��P\�t���h�K�l���|�`|^b�I/M��R
�7�Ck�%�,�VK).z���Mzi���R\�
���h�K�l�
7�{�
�Mzi���B�P��iMzi���R\�#�+�&6���$[7�R!��
?i�%�,I�M).���]�g���	���|P��~�����x����_^|�������6��Y�������S{���,fS������:6�%6���$�To|$,Q�ZCI-J�F5�2��,���&Q������q��`R��M�|���{�
&�0���[�;:O���%Q�����q���Z�Dj���}�Lja��y��[�6Kl8�u
e������{"K|�0�>8��C��vt���e�K|�3�,�S��vti���)6���$[w;�Z�m�
&�0�����:��Sl0��I��6��vD&Lja�-�]����`R�l�mZ�Rn���`R�l�m
6���Lja���M������pRk��^���z����Z�dM.�#���(��:a:}p����]��F[���:g�y���mj^]��!Kl0��I�6u����e�)6���${�::n��b�I-L����kp��%6���${��V��:�Kl0��I�>5o�{/�O���&����v
����&6����e�S7�c���9��Z�d�j7���^;�b�I-L�G.��<2fP,�u�t���S��E����;��9��b>e�S7���gCSl0��I�>5�F��N���&������VJ[b�I-L���)��`�6���&����G����
&�0I����zx��
'�[*��Z���2�{Zb�I-L�O����5A��`R��E���O�L��`R��f���2�m����G�z��F�B+p����9��b>E������o���Z�D��^]K#`��Lja5�)��2
�6���&Q�����C#�Lja6����k�S�Ml8���e��%Wz+\-���&�b��Gm�Lja5���<"��?���Z�d_P�I,I���Z�dO����V.�M|�0�>8��Cv�L%�3���s���|����G,aKl0��I��f>�������Z�Dmj�c�n���`R��M�{��riKl8�M\��S'�-���&�
��6�+�Lja�.~]GBK�N���&Q�z��yL���%�w���O���`R����V�1���Y|�0�>8��C�>��(|�^�|?����N�� W0��b�I-L���kxZ��
&�0)�NR���ob�I�Z#jR���/�]�%6���$�D���=��|�
&�0��:*�����~�
&�0��#�.�^:Zb�I-L�%(�?0���`R�����R�O���%Q_�e7b}�%�N�Nq�!�[v��n���:g�Y���M�|����f�
&�0	��DH�!���Nj���M]��V�����Z�Dm��\��c��Lja����
�G����Z�DMj�������`R��I��V�[h��`R�l���G�5�Lja�}b�����q�
&�0�s�i_�X|�0�>8��C6��M�o���%���)lS!%7��N�gT�����ccXb�I1N�V5�*��~�
'�8���DH��N�q�5�����O���pR���e�]+	�W����b�dMk"����Sl8)�I���.?��nN�q�5�)*������pR���+N������&�N�Nq"���4�a�q_���3
��O��Z�q�^��Kl8)�I�����JY6�)6��$j]��|�~-���'Q�:d�F��.���'������@sh�
'�8��A��g�k\b�I1N�K3n�^�N�q�-,�]*	������b�d/gGo�,���'���e�FKl@�����'�e�8�?.���'�N�����5��$��q$��iN�qu���\�{�M���'�~�����{�
'�8�vt�������b�I1N��"�����mb�I1N��M(
a�m���pR��l%B"${�H�N�q��-�#j<-�u��b���'������xK��o+ORCI1J�m#�>�o�N�q�m]���{�)6��$��3!����N�q�mI���vY�b�I1N��#����8��pR��l��Z/���%6��$���N�;��
'�8��-���T���N�q�.(F+XM��mb���v6���uKz�a��R����pR���/N��>2���pR��l"�����b�I1N�Tx���}�%6��$[A�����G'N�q���B�D�6�N�q���2\}R>���b�d+����������b�d+�P��l:����b��+��v���epKl@�����!��x)�Vto����b�d�b�}/�.���'�����^�0j�
'�8���DH�6���b�d�b�Z�`�)6��$��N�K�%6��$��)l�����b�d�b!i4'N�q�m�I����Sk0)�I��Jq�����
�{g<bx�["��x�n���%6��$�o3!%`��%6��$��3!5
��pR���+N����>����b�D]�-���#:��pR���+��fV,���'QW������sKl8)�I���S��;N�qu�����;M���'a_�W0�>�Ij0�;�`c��z�&���D�um�%6��$��3!�,����b�D=q&d����b�I1N����.�6o]b�I1N����~��E�%6��$��3!�����PR����kW�
�y�
'�8���D�����%6��$�����Knp���
'�8	��r|/������3������yIO<�j=�%6��$\U�s��5��$\S���G�q���b�D=qF$�&O�jJ1P�u�)�$�Z�Sm@)J���w�W������R�pm��b������R�puq���*�C���R�p}qZ�B�;�<VP���0�/��i�TR�����;t����z���Z�I1L���1{0@���b�D=r�F�`2>��b�D�q$d,2M���&Qo�i��0��`R��/��4�@��L�a���^�=��L�a���8p�Hk0)�I�����\�eN5L�>���ocN��t�o��g|�s
I<�_����jJ1P�>���C����b�D��������n��b�D�pF�4�����R��'��������
(�@����H���jSP����7D���Vm@)J��1��N�qu����+��-���'a�|�����'P�6�z��&�7��+����N�q������btSk0)�I�'@j��N�qu����
,���'Qo���V3�9��pR���3^�}40:M���'Q_�N�x&��
'�8���DHl1cH/���'QW����N�qv����s�6Kl@�h$>U�	IW<�3x�`j
&�0��O��z�d�N�q��2�]�����5��$�� �������b�d��!�T�x�N�q��.N���/_b�I1N������$�p�N�q��,N'��G'N�q��+N��V�Yb�I1N�U�i���u��/P���8�N�������/����������x����O7?l���p�sq���-HK|��,�S��&<b��KZYu�	_"hY/����%Q�z5�b{�%6���$�V3������V�D�j��T�m�KZY��ykV{�r�%6���$jR9f�}�KZYu�yk��{obcI+K��4�Z��%6����V)��k���%�J�Nq�!J[�nT�
X����g1���4�QC�&/����%Q{��(|84�F�V�D�i�#U�,j�$�$�Z�Dm�a�Xk$i%I��f:Z�X�����V�D�i������bcI+K��4g��E,�_bcI+K��4�=�w��[��#{W.��`\bcI+K��Vp���V�%�J�Nq�!{o��A���8�W9��c:E�M���:x?q��%�,���n��.����%�{����N�7����%�{���@Y/��KZY��7M)��;�%KZY��7]��,����%�{����x��&�s�{��_�Kl,ieI�J6�A	5x;���V�d�Y�Z���K|�,�>8��C6r5�G��B���r���t���n.���9i�$�$�����%�Y�KZY��;Mx����Ml,ieI������/����%����l��~�bcI+K�w�y/����;��&�[)��Y���@O`��%�,�>u+.��.����%�{)������Kl,ieIvY\���k�_%K��8�������A�`��r���t����������X����=���t�y��%�,������>h��%�,���jR����X����=M����0[s��&�	�lK��j+�KZY���\�����V�D�i��pE��Ml,ieI�-[�gl7����V�d��(��VzX��d���G�� �)-x!��W9��b:E�i^[B��-����%Q{z��Dx����%�,�����������%�,	��[���7BKl4iMZ�+O��Sl,ieI��������X���tQ����*�,6���$jOou�Xk$i%I��u	<�_bcI+K�%�C�Y��W����#:d���jO`��%��	�)]w��
t,����%����G��K��X��������0�F���F��n���+f,����%���uG#�%6���$����Tr���%6���$[m�:�S�)6���$[��P`���X����=���/�y��%�,�Z��G�}�_%K��8����������K|��,�S��&<Z�`��%6���$lO3 1F��b�Ikp��Kv1������X����=]�����fKl,ieI��f<r�������V�D�i�c��5n��%�,���j�Xl\bcI+K�5j�#:���Kl,ieI�IIv����)6���${���������*Y:}p�Q�lFEkK,3��*'�YL��=���@OJ��h�;���w=�&�Sl4��I������@[q��&�4������x�1�F�^�dmj�U��i��F�^�d���|D�bOZcI/K�F�w��
�Sl4��I����k$���Mzi�5�i��2jVO����&Y'�/�#�6m������G�Y:���t.�UN9<��a�D���]���,�Mj$�%I��������/����&Q�:4;��L����%Q�:�W�%6���$�'���K����F�^�d�e���X���F�^�d��f�`���v��&�4��
 @2��z��&�4����.W��Mzi���K��@�`�����Q0}"Q�'�p�
�o���h�K�lWF���Mzi���8\)��Mziu�	�R�8-����&���nbw"Kl4��I�?#�K����F�^�d�?��{����F�^�d;��6���;,6���$[`�)}�C�b�I/M�/�)	�N��x�oB1����9����nx���Q�_�Mzi�m�\�/��h�K�l#H$t���Mziu���&k��&�4�6�L���A�k��&�4���$@B�`;�)6���$��i�M,6���$�m�R�=����h�K�l+$���Mzi��F�W��P��x�oB�7e�C7<S��NZcI/K�^x���������h�K�l���B%��/����&�:)H�he�)6���$['e����i��&�4��I�p�|���%6���$['��V�o`��&�4��I!@�G��M����&�:)�
�6�[b�I/M�uRN5��d��t�7��~�z����X|��5���$������	��5���$�����K�4M����&Q'��-5lG��F�^�d[[ �&5���$������{rKl4��I��%�0��v��&�4�6��p�����b�I/M��-i�{��Mzi���I����u��x�oB�����"�������NKl4��I�sftat�mZb�I/M�N8R��g��&�4�:�H
���h�K������3��h�K��N��*��M����&Q7��`���5���$��3����Mzi��9�!��iMzi��	��;�9s����&|��T��$����)+��g��&�4�z��(�a��Mzi��	��{���%6���$���f���q��&�4�z��
�4�����&�4�z��A}�)6���$������9I�$�$�:���A�.`��&�4�:�����\b�I/M�N�����iO�M(��<p���^�	���[G�N����'�Z���^�+Xj�I/O���=�4I8O��x����~"��7�F�^�d����zM��d��'�<	W�.�V��nSOzy��]�5�%���x���l�pZ���������^����B����'�<�W�.�&�UQ�~����;������m2��X����7�|��Wp�KzY���j0���X����'�|t�y��KzYu����KSk,�eI�
��{�L����%Q'��_h��F�^�D=p�����ZcI/K��7�fJL����%a�{��e<2��h��,��3>�Q�����wex�����x���������:�����'�<���LH�}`f���x���������nSOzy��S����E�Vm<��I�gB�(���x������x�wu�j�I/O���FH)	����x����3~����
�Vm<��I����C[��������<��T�KDo�7Wk��0���^�D�q������b�I/M��82Z��~`��&�4�:�H����Mzi��y�J�+>���^�D=q���o���X�����|��p�Xl4��I�
'@Z�&`j�%�,�:��;SS�)6���$��S�I�G���&6���	���;t�Cq����b�I/M�R�k�{�D�Mzi��N���2��X���l�����,+7�F�^�d��3 )�MW��h�K�l������N����%������>�Kl4��I�^8-]-I��F�^�d��S��
t.��h�K�t�p
8>G|O�����?A�8�N�������/����������x����O7?l���0�S�����)5�W9��b:e����'��X���l1����m���X���l!��B	�KSl,ieI��Iv>�����H�J�l���R��+M����%��%iJ{.����%��%jj�/����%��%jr��Xl,ieI�\	[F-`{�%6�����Fiv��
>{���d�������Ri=�;��r���t�����/���c��%�,����G��yj�$�$�Z�DG��`F�KZY5�y��	<�XbcI+K��4������=v����_1�$_.����I:@�%��� ��.��.w;�dY�9�_������R�U{����@��F�f->��$��35w��$�%�9=� oR�H*GTcz�������%�,���H��0�J�T{�{R����c��J�T���V��&0�.�I��glqPi}m����7����;�����e�����T����Sr�^�.V���D5�;�G�.�.V���D5�;�Z��U���D�����]#�%V���D����=X�x+KRY"[������Xi��,���.&��ns,��$�%�q�brk��{+KRY���������7�����������x���.����=5��H1���XY����t1�;0���J�T��g�{�k-�%x+KRY�������`��]�,Ie�{n�514|\beI*K�s����i��&�K)n��l��
�v��$�%��l����]�,Ie�{.%�hc���]�,Ie��������yv�$K��36:���dlu����o���EwR������NDK�,Ie�jO�hjj�5�XY��������,��XY������VI5��+KRY"������i�b�Ij�����p=�)V������X�#�]�,Ie�]g1�:L�XY���@0����.V�������C�����7�������,���G�[����g���r��V�K��XY�����S�=�t��$�%n9����4���T���; `Z�]�4I
Z�Y�����6���T��y�c��y+KRYb����Z��beI*KT{z��tN�8���T��)�c�xZ�)V����Ni�\�p��)�I��glu��N��Oa�t�%�3�y�S
i�XY��=�t._���$�%~��X�t�Xi�:�P��RL�-a��.V�������M�	\��beI*K��E�4�8�/��$�%n��lR	[�beI*K����l=6��beI*K�s����������T���Djb�����&Y��������a��<4�7����3��t����Fi��%�,���H�,n���&����N���2X�beI*KTs���JI�����T�����#�9�w��$�%�9=��GX���`���t�#����XY��7CM��"{O��$�%�u��G
�<���%�,qw;�zll��7������nD�c^�����&;�Yt'�����h+fk�b�In�r
jkjm��]�4���kQw@|
����J�\��&�5%E�MS�4���kS[�B��M��J�\��Fu�0]�.V�������q��[hK�4���kV;�sj�C��J�\��vu��|.�6�+Mri�z�}�_2��j�$M��36?�qz,Zvs�d��
Z�O�S
k�L.=��l�%V���D5��5���-�w��$�&�a����bN��*KrY���.����x��J�\������axCv+Mri��6�&6�I��J�\���h���x0��.V�����9�Z=�����&�4q/|��J�`��]�4���}:��j�XZ��s�	�h��>�Vel}��"�R,��$�&n]�f��mw��$�&ne�f\����.V���D��; �L�+Mri�Vgl&��0�b+Mri��g��������J�\�����U2�b+Mri��,��d���]b�I.M�$�}�����U������������J���<)�TG�Nx�&fg��J�\��Nx$�j��m+Mri�:����i��&�4Q��H�6c��]�4�������&[��n�Xi�K�	�8���.V���Du�; ���*K�,�e�[#wT�����]�4���[�"�d#x~`+Mribg��Nq���Xy�\�bk���=���^�k&��G��J�\��^��)-N�+Mri��G��MEg�]�4����!e�
	���Xi�K7C��6P�6�b�I.M�)����}�]�4�������>���&�4Q��
�	K�,�e�[���b��%V��������P����Xy��W4O��bz�)�x�w+Mri��L&�����K�4���[�2��|�b,��$�&�>������Xi�K��e2>$,_ZeI.K����4��~�b�I.M���}��9���Xi�K��e$���4�J�\���-��
��MS�4���]7�#����Xy�\��;�Ou(���{?��W���+Mri���t�����b�I.MT/|R����Xi�K���T�"X�g��&�4Q��1����MK�4�����w@Zv��]�4���[9�O^�����Xi�K�rf������&�4q+gv@R�x>�J�\���3"���i���u'xo����1���Mm!`��]�4������2R2%0v[b�I.MT/��3�7�b�I.MT/|7��wv��$�&�>�.�3�+Mri�z��J�g�)V���D���pS3�����&�4Q��H�	��w��$�&�>���A�i��&�4�����w`>�]�<}�C�tXO�������L��������\��9��56z���oj�I.O���}������oj�I.OTO|�lA_��V�����^�H�
&%�M�<����;�GD��������\����!5{p|����\�����3����Zy��7�x�&9�}�ZeI.K��=�n�$0%��V�>�N�|����l��'���U����u�M�<>����\������38�mZeI.K\G|�*�`��M�,�e�����&�{u�VY���	�|�\��U����u��)���lZeI.K\��5	��6��$�%����h��VY�����3����*M�����O��L���dl�`������\��9�m3���p����\��Y�;!�zp��7��$�'r�pk�?p���V���D��	Ipv�M�4����9��jX�7��$�'r��>���2�M�<����=��������V���D���KL���Zy��=��5����J�g�)�2�����o��b�I.MTw��B�aZeI.KTg<��_}���4�J�\����m�3��b�I.MTW���7�v��$�&�+>&�R����VY���K���v��$�&��)!,r��J�\��n�f�)�v��$�&�>�i�xt�b��s<���S��`:�.��,z�w��&�4q��DS��lZeI.K�,)��
_�[b�I.M�<)���#N�Xi�K7SJ2���4�J�\���R�p2�4|��&�4q�����Y�*�Xi�K7_J4�D�K�4����1e,�B�\,��$�&v����`�r��-O�_��i{����o�������>�}����w����p��4
��[�	1[�I�������7�Vu����(����P��Nu���j��j+JBQ�����}q^bEI(JT�z�?}��&�]�(	E�jP���Xp���%�(Q��AG���]�(	E�jM��'��R�*HBA���s����v��$%�%=�"���*JB=B�;ZL�}�;m��Q�������Ls>a��.���~��M��M�<��%�(q3k{�[L0JS�(	E��T��h�y��%�(q3j�9+��OpC�(	E��L��[��]�(	E��G��Y.���v��$%n
�NG����M�(	E��=��`��]�0	5w����P]���]�(	E�kk�eYs�y�"J��3�7���.,��
����y�&����ss3w��$%�)=���`��.V���D5�G�[<��r+JBQ������<*M��$%�)=��4v��$%�)=�H����+JBQ"����lk���)V�����'�}�hV�%V����=�]F���+JBQ�n�t:���]|�(m�����[}b	�������Y�&��t�����v��$%�I�>��������P��'��@�"x�y+JBQ����t���e�+JBQ����sVu`��]�(	E�}R�5���w��$t�M������Iaw��$%���lj��2ri$� q�cKh���%�(q����>a����"J��3v7���.��4�������/��t�������P���������v��$%�!=�M���v��$%�!����YK�(	E�lHw>2��L��$4���G�
W���K�(	E���8�2�)�(M��$%n��N����U����=�?f����K� 	��;�G[�l���Q��������`�^��������7��
;�5���+JBQ�6�K���XQ�����QB�'�)V����.m���	�J��&�7�t0�90��U�����"�J-������P��)��8�����
�P��v�f��$�bEI(J�3�}����(-��$%�]����4��������
v��\��$L�-����Mn�1����+JBQb��n%Xl&����P��9��Pcs��-��$t��������^�.V����-g^L�.aS�.V����-B�{��5�.V����M���Qp���XQ���6��Y����P��Gv���&ld����P��^DhR�`i�]|�(m������GR����b?�����%����w+JBQ"��}���Y����
����jJ�hBHk�.V���D5�S0�$�-�v��$%�)��h��%�v��$%�)=��g�XQ����t�����XQ�7Mh���bEI(J��#���2+-��$%��o��Zx�"J��3�7���X9%���.���~�I6������Xa��\[�
�lZEI,J\[���c��%V����5���!Fp�l�&�0q�ig\����Xa���3�w��v��$&�=���ZZEI,J\{z����Y�b�I,L\���[�:�cZb�I,L\��O\%���[�i{p�n;@���B���)����4���%�<�����*_b�I,LT��;�Z�B�b�I,LT����c���o+Lba����B���]�0���jRw>bik�.V�����Q�L(,��&�0q+�8c��0LS�0������\69|�b�I,L�;��d����b�I,L���=j��N�+N��O�8| 1��?����f�k,���
�X��u�)����.V�������L��'��
�X����#�
OsS�0���[o���x�m+Lba�V\l����in�&�0q�9�Z���Xa�I_�Y0��*JbQ��l&����S�0���}���fs�q�b��3��E�������%��Pv��$&���x�+�%V���Du�;9��y]�Xa�|���.V���Du�;�f�J�.V���Du��U��&�0Q�1syka��Xa�����#���b�I,L�j��\�c��Xa;����R�qb��3�������x���I!�)�v��$&�������s�Xa�|�H��v��$&�>f���j9�Xa��aP���b�I,LT|�3x
|+Lba�z�#�>�1�+Lba�z�s���m��&�0qv>R���b�I,L��c���[Z��3�|�O��b:�)���W�K�0���[����\�p/��$&n��dj@�
�b�I,LT|6�D�)V����-X9�Hz+Lba��L�����b�I,L�����h+<�M��$&n��S{�g��
�X��%+{d[���!V������9��DM]�8}�?��<Ou���{oZ�`��&�0��a�j��n+Lba�����Z�A��Xa�|�0�w��$&n=�1�D���.V������Y��t�b�I,L�z�}�)-�#�+Lba�����Eo��K�0���[s��_�u��$%v5�Hu������g��Z�S]^c:�5�-X�p+Lba�:����xe+Lba�:�u�HJ�H,FT����|#�]�0����}w>R�`n�]�0����}w>�+z+Lba�z�#�.��6��$%��=��V��m+Lba�:�cm����)V���D����J��b��3���J�T�����+#G�������X��Y�; �G���oj�I,N�<��Z���j�I,NT|Rc+�d7���X�����5��Nv�Zq�7xo�u`f�����X���� ����Xa7x�����*����X���K46�+����X��9�K2����vK�@}����D����$k�u��*JbQ�:�&�����VQ��
7��
�}oZEI,J\'������K�(�E���������6��$%����P���`���w��+7��$%��=&-t�w�*JbQ���w%�(�E��y�����
�g\B�7�S�&���6��"�U�7��$'np�������Zq�7x�GB����'�8Q��H��9��Zq�7���\�&��V�����>�!����Zq�7x�$�������X���Gp�=��.V�����n�����'�8���wDj�|��V�>�J�U�S�'��/&����
�X���x�����
�X���xl��`��]�0�����w>b�`z�]�0�����w>�K���Xa��|���S^�Xa�	�T��b�I,LT���"���*JbQ����`��b�I,Ld����C��U�>h>U�������x0��+Lba��AI&�h�r�Xa7J2>8��+Lba��B|�NsK�0����
e�������
�X���PFy���i�&�0q3�t>�C3�.��$&r>p�c+�47�
�X��YQ:�|57�
�X��yQ��eS���!>���?���.�6���{��_�H��?}���_?�}������z��w�~���_�~�_���������}��/���?�������e��������w���-^��_���o~���/������G%��a{�������2d�?�?>�jb��m�����������������g�����?�����^|���7�^�����o�����?~�?����_��O���o�����|���?�������	h����	i����h����i�K�A/���i�+�A����
i�W@�������}
4�k�A_
�i�7@���
��o���h�k�A��/��?������������_�?��x���+����/?���~������/��~{�����w>���_�������}t���9���M7P�Q���o�r��O���~���wwo��}�������9}}f*sO=�y��n&!���`.��/��_���?)6d���g�MF��g�M/�6�D��i�K�M��6�B��
i�+�M_!m�
i�WH��B��5����6}���k�M� m�i�7H��A��i�k�M��6����)�K�R.m�?O)����?,�~����w�Xe}�����w?���������)�����������������c#������~�����i#?�����Gr=>��;���f��~�{��c��O5�\��w?��_���[�.'?�����h������W9-��?}!��������
j�����tD��&��������':���5�'�����8��F�dls�`��S}B��f�rI�f��]��}!�}�]���
�95����o0��`�������)E�+��y�'����#IS|y�F�#�k9��6��xH?��q�p{S|�5N�	�n�oFMg0�W<duB�b���5�����Rb�p�	#��n�}p���3*8�
�	s������tfC|B�D���Z6���vn����z�!��t���P_����1X0$������Y�+��U]���3����E�!���7�����!�n�7�f��.>a�rd�����07��d��V���s������D�+��������>��X���<D�S4��`A7l���@��C�]}�E���$��A�W$��&8��+��#}M��f9#7��^��]���)�.��#����H-���}9�dS}����`��<���L=��L����k�������?����k��;p�������g2nSo��`�m�t=�W^H�Q)���q������ZpE0�W^H��,�r�������1�^�T_���z�����pv��s�W���=����6�W����M���)
������Xb��1���@[+��&����e��6�!�_�����&�ML4����������1���/��7��d���~(}q\s����������6p�:��o`-�~	/0�dj���b�
[��G���=���<�W^����g0������*����U��p��fYI}iR��,C|������<�{3�Wo`m��L���z����ve7,
��x�,I�w�F�������)�
�����C��*�>��Z"��nrR�dM�=8�W{�G�q�n������1xl�����9��F����@����!�����g���������������8���	����OUG#�1���W��G6����+���_�\,8��������O
����Wn`���
�����<v�������h#��)W���t�x��=��"h�����L�L�������{0�D=�vO��*|Gl�����?2�o0\{��dq�����~���S|����>���lT����`�=���_Ac7����Q��_�K�Ne��e�?�k�.�+����������������g�.9���������T_�d�8�W��lbt����������)�>x�A�������5i����Yq���dm����C|�����`+X������`���hq�!����>`Q�_�})�[�S|���Z��NZ���G�T�2�g3r�E��h�r��s�
��	����6�$��o��L��B�}�����
�P��_���Q�+��1�k�$x�8]����3[
z�$�3;��a������2�t���=��J�{X�@�l������cZ���kg�sc��a��_;���L���[m#WCS��������!�xU�%
��X<m������*��Jek��b��v����hj�	<����SR�!�~�����>F�B����C|����(�� ��)&����^y���L%0g�?��H���v�&��Q���L�g�������-��G�M6�����`j�uD���{�T4:�L��]��V
�-o��{���o��n��+;��3c�t���!6�9J�����q����/]�'0���[��K��xwN��������F<I���t(���g��S�s��#�u��lAW����rj�]�<�/��3)�����R9>���\S~e�1�;������/�y��Wp��p/u��O=A6���!������S~�m�C������3������9z��S�\�r,�<z��<2��Y���������9�W6&�G����NI�|�}�g�p�����#S$�	�\��N��<r��/0_9������wF�9�]��JpU?��q��^,�	{������������#xmb���*�����!5�6�pz<g/�H��q}FD{�����@��l,�.	=���T����*������E��k_(1��Jz�R�c�����������__���������G����������|���?���~����w�	��?�9a����'����|��Ow����z�_?��������[����~|w'�)w����_������������?�+�)_Oo�Y}z,>��>����_��+���L2�����=z��Oo����?�������o������o�l�/w���{���_�~��`}�������������{��7���'4��coM���hKkqTf�[_���������)�c)�d��������lrN!�Kt�]�46������/h���������_�t��	���s	6��T�����a��M,g4��%��}i�m���G���������G�Y-g�a��p�wZ���d�/�����w��}�\pA�k��3G����g|����S&�W�m��|h���[�wD���?����K��!����r�A�{���������:���A��{��{��N����^zQ}���{�L}�����)S�%���C�=�L1�#�T���T���.�?Oq�����E���h6�C�i3����c?FS�R���> k���4��%�/�������?iYp6.�����P�1lN������.�8�G��v�j��K�i����?������O�.h|o��.�ZM:`^�\�m*?�&�?�i�����E_������r���{������c?�
�9��#��1��Y�����>��Wc1���Ao������[[r������`H�����K�o=������}�G�m�9�%����z������>��9s�%����U����$��?��0��sA�z'?�[]��0p��w�����9��4>���b��V��g���.i|�����p�i�{5���_]��Q�����}�~�m�)����4�/'c�JG���t�r��K?6��D�B9:�>���s�%�O5���pl��O6���,�SA�:�<*F�!��m���+��-��Y<���;�zL����St���N�V����!��r��/Nc����.���������1����}��E����� �z_���
6�\�M��C�j=�?v����%����y����W���9�9O`��3����N}���97,�r$���s��m�+�)����p_������l_�xsN�����x����_]���b2�T�}���v<���[h}MPG�����<i���%���������;�������>��R�/��}�h�x&3�1��w��f�Zl��|>�Y�7<����Sj����iG�W�4>��o9������9'�.������#��������c]��l�9Vg�}���;����N�P����|	����s�
.h|��B���{���c��0��S��[���>&H5jF-�Kmz_�tJ������e���l�����<���W6?�RF�l{_���ju<%�P��������7'����/|���F�����s6<��������xl���I��^_��C(���K�7rHEOK���B�wS�[=�55���)����hL
�M//l~�m�������93���7�^5��N*�������^_]��k�[��m��e�z���__�\��w;�l�)�|s!<}}�R��c'�����e�o=��yn�l~{������|��d���G]�,i`K1�����:'�{yI��+�%�m����)'�
�4?��v�����t1�r���e���[o{�������?g�����c�R�������I�4?�q��s�K�/�'��I���/b?�q0�|��P�&?�Mf�
;�~�[w������5�jnG�����~yY�](5��vH�`��N�5|uY��(L�[�����#'9J��}���������
��}�JH�ft�f�9|ta��i[�G={��pQ��M>���������G����Wv�\Xv��{���{�d��Is�8�X�����G�j����GL�`�)����Z�C+�������'4o�)c�W5��>+�P}l�HJ�VO
����R�������W�����S��o.j����z��K��Q�d��I98^_��qx����c�;r{�������������n�(t��R86rc�_�{s�>�F����z�{����cI�\~uQ�]�=hJ=n:�����_]�������b�G�y��S�M���1�1:�D.�9���7�������i��7��q�^_��a��'[������(���O����C�����F��'p���y����o������=pm�.������e�/�T�J���#{%#n=i���_\������� �����.k}j�G�e����<�������NM��r0Y�Iw.w��ci��M� {bK.�r������QW=�s1�y!����t�N�%���@wv�QG���j�)c��������pd�)�c�\OZ4\����}`��B�!xN������$/1��s<z���$/�\�~�}
��;�z�4�__8����/�:v>��<�����t�]g�. ����L��5���q��@���k������]��#�������r����c-�r`�?�����N�^�N,)�y��1@���i�.i~�~��u�/8�x�YW�.#�f�R.}�h�����s�/�����ms=$�S��<������=3�u�N����}D����������vp������pI����J����gGB�l�In�E������Ps=2�f�OZ4<������#�qt�sr�2��q�q�?�p�����K�GT�����h���'�R������7������9>��H�Q�<7�r��;��Qwc)>�l������������ZH��x(��+&b'��_����B�
�4�J���e����W�B8zn��Zk�n�������5���1����*���z<W��`P����!�UX�����g��c�8���I������B�S�B�u!�?�B������������_>�����HD:�C��9���p�������\r��r��m�Ag�?+��Y�%�C�n�������W7�6;��E_�I�qI�sI������R��{Tt��pI�c���t>����y�����H����<3�S�y/���j��t���R�b�9x����c�=j�e{4��9a�����j�}����b�l5\O����Z����9�N���5�����|0wX=�N���}�K��O�6q�Y0����q��p}����zcZ���t`j�4�r������Wqc�B��X�<���btj���q�k�!?UR�����J�����CV�;����Bx�o������8�s<����VG��X]���S����g�C"��mG����(y}Q��-���x.�|��/�������O���[��6�{�����/���O_~b
���w���?}|��S�E�i�����w������~�{����Y�sS|����?}����?���_����������|��O���w������zw�?�_?����U?���wW���?�����?����7�6��/�����/~x���w���_����Ow?�xTs������6�.��OW��!6Xak(o���Eg��S����K���J�d���<����X{_V���4�J�d�������	L�0�J�d���6��Y�^��\�*M�iz���G��{��|"�J�l���B%NSL`b�M�,If�Ij���J����U�$��$e�������?����Vi�L���9����4���d��kt�f����fY����A�-��b��M{�]�<:�iU{����P�?���Vi�L���_����MS�4I��jW:!��oi�&�4Q��>����Hyj�&�4Q��`l�k��*M�i��}��������Vi�L�����v_Z���4�J�d���u0���������U�$�>��tf&��l�M�4I�����
�s���,M��36@���nL	�K��7����C��u�b��/�����U�$�D��[�7��6�I���}�I���
���Vi�L�������E��*M�i���������U�$�D����U1Oji�&�4��������t���D/���LL�b���*M�i����P�_�*K�Y�N��r!�3-����=8c����V����[���jR�"S���j��ih�&�4Q��1���4�J�d��F�or����U�$�D5��x���K�4I��jTOB��WK�4I��lT�B��a������9�+��*
���1�J�d��v�7������s6��$�&r�������U�$��
�Li1a����,M��3�?����)�W��w]>�7����C��u'$��9SK�4I��jYwBB�0MC�4I��jYB
x�ci�&�4Q-�N�/`���U�$�D��g4��ih�'��07���a���U�$�DNRZ.h���U�$�D�2�*�c�+�$�$q�
�\�aj�&�4�3��b��DK{�4m��� g��������f��Yt(9s����y�K�4I����:�W��Z�I2M����W����Z�I2M�T ���uC�<I^�vu�pF�!U�$��-�f|N���Vi�L7��������J�d���u4���n�N��$�&�U�k��ri�&�4��b���HK{�4m��� ����;^K{�]�,:������Q��Vi�L9wuL����J�d���ug����B�Z�I�tC5�Gb���ii�&�4�S�X��dj�&�4�S����-��$�&�e=���3S�4I���yk�5�����J�d��������jh�&�4qO��|�����Y��gl�pW}�y�Pyho���E�R-�1�$�L��*M�i"[�=���9�����jYW�CsX�Vi�L��.��T�`yi�&�4Q-�bj�`���U�$�D���)�lx\Z�I2M��&�b�u��*M�i�&�0�f0���*M�i�Z�#�	��Vi�Lw��T���iHo����������:|L��v���P�a������U�dw)9-H.�g��Vy��95H���W\�Vy��;9��N2���l���A��M�0���l��	B|��r�Vy��;E�Co-��$�'r��XbCS�M��$�'v��&�]Z�I6O�$�Tx|���i{p��{h�+�����N������G�����Z2�[Z�I6OT�������U�d�D5��)!�'��Vy������T,n_Z�I6OT��a!d���U�d�D5����<>�
��$�'����-bS��*O�y�����A�ii�'�<QM���oC.��$�'�C>g1�2��*Qu)�uO���c��e����Z�I6O�c�.��VY�Z�I6O�c�����OS�<���|���S�Z�I6O�c���������l����]���4���l����]���M��$�'�1��ZF���U�d�D>�����
��$�'�r�2x�`i��������@T�<�`��mi�'�<Q�db�`��U�d�Du���S�M�M�<������Q��cC��*O�y";����&��Z�I6OT�<�CF���U�d�Dv�k��nR�I6M�
�����,��$�'�?^������U�d�����Gw`�r:B=����tO�d����$�"������l����3���M�K�<�����;�[h��i�'�<Q���H.��$�'�?���h#xdg�*O�y������1��Vy���1v������l��yg�F4R�I6M�����ri�'�<��.�PP|i����)�>��{~�E��&,��$�'v!�����K�<����a%d��BuS�<����a%:����*M�i"�w�@������D���[��}��U�d��.��+^�nh�'�<���DW�h|j�'�<������|=S�<����_����[Z%��.�b�ro?����x0�g0c��*O�y����T6�-��$�'�?L��a/`i�'�<Q��>����^Z�I6OT�<�\���K�<������9�����*O�y�:�}s	t��Vy���!�����[Z�I6OT�|0�����*O�y�;�>Y0���*Qu)x���.�Qro\���X��M��7�;ps+Q��������h,�%�(�O^��	L����(�Dq�rob�U�]�D�&���7�K	 QK�D�&���{���`��J�l��~y3���QS�D�&����`;�w��Vy���1��k`Q�]�L=������*��3��4���S�X��M�\�L6Q�Vy���1O&'pfi�'�<q��l�-\�-�%�(�_>��V�s�X��M�/���lA�`��(�Dq�rkjk`��]�D�&���;S|� QK�D�&��������Xn+Q��";�����K�D=��`���*e����������*O�y��������|i�'�<Q���HK8O]�<������9���yK�<������1��<M��$�'�S>����pK�<�����F�����|'�'�K>��!����l���d$�)+O�y";�%��9�J�C�"����J�2r��m����M�D�&���wH�M&j��(�DQ]�I�sVw�%�(�O��I�����(�DQ��I���w�%�(�W>�m[X�k��(�DQ��>�d���Vy���-����"�_,�%�(�_�!��5p�[b%J6Qd���F9y���.V�b
�8O��Nez���"��[Z�I6O���=2B�`�Vy���/��z��4��Vy���-�cN	�)��U�d�D����S��[Z�I6OT�|�a-cV��*O�y���q�S�yj��x��>yg����ih�'�<Q]�c�XQ��Vy����gt��/K�D=D�)>�1\�C��m<i����l��yg�Z4e��U�d�Du�;#��+��U�d�Du�;#���J�l����M������l����rZ4h�*O�y������/K�<�������f�lZ�I6O������K�<�������:<������?>�����o��{���������/���r������F|v6�U,��������7��u6�p�vi&�0Q��>���XZ�I0LT�����6��$%�g�'����bK�0	��jX��&FOrC�0	���Vg�r�X�Va����Mh�`�*J�Q����k1��Va�����
S�8	v
����6����=8c��
[0��!�������?�u�[�4��*L�a�Z�������U��D5��������Va���SW��47�
�`��&um�6:2
��$&�y��E�SO��$&�M=F���|j&�0�m�	���-��$��������iREI0Jd�E��Cz�(m��� ��5���!���~�I��[�����U��D��k�������`��uL���
�`����;OrC�0	������/��Va��n9xx�Z�I0Lt����}-:2I^�so�Xb��LK�0	��jP�>ue����*L�a����������U��g�wPq���B�������I5� 	L���
�`��6��k��5�Q�����X�qih&�0QM�1�4�L]�0	��jR��&Yl���
�`��&�X�����K�8	^P��}8[A��Va�RcL����Va�L��.�u��Va7d35�5<��Va�������L�-cMX�[��g��T��������U��D5�; �[��ZZ�I0LT���Z-�M�0	��jTw@Z�p����`��6u'$g�f��*N�c`n�gS����U��DN�Q[�h���U��D�%��
����U��D�&�Cj�E��U��D�&�]������U��g�y��~x���C{�=�,����#8���i&�0Qm�`�w`��U��DN��b*��4�
�`��I?B�p�4������lT��a�zj&�0q���m����
�`��i�M
1�0M��$&�QM�6`3��*L�a��0!�OsC�0	���7�E��X�[�i{p��w"4�E����j�?��$g����g��Va����Jq	�ij&�0���>����ih'�s
���&������*L�a"'���5��_Z�I0L������7��$%�M����bMXZ�I0L��Z�`�Inh&�0q/���[C�TQ�9�H�
<����
�����Z�/�j�������I5�; ��!r�*J�Q"[���R+�xZ�I��@�������Va��.&�0�7��$&�E]L��c��*L�a������
���U����lkRN��Va7��i-���*J�Q������@�ii&�0q�[�����>��Va������Ls�a���j�?��$����#���*N�{���#Aa�*N�q���KrnR�I4L���f����*N�q"'����U=�Vq�;�G��B~�*L�a"������K�8����W$��U��*N�q�g�����U�D�D�-mC������=8c���3���GC{�}�(h?�oL5��������Vq�����f��G�Ta
����Xg����*N�q�������K�8���jZwD���-��$'�m=	����
�h���������*L�a�Z���6�.��$'�e=�n�-��$'�#>�k0���*P�(h?��s�q;_,��6���h����]�`���U�D�D>����q�Z�I4N����7�t��*N�q"�vu1�Vq������0���h��G�]�	�ij'�8��r����S�8���|�����S�8���~R���`��V�z�G����c���x�/�L�)cMXZ�I4NT_<�PX�oi'�8Q}�dl�`.��U�D�D������V��*L�a����T:6M��$'�+���`#��[Z�I4NTW<�ds����U�D�Dv�[n����U�D��-�b\ju��Vq�;����'��U��Ql��@-��<7Jr�b���*N�q����_�m�M�8�����wDl_��8
��$'�+>F���.7��$&�+>�/��M�8�����wD\hX�Vq��w�@x�`i'�8Q]�1����N]�8���[8��81����U�D��.�hB
����U�x������W����8����*N�q"�PI�D���U�D����b�E+�M��$'r��jEG��U�D����x�ei'�8�s��������h��9Tb�p���U�D�����z@�NvC�8����C%���<S�8����C%���`|j�z�T�s"L_<�ZR����U�D�D���)6,_Z�I4NT_| �6@.��$'�/F
��
�K�8�����wD���ih'�8Q}����`���U�D�D��;"�y��ZZ�I4NT_�#bs�qZ�I4NT_<�\SE'��U�D�D��GD^g�����	�y��nTW�W#:<-�%(�/���hY�]�@����{SsB�ZbJ4P\o|:���%V�D�u��)��G�v�%(�?��m�bm��
�h��'��i���|w�%(�G>�l��j�(�@q]�g��-��
�h��>y��K��bE��>�h=U./�W���)�;��X�
�+O&�����
�h��^�5��5F�Vq��)�&��FPK�@����;rEO,�%(�S���!Q����X�
�,�3�G^�[bJ4P\�<�Tzo�(�@q�rg���^bJ4Pl�<���ZbE��>3�?U��Sn���c���U�D�D���q-'lxZZ�I4NT�| ���_Z�I4NT�|�8
k��*N�q�z���1li'�8Qr;�h�8M��$'�?>�h.��$'�;>&�
�4���h������� K�8�����HB����U�p��OUm����fl
L_��
�h���xg����:K�@����wF|��K�8������j\�X�Vq��3X�	!w�%(�;>bl��.V�DE���$VB3��bJ4PT��3�X+ai'�8Q�9��	o�(�@�=�NI�	��X�z),��OeT3]�d�O�.��*N�q�z����A��Vq��!��X:�K�8�����G�J�J-��$'�C�qM��i'�8Q���Hlp�4���h��y�M�6����*N�q�z���;M��$'�7���1aMXZ�I4Ndg<�q\[^.��P���T�m���7�U�>��*N�q����X�"�V,��$'�/>i�d����h���xG��4���h��'�M�
L�����h��y����[Z�I4NT_�#�k����U�D�D��G<�=<:
��$'�/>�����U�D��>1�l�;��Y5Q���X���>�������~����w��x����w�O�YX�������[��g��T�:�
>�Va������LS�0	��jZ'�������*L�a�Z�����HS�0	��jX'�
����
�`��vum�K�-��$&�Y�F���NsS�0	��}����Z�I0L������]K�8	v���H�m�%���*L��3v=��\�{��j�?��d���X�}��U��D5�; %Z��U��D5���	��\Z�I0LT���6!�S�*J�Q����������*L�a����l1gqi&�0Qm�Hk
���Va��&��_Z�I��C��]�`���U��Dv��

���Va����AN�m��K{�=�<��kS�2���U��D��k�����*L�a"���'��
�`��FuM��v��*L�a"�-T0q��*L�a"�����mK�0	��nT�R+jTO��$x}��`bm�k�Vaw�X�tj&�0qgYc�u`A�M{�0m����N�}H(`~�����I�Umm
0LC�0	��jTw@B�h�<�
�`��F����0}*$� QM����-��$&�I=I`U��U��D�Nmm��.U�$/��u0��5��Va�^c

����
�`���C�h�M�0	���sgl��o�[Ei{p�nw������cjo���E�K)��beC�0	��]H1f���S�0	��]F1$�EVK�0	��]D�����K�0	��lR�*�0L:�I����>BL JK�0	�����X�2fl.��$&r��
h+.��$&r&��,Xehi&�0�3���,�ooho���;�t�x���V��Y�&9�GHx����:E�DN�r/�.��$&vN�h=���Z�I0L�T�����*N���I];!hN��U��D6�s_��;S�0	����:e��ij&�0QM�H���Va�F�m��*L�a����T*Z�|Ho�����i�wbvx�w������O�M=���}j&�0Qm�hb�	��Va����M�-W5������jS{S�U-��$&r�W=��qi&�0��}�R����*L�a"��p=��f��U��D�%�skh���U��D�%�joy,��$&r.�h[.����=8c��������fho���E�~8�p���$%z�gKD���U�T��C�~��U��D���q�Y�BXZ�I0L����E�� I�jQw<�wb�Va7	���{��
�`��	L����Va�X�	-,d[Z�I0LT��bC�x^�[�i{p�~7s��/������O�I]LM����U�D�(;3uMk��*N�q"����$�>��*N�qb'�h������h���?��p��U�D�DN������U�D�DN�K���vi'�8������;K�8����_$����Z�I4N�#!8����*N��3�A�k?�b
�j~ho�����'r����3����HK�8���j][S]�������h����5%Wp5����h���uG�U����*N�q�Z���,;-��$'�u����CIK�8���j]���l�]Z�I4NT��#�j��K�8���j][�lp��nj'�8�}�`g0��*P�(6����x��nXG}i'�8��t�A_|i'�8��t�����Z�I4N�#��6�r��*N�q"��5�N�Vq��H�xI��U�D�D>���s���U�D�D>�Z�/�L��$'�������S�8���~^��X�`|j�z{�����/^���mO��$'�/��mh��U�D�D��S��J��^Z�I4Nd_�8�b��*N�q"��-���)�Z�I4NT_��C)`��&U�D�Dv��u�y��U�D�Dv�[hB�!U�D�D����������h��	��L���
�=�-�����9TR]�M�0�����;]� ��Vq�����d��M�8�����wDR��j`i'�8Q�1�����Vq��w��xR|i'�8Q=�9����*N�q�z��-h�mZ�I4N��}��F'���p��%G��;OC�@=�J���S-���x2���n�L��$'r�V|@��M��$'r��]���
��$'�I��]B�bN��$'�I��\vnj'�8��bZ0Q��*N�q"����5��Vq���x��5:�M��$'�i�dkA�L��$'z�JC��Z����a�T�D�T�/�
�Vq���V������h���xG$���7��$&�+�		)�c��*N�q����4�k�K�8��������%~�Vq���D����*N�q���#���uIWu�a�z����<�-��$'�'�!i_�
��@�b���H��LO<8�C���bJ4P\W���]�%V�D���������%V�D�����B����
�h����3�7�X�.V�D����	%yp�[bJ4P\����j�ZbJ4P\���
��*o�(�@q}�b|��.��$'�O�Lj����+R�)�0���x1�r�M
9���+P���:���D���bJ4P\����]���.V�DEu�}3-��-v�%(�S��,V8�-�%(�S��c���]�@����wFj�`M�]�@����{�C���`�(�@Q��>��X*h],�%(�W�cB��%V��S�V�S)`z���"���*N�q�:�vDE{K�8�����DhB-��$'�K>�`���U�D�D��"������h���@$�G��Vq��������Vq���8����*N�q�z������*N�q";��M�x0��
�N"����j�2}q�Ms
�i+P���:����B�D,�%(�7>�	L���(�@Q���H����+�X�
��/%�bJ4PT���\�A�bJ4PT��:����q�X�
�%��d��"��X�
�'�P���X�
�)n�
�6�X�z)��~ �������GSsL�Rsi'�8Q��d��{K�8�����G��h-��U�D�Du���.��U�D�D����s���K�8�����'����/��$'�?�������K�8������x���;
��$'�7���j�����h���x�$����*PZ�Ou����{�]`N�M�8�����{�"�lR�I4LTW��76�%6��$'�+�I���Vq����W*�Zd�*N�q��7����Vq�7��q��W��Vq����P��y��U�D���:�����>A�*N�q"��#"�X��I�/N�_��i{����o�������>�}����w����p�����k��m.���M{��,��|�;F[�
��U���Du��X�|�K�,�e�|���k�R%I.IT�zV�s�,��$�%��m[+��si�%�,�On�b=���*KrY"�v�Gl!����\����p�X3ei�%�,���1sxd�Z�I�]H�b�k�-����=8c��J[09$�~���h�?��d���D_�{�K�,�e�jN�,��O�r$�#�5���
J��*KrY�Z�����2�K�,�e�jM|lh�4���\���t��*x:s�*IrI��cU	��J�\���t��Ju��4�J�\s�mK���S�,�e�kk���~���Q��glq�s_��lK{��<��iK���z�Vy�ZeI.Kdk���KK�,�e�lM�&��J�\���t�h���U���D5�{4�jC���U���D�smc�W-��$�%z�kB�G��U��.����M�)a���*KrY�����f��U�����b���a8/����=8c��;�N�hI�M{��,��jN��P\�/��$�%�9�*��4���\���t�#����K�,�e�jO>J���U���D������Yv�*IrI"���V�{fK�4	^J1��`��	��VY����b��4[ZeI.K���)U0`ZZeI.K��������(K��36:����������d�El9cs��*KrY"�D��Y�I�$�$��!k���U���D��b���4���\���Cp����U��������f��ZeI.K�D�-����ZeI.K�D�5���*KrY�^09��&��ZeI.K��!����g��ei{p�F9�G���y���F;�Yt'9�G���9b�VY��9�t�����*KrYb��.,�����\��Y����Vi��P��d��	s��VY�����.ld^ZeI.K�������VY���������&lZeI.KT{:�[�XZZeI.K�=;SS���L����=8c��;�Z,8x,��v���Nr��Z�GsO��$�%r��������U���D�;]�7;�Vi�;�P�io��`Z��U���DN����+,��$�%rj�|�zj�%�,�S{�V�Yv�*IrI"�	=�F���U���D�j�h���U���D��sp�4�7������rj��r@'������N������w��#~Z�#���$w`�����"6.-��$�%�1]MJ�a���*KrY��B7���9K�,�e�jLW�ks`��i�%�,q3��h-��$�%nZZ�h�4���\��gxM��bC��*KrY��[��h3{O����=8c��K[T
�Cqio���Ew���>$�
[�S�4I�Py���S�4I��jQG��O����U�$�DN��[t�K�4I����#�jq��Vi�L�����5����*M�i"��(��Id�Vi�L9H���3��*M�i"g��:xM7�J�d��9D���!2�7J��������

�7��v8���a�D�1��v�9��XZ�I2MT��������U�$�D��;!�4�,��$�&�]mM)L���J�d��vuo2�/�I�%�,Q��Hj�ih�&�4Q��1wE��^Z�I2MT���f�
����d��V�X������Vi�L����`���U�>��X������<����	�H�Z�I2M���)����*M�i"��>E�R��*M�i"��k~����*M�i"��.xlZ�I2M�������^�M��vj��G��Vi�L��vt%���Vi�L��v�����*M�i��
��ZxtZ����-j������������*M�i�����R2F��*M�i���������Vi�L�
o��3���d��^xM>C0�J�d��^x2>F0_Z�I2MT/�����U��Vi�L����+C�,If�[ ���6�.��$�&�^c�,�������U=���RJlp���U�$�Du��H]����M�4I����;�J�|�Vi�L�	����`���U�$�D���xS=X�ii�&�4Q��>�8g��ih�&�4Q��1���F�S�4I�����u�M�I�i�&�4q�!�C_��U�$��������"XZ���o[W=p����t���%�	��Vi�L�\x�	�ij�&�4�����z�rj�&�4�����zjj�&�4�O��2z&ej�&�4����Z�:+K�4I��]����fp�Z�I2M�,)�tl�Z�I2M�,)%����J�d��g��K����*O��P,vOu0���S]�b�M�,If���w@l��d��J�d��^x0����MK�4I�������'�M�K�4I����������Vi�L���P:7%��D�D��G,���K�4I������sgi�&�4Q��>{�P��Vi�L���W�`���U�>���U����F���I��rZb�I2O\?��V��`K�4I�����>�E���.V�$��u���8�-��$�'�'�K��g	�Xy����&F@��Xy���w�&tq�i�&�4q}�l��c�.U�$��u���6��~w��$�'�/�M�
Lr�����w)����Rt1�q�L��t���'�<Q�q��s��v��$�'�7��	-��Yw��$�'�7��8���.V�$�D��{H�]�X���'�<������%V�$�D����R��.V�$�Du�;"�50~����d�����Z/��b�I2Od��WS�M����J���,��Te��5������U�$�D��;!��4
��$�&�;>I`^��U�$�D��7B�&,��$�&�3>��XZ�I2MT_|����U�$�Du�!41�Vi�L���h�-��$�&�#>�`Y��U�$�D��g4����k����X���*�J=/M���v��$�'�yqojr�}�]�<I�����j\���n+O�y�z�._+A.��$�'�+�i�U4��&V�$�D���rt�����'�<Q�qWL��=����d���x��J���v��$�'�;���2Xx+O�y"����s]�%V�>Ox��Lj�CM��X>�J�d���x2�����K�4I�����q�7`/`i�&�4Q��d\t(LC�,If���'c�[��TY�����M�	�ij�&�4Q�U��5ai�&�4Q��>y���%��*M�i���c��
u�Vi�L����Z�K�<}�'�=|���������/��U�$��=)nl�`�)U�$���*n\q|�Vi�L������lZ�I2M�����d1�ii�&�4Q��>�Dn�-��$�&n6q�Xm�*K�Y�f7.�	_Z�I2M�<�}���kK�4I���E�x"����g���h�j��c���������/�����o������/wo>�}?M�g�V�S�X��������?�fu1���5ai&�0Q��lj��m�Va�����R����*L�a�z�������U��D���I�E����`��>ukR�Z�I%�(Qm�<K6���U��Du�; �4^�Z�I0Ld��#�3X+|i'��!��2-��yK{�0m�����L�5�=>������?�&u0�X�l��*L�a����P@_qi&�0QM�H�`���U��D5�; .��gK�0	��jSO@���K�0	��jTc:.u��$$�Q��*z�cH%�(��Q��NqK�8	�y���cj�^��*L�a�\��XP���Va����A�-�%��tK{�=�<��iQ�!�����*J�Q"�-%����*L�a"�-V0O��*L�a"��X�n�M��$&�A�J����i&�0QM��O���Va��c#����*N�W��[&����vi&�0Qmj��ci�*J�Q�����\��BK{�0m�����6F��Z�[��g��T������
�`��6�mR����U��D���hS$��$&�M�E��L��
�`��6��E�	K�0	��lSwD�
�znh'�K*r�gS�����$&ru�Ps����U��D.��swc�Va7d3�����*L��3v=�Q����7{��V{�Y�'����+��U��D5� %�s��*L�a��3X	��4�
�`��F�$����Va������R�Ta�s�~�����U��DNy�J3�,��$&r���=8�-��$&����wc�Va9�H�
����Va����AN�+��]y���,����#;���&U��DN��Sj(KS�0	����#D<���*L�a�'���6��Z�Ip�B��Kk�Va9/�o�b���*L�a"����f��_Z�I0LT�:��"��xi&�0q��\y��
�`��;w&OsS{�0m����N�&���%���j�?����}H(]q
��$%�M���R���*L�a"����._Z�I�LC������y��Va9���\r-��$&r�[x�zi&�0Qm�H�-9=�
�`��I��E�mREI0J��o��R��m�*L�a"gi�,��Va�����]�����[�dG���WB�����~i���.��	��
��H&�)���X�sZ�^�{���&3*������03�5Lg�������u
t��Vg�I�'������O��$&�M��)����*N���M]L���*F�1�����6��U���m�nl��ih&�0Q
�bJ�`}��U���-Aj����J%�(q��x;�
�`��	���L]�(	F�{�b�-	����[�i�������w����Vg�I�'�����dQOqH&��I.��k���Vq���G��n>�
�h���>�#��U�D�D.�\�k4,Z�I4N��!{�Fvj'�8��~4�!L��$'rE��+��6���h��5Eb�W��U�D�D�+�s�h��E{�8�q�>���[@�_��V��Q�:��wL5��q%����U�D�D5����V,��Z�I4NT�z R
�OM��$'�umM�	�g>���h����5-��-�S�8���j]�
,{0#ij'�8Q���H?�����U�D�D��;"�&8Z�I4NT�z�8��8
��$'�/�!i!����*P�(f%>����?�M�v)����U�D�DN�v.Y4�d�*N�q"�t��=�G�h'�8�S�]�}o�h'�8�S�]�mw�h'�8�S�]�`e��U�D��N�N)��+�Vq�9���`�`h'�8�S�m+5
��$'z���p��!U��O��q�~��x2�����S�8�����'S��Vq��O�U�?�Z�I4NTW�#�Z�qZ�I4NTW<[,��}j'�8�]��\J`�*N�q���}�
L��Z�I4N���&���4�
�h���x	��\���h���+�a���U��Q�������*}��X(>���h����3�E�i��*N�q�������m�*L�a�z������Z�I4NTO�o_�Yx�Z�I4NTO��81��S�8�����wD|��L��$'�'>�j-�6��U�D��m�hB	4�V��$'v���yl��Z���.u������"��;���h��TZIpO�E�8���\A��7vZ���h��Tbv#zj'�8��b6_A�W��$'r��Xp�G��Vq���JF�/Z�I4N�
*���xW*J�Q"g���"7-Z�I4N��)�Y����U��Q��R9"LO<��+9M��$'�'L����J&�0Q�������Z�I4NTG�#haN��$'�#�������*N�q�:���6��U�D�Du����\��U�D�Du�;"�����Vq���X���J&�0�=���4����*P�(�u��nTO��2����(�@q3�G_��@�k�(�@q��d��\��X�
��&�
V��
�h���x_t��%�X�
7c���p�\���h���x0��FqS�@����W�c.`H>�
�h���714$�bJ4Pl�<���-q+R�)�u�K��b:���r��)V�D���&&��S�@����G��`5�
�h��N�7.0���
�h��N�H��L$�bJ4P�Lrgj�	L��bJ4P\�<����?S�8�����gcK���7�
�h��N�0�|
�5�
�h��Ny�$�
��obE��9�t]�=�)�����Z�I4NT��#b+�bj'�8Q]����ir
�p���Xo��
��$'�?�,8���*N�q�����S����*N�q�z�c��;L��$'�7>����Vq��_����oS�8����������S�*N���|�KuXez����|��O�%(�+��h�	��mbJ4PT_�/:�Y�|��
�h���x_tjK���X�
���NL5��Z�X�
���N�h��&V�DEu�G��"hlbJ4PT��3�J��SW�%(�K>v��f	�X�
�'���N	f^lbE���t�K��L�<����U�0���[�����jj'�8Q]�hj���Vq��#�+NF{%,R�I4LT<���v��U�D���B���Vq��_V���_S�8�����wDJ(X�4���h���x2>4��Z�I4NdW�GD���}�V�z(�H�T�-����e�V��$&n��h���,�U�8����9n�o`7��U�D���7����Z�I4N��q��`���U�D����g�V-�Z�I4N����0�����*N�q����'X��X���h�����E8Y|�*N�qb�7�6�h�J�.N���X���~����g?|x����_�}���������I�����#�����'1�T�:��|@YZ���\���u�����RS�,�e�jW������S�,�e��U�}��y3S�,�e�jTw>,�]|j�%�,Q]�lJ���J�$�$Q
�b\M�A=���\���t��f����*KrY"[�������S�4�������1�Jo����#�9���JD�������1�Lk:��_6���\���tXP�>�h�%�,Q�������q�VY�����|����ZeI.KTk:��
����$�%�9��!�,-ZeI.KTs���!�(�j�%�,����`���*MrMrym�+�2M��$�%���2�3pjo����#�:��t�)aQ�����?��$��-Z����VY����n!4,@�ZeI.Kd{���4�ZeI.Kd{�%���ZeI.Kd{���1��VY����n����C�$�%�lN�x�&x�Z�I���������S�,�e�jN[�J����*KrY�n�vT7{�M����~p�E��>���]���F'�IL'������L��$�%�9����VY�����J�O��$�%�9����<���\������\�c��U���D��!���w�*MrS��6���?.ZeI.KT{��h��X�ZeI.K�G�����
�VY��7\35xp]��ei����r��j�����N���Nr{��d�VY���7b����ZeI.K���5T0cj�%�,��"�����VY�����D�Bj�&�0��G�`�4���\���=�-�k��U���D��F�j��E�,�e�\5$6gQ���$�%r��cF������~p�U��Gr
����F��IL&��G�-a>�J�\��U�K��N��$�%rY�d#Z�cH�$�$��z���C��*Mr�1��s��VY�����������*KrY��?6�f�L�ZeI.KTc:�2��jj�%�,q��<�Waj�%�,qo��oll?�7������]p8;h����t?���Z�=Lq�����U���D������$�%�9�����`@O��$w�������-�x~�*KrY"�����r$�#rA�s�v��U���D5��q�]>���\����Mfi�*KrY�>o3�z0{j�%�,q3R�
lh6�7������S^_������	�I���*���.U���D6����6i�Z�I��@5���!a6�*U���D���x�h�}�*KrY�Z������S�,�e�jM�������S�,�e�[���[�4���\���%Lu	��VY��7���T"6��U�����c1�;�-�S{�,�q��]�L
������	�I6����YeS�4I�PrQ�`#�OO��$�&rY��r@K1,Z�I2M���0P�Z�I2M���z�D��*M�i"������^��f�\��GB~�?�J�d���C�����Vi�L�zH	!�E?��$�&v��j+J���Q�����`��L����9��F��P�0��cL����-�5��U�$�D���i.f�G�Z�I2MT���Z[����U�$�D���z�����U�$�D���z����~S�4I��jX��-
&�L��$�&�a=��R0Shj�&�4Q
�AH���%��d�D5�;!��G�.U�$�D��G,�iS�<}}B�������.���O_�J�d��������$�E�4I����mki(M�Vi�L9u������E�4I�����b��N7�J�d����.0#ej�&�4���]����TY��9u�������Vi�L9u����}nh�&�4�����`���U��>��R�.d�P��d�M
<V�Z�I2MT/<�\���Z�I2Md/�%W�{�E�4I�����9����*M�i"{����>�]�J�d��^x2�T0�`j�&�4���c����U�$����l\H��Vi�L�
���eq��$�&v-���403|j���O(vJw:����$-x��j�&�4Q�pg��W�ReI2KT/�2��}j�&�4Q��NHl�67���d��Nx�����*M�i�:����Z`S�4I���������*S�4I�����P���J�%�,q{!���&�<7�J�d���{,T��
����o;U�K��Y��x��Z�I2M�
)�E���[�J�d��Y�������E�4I��\!%d[�.+]�4I���[C7�!U�$��nni\�i�*M�ib7����4-Z�I2M�
)1����Vi�L��eln�<�J�d��RR�]�����	/.������-,x�Z�I2MT/�����TY���	���sv�Z�I2Md'�����Z�I2MT'<��<h�O��$�&�>�jv��Z�I2M�Z�����S�4I�������D0�`j�&�4Q��`�GoV�Vi�L��+��v/�Vy���b_����6����hb�&V�$��u����X�&�b�I2O\G�����n+O�y�z�}�q�'p��b�I2O\W�/9�bHO��$�&�+�"WwDOC�<I�����dZ	�7���'�<q���@k|��'�<q�q?������Xy����AQr�u�+Q_�R�B���t1�q�M�|����'�<q��h��`�M�<I����G���n+O�y�����N�~e+O�yb��%�T6��$�'�C�"��U�4I����7�SA��Xy������8t�6��$�'�?M�u3�Xy�����EW0Ou+Q_�R����0�qk|���7�J�d���x'�Z�m��*M�i�z����ij�&�4Q��AH��f;�J�d����B�����U�$�Du��q��=6�Vi�L��M;�M��$�&�'��^��Vi�L�_w/���Z�I2Md?|Yq�ZOS�<}�@�&�_�m*�
w�x�*X���'�<Q�pWM�5bc����d����O�c�|�M�<I�����%'�gT�b�I2OTW|�D�����'�<Q}������3�+O�y�:�}����"V�$�D��;"�&�H0�J�d���x'���`�`+O�y"�����zs+Q_'
�F�C?�L<�R���U�$�Du�����n�S�4I����GS����rj�&�4Q����X���qj�&�4Q}�d|h`���U�$�Du��	�fl��Z�I2M���-��=�J�d���x?��\1��Vi�L���M�<�Z�I2Md?������Vy�:O��x�[�����,X,l�*M�i����V�[#�Z�I2M�L�
Y�>��*M�i�����&�E��Vi�L�
����
���Vi�L7G��=���j�&�4Q����D&�M��$�&n=qc���N7�J�d��nx'�:����*M�ibg��h����.}�4�R��i����w��}|������������_��|��qq
��]=�Xujot���tR���G
fih�%�,�����(�#�QM���X&�L��$�%r��u.�CX���\�����{<VZeI.K�d�f��?���\�����e�L��*KrY�Z�#
p��*IrI"����������$�*�&f0�^�7J���WT��)���;��F'�iL'��&��S�,�e�jM�����
aj�%�,Q������q�VY������V�`���U���D��-`��S�,�e�jM�x�r�J�$�$Q��`r�	����$�%�5�	I�����U��Z<dk��W]���\���wM��<�7����ds�F���*���~�����
{�TI�K����7�E�,�e�lL���bhS�,�e�lLW����S�,�e�lL��-|�ZeI.Kdk��
�1�ZeI.Ktk����Z�I�������<Z<v�*KrY"����V����U���D.jms
X�4�7������]�/.bQ�����?�������`��TI�K���m>����U���D5�����,u��$�%�9���-�����$�%�9=���`��VY������>�/Z�I�Q�iNS����TI�K9k��P���$�%n��)>c(�R%I.I��:}�X�=�7������v�!�
����F'�IL'�������*KrY"�B����P�*IrI"�A��E�,�e��1��0jj�%�,���NH+p��E�4�
�=�
��VY���Z�q�5,b�ZeI.K�Z!����z�*KrY"W	�����U���D��ZHh1�E{�,�q�A.��}�kq��N���Nv��� O��$�%rQ�\\nz�*KrY"��6����VY����G�������$7h���id��-��VY����nHC����[���\���!U����-,al�`���U����M�7�����^���\��wu�Y&>N����~p�w4��������?�����������U���D���Z�jAYZ���\���t'$4�����$w������P�bq�*KrY����$Agzj�%�,�z������U���D.��}-��U���D��r�YZ���\���BR�;�M��$�%r���j@�-�ei����rQ��Xjot���t��z����S�,�e�^�#5�E�$�]��t5�x���O��$�%�5]M�
�P�ZeI.K��&�V�ZeI.KTk�oS����U�����1j�2C�R9����)�l��ZeI.K�^sk;L��$�%����e�Wl���ei���+.m�9�iM��N���N�-�	�
�ih�&�J�6]c����E�4I��^����J�%�,��z��*}4�J�d���=\��U�,If�\���@~�8�J�d���=j��!L��$�&v���Bh�&�4�k�4���S�4I��\=�����nho����#.>�g>S�����F��P�.��_L5��hQ���TY�����}�����Vi�L�����\�}nj�&�4Q�jk����Vi�L�����>�Vi�L����8^�N��$�&�]=�[�Vi�L����u�'54
Z�I2MT�z�7	��0�J�d��^���i#S�<}}BA/�R���[�e��U�$�DN�������Vi�L9u;�V�/`j�&�4Q��NH���nj�&�4���}���4���d�����&���^�J�d�����z�GM]�4I�����kbM��$�&r�v����!U�$�D�
%y�D7����'�{�������Vi�L�	O}��X��J�%�,�}�#��O��$�&r	��6M��$�&��	i����U�$�Dv�[�-��h�&�4Q��X�d1�kj�&�4q�,m����U�$�Dv�[�xI��U�$���dh|N	u/����	�~��.���R����Vi�L�w��6`���U�$�Du�!�{3�J�d��nx'$���t�Vi�L�
������Z�I2MT7�RB����U�$�Du�����qS�*M�i����dg�3��U�$����hJ@+�L��$�&v/�
5���*O_�F���R+nfx�9�y�Vi�L�FJ�#��}��$�&rnx����1��$�&r���E�R��$�&v�K��ne�*M�i"���P��r�Vi�L�JJ���k��U�$�D��R��Zt��$�%rfxJ�j�h�&�4��������RY��d��T�J	a���x��:s�*M�i"��6W����U�$�D���H�iZ�J�d��>x0��A��*M�i"��.�����Vi�L�w=�F��E�4I������������l��>�s|�4�J�d��Nx2)4�V�Y�J�d��Nx?��
�Y�Z���
>����6��	�7�d���'�<Q�p�L�	,~���'�<Q���x�2�Fnb�I2OTO�/9>U���&V�$�Du������ob�I2OT_|,9%Ul�����d���x�&��T����d��������\lb�I2OTw�oa�������'�<���bb�p@>����',As�"]L�S��^lb�I2O\���j�0���d���x���`��M�<I����W�
�I7�J�d���x_pr�^���$�'�;>V����i��'�<Q���H-\�V��$�&�7�7�V2�
lb�I2O\o<�@'sj�&�4��q_��`���U��>����@����y�3nM��a_��*M�i��������nj�&�4Q]�NHh`���U�$�D��B�V4S�4I����/��a��*K�Y��� `o��U�$�Du�B,v��Z�I2MT7|R��,S�4I����/g��YS�4I����F�:2�Ti��y�M��T�Tj��5�Z^�L��$�'����1V��)V�$�Du�]6�$0G|+O�y���}���C��O�Xy����KN�L�����d���x_rBs`��M�<I����wDb`��M�<I����wDJ����Xy���K�sh�4���d���x������)V��N�����T�����$��U�$�D���JC���$�%�7��u|P>�J�d���x'$��=�J�d���x'��tS�4I����wBRH�N7�J�d��7[��U�,If���'�"��n�*K�Y"w�t!�/��Vi�L�	O���P����u�@��R���Lq�q�*M�i��7>g��Z�J�d������9�4
��$�&n�N�����U�$���#nBL`���U�$���"n|���%������!��i>�UzW��$�&n
q|*�C0�J�d�����
|�9�J�d���M�,3�O����z,N��?������>�������>��r������m�4��fBvh�<��9�Oc>�vu��o[�M��$%�WMuh���U���D5��i��W�S�(�E��R����	��TA��[V?���[�*JbQb�i�Z�D��U���D��;��;���X���t�#����S�(�E�lJ�(gx]Z�
�X���D��x�?�������T��)�;�����~�����i�p�VQ����x��NO��$%�%L�1b4O��$%�)�=*X�oj%�(QM��G(��3���X���t�j�L��$%�)�lZ���VQ������P���$��!���f3���X��~w��a����&J�G�o�M�Z���Uz���$��mI��}�ZEI,JlK�gxZ���X���tu`��U���D���>Z���h%�(�-��Ui�*JbQ"[������VQ�=O�x�REI�y���oJu`���*JbQ���hL��$%��:*u�mA��6QZ?8�n���J��0��9�Ob6���Xj����U���D��;9y8�ZEI,JTKz�4�bV��*JbQ�Z����S�(�E�jI�M�����*JbQ"[���)��Va�{�b����T��E�(�E��%�J�h���U���Dn��Z{�O��$%�=��6�����6QZ?8�~���0���p���|?��$7<����Q�VQ���a�	���TA��a������$%r��l��u�*JbQ��8���i�S�0��|��;b	4
V��$%n=Zc�/h��E�(�E�\$�����VQ��*Hv6�E���$%rU�l3\�|��&J�G�n�Kw����c���|?��$W�.�6�0��U���D.��m�h��E�(�E�\�#���Z���X����s*����$6`����$[=xO��$%ng+������*JbQ�76�0dj%�(q+IS����U���D5���-�-��VQ��r���&�N�m��~p��w�2�����S{���$f�jJw<����U���D5�;�7���U���D6������EUS�0��e��;ll	�Y���X����7��>Z���X���;j,`���U���D.�����N��$%r]��K����U���D�Rm�h��E�(�E�\�����sX?8�v�\��:�[����|?��$�(���Q�VQ��xG
?���$vi�Z�u�����VQ����&��1��VQ������a0�RI,HTC���<vO��$%nQ}���U����}�oR����qj%�(qSvMN�q�ZEI,JTS��4������6QZ?8�v��	>l������'1�dK�/!�WeS�0	�OrEi<�,j�x���;|pW��
�`���t2�d����U��D.�C�O��$&r�+\�c�*L�a"����Wt�[�
�`��5Bl�}��h&�0���8k�mnh&�0���8����S{�0�q����,:0hjos�����9�T���*��nj&�0QmjkJ-��Va����6x�Z�I0LT����+X�jj&�0Qm�H?�cG��U��D��; 1Ft�[�
�`��6�Xm���U��D��G�<��*L�a����T0-Q*H�A"�����ui�*N_�O�������i���N��$&����
��Z�I0L�>��50�vj&�0Q��hr�
m��h&�0Q��H��=�
�`���w���LC�0	������V��S�0	������l�F��Va��`?�����S�0	���������kS�8}u>���]���z���h���Va�TI�������$&r�[�70�
�`���J�u;^J�[})�D`"�*�}�2�
�`���J�Ox>�
�`���J\t��Va�o�T�_�
�`��x+6��s�Va��m1���������Kw��9�Js<�M��$&��L���J%�(Q���M,JI0HT���Q<X�ij&�0Q��HH`j��*L�a��������U��Du� g�*J�Q�z���T����U���mm����Va���)�5��\���W�P���������Oh�eZ�
�`����6��v'X�
�`��5P���Va�Jq��O0��$&r����c�E�0	��\���REI0J�
(���>_�
�`����9��&�.Z�I0L���������(J�Q��?��VteZ���W��3�T����9�eZ�
�`���w0-y����*L�a"�������*J�Q���c��;NN��$&rp2\~p�*L�a���}��ci�*J�Q"����LC�0	���~[��LL��$&��m[�W��U��D��{ ��

��Vq��|��|.�l��;�h�M7��$'��[��#����'�8Q=�NH*��HO��$'�>�������Xq��	�N���7��$'��	���5R7��$'��,8������`����8�E0t�Z�I0LTG<�[��N�Xq����
�R����	+�T�-�#��	��k�&V���u�S��B���M�8	����g��lb�I0NTG|�H���m��Xq��/��Z���&V���u�{8��:s+N�q�:���d����Xq�����
>�����`�����%���}�+N�qb{��d[,��O���{h]����&����ij&�0Q]qk|�`���U��D�� |5�
�`����4M��$&�>��0��$%����>a'��U��Du���+c_��*L�a���c�q`I��U��Du�@�;��U��D��"�����U���b��/������l�q������`���K&��;�)V��Du�;!�z0�i+N�q����_�:-b�I0NT'|�_9Z�q�*V��Du�;!�����'�8Q��NH�����)V��Du���+$8_���`����XpjF���Xq���8�VQ�b��@�O�/eM3}�drCS��Va�N�M��U��D���q�����*L�a�:�=���3�
�`��~x_m*j�O��$&�>I]���$&��)�a���*L�a�:���fK���U��D���j�3fN�REI0Jd|\�����h��������e:�������TQ��^�((f�L��$&n�p���n�*J�Q�V
�k
�Xej&�0q��_CK]�Z�I0L�*�����0X�
�`��]3�Q���Z�I0L�
�����Va�>�����{�Va�:x����U�����:�Z�������8����<����������o�a�������{����������7����>�������~~��������.�������t�g<���������?���?~�[g]0���i��ow?��o���m����}��H*���}���������>|����i���?|����?�����_~|�������}|���w�������/~�����d�7�GD�yX�g�����2�?C��2�� ��2��@�z��92�����C�z��2���^@�z��%2����^B�z��2�W��^A���w���C�4����^#�z����~�o~����o�~�������R���&�����w�g���������w����}���O��Z��o?���?�����o?,����K�\�~���w��������o~�{w����G
�����+[�;o������T�����*�j�E��?����B�y���
���q��sh\��q=����h\/�q�����Kh\/�q�����+h\��q����
�w������4���q�����kh\��=�YdI������f��>���i�������s>������?������O����6���?���w>?�_��s�F>N���>��r������?�o��.������o��1�������;��7�r�@���?��/���������'b(w����_��������/���>||'h(��>�� �g���������@�����p����3�]�>�l��.c�}C|�������6i]�3����%�G�o��=<[[A�R<�8�s#z�<��G/�u��Y�SA�{ E[�">�h��>a�����,��?l�51:��bC|��[�������`�v��t��|�(�C|����0Ftx���p�����7]|�j�sx6����p��Rs
^:`#;b�`jv��R��Tq�ZM}w{�e=���k�b�X*��^{t����i;�C�]���Uw��������u�G���y�l5���2��x�%���l���v�,�3Wj��kZJ�����Q�^���_x�X"������Rh��5������N����O���^����;����X;�S�`�as�T�3�jn��={|��W��_��b���^wt����b���q�x1�h�w��7�����.����b�}�:�_`r�+}����+�79��-�^��{�3�j�����1�U:d�������������������g����k�����p�?]�=��y���^{t�9���!���l�����'g��>��&�������d��!��>��/��I%��KW�c?d������#����1���m��b1��^n{��N����R/�l6��}*5�����x�W������Rk��'PW\EO�������W��f�A
���
��^j�����]�G������*g���))��Z���^\1%�
��������{�Mnh�=�#�h6������<�r�������!���F����t���t�v��Ynr�ir��|�g�_��	�]��+���y�0��W����)V����������]��1�����c&��cRv�.��d���SY����j/a{�����cV���RA��������^�
���W\wa��W
�
�^=����T���gMk�m|�hJX>|���	�a<��@�b�-�{�����A5^;���������[�=��6��:��o_�������� �T����m�����	t@����u?�����$>T.@�b
&�_��b266X�}{�LH	l�HKh��xu����f����_`f]�	LYNW��G=���1�S�
��������/�R���W�Z��e{7n����c�;��������V]t~�um����b�wL��}S�
��Q��`e���E]�!��Z�LIuA���,�����*�����������@�h\�^{t)4��������/&^=����/���a��T��.���)G���=G�%�g�TW=���T*�����E��?���+����wd�/������k��2v6z���%g�ah�?������W}������q��UP�1O"v��69|#�^#�s�j����,�l|�`
�"��o��p�V���_G���F��!bH��W�]	�>��R��k�p���W������q5��������|[�[�� ���VAk7���]�
cp�9��*����z��l9��7�������9��������PZ)i���|�����Q�^{�����0�;�+�����������w6��IC���N����{7K������-���F�����T����A��^����b����z�����
�����
`�.w
���nW��>����,�{��<�7�4�w�_��s���#zA�����Q��=���e�h����vY�:�V�A��&�����K������������d��u���)h��
z�8��y4��Q���X���v����,�V���\2Z<���~��r(0z�l�������	jyFQ����Q�{��r��C����{��!����+�����������]�����1�Cw�������c��}������t��1<��>�_�;�g�N���2��}��|C�v�1�o���~bt��p�/���=v��������C����w����t��h�����?@_�����|~��7��>�����?�������������i�����>�}������G����?��1�������rF���F�����O>�4�_O�Q����O����?��/W
���+�����1�����o����?��O������?�W�?����{G������z�����8�z�B�1v��.E�����70������[SZ���fk�'K��7��LIG������J�%��OU��w����G��9��T��)��N�������:g�.'�c>�����]9b���A�x�S��|*{�^jR��1��g>�4�'��?|�;�Q������V��
��Gla���vZM��dsp����{���QR���������P�����6�_��?�`�!?�g��G=��(�����w�Vp6�����X��<'���D���s}Kv�b��	��;�^�xl\����|�R�������������KLK%����=�����z�{V��Q�}���:;����U
���o{~���C���g~4Ut)����"*��=�t����������g1[�����Q;�'�����A�%�����cAj�/���}����T��)��~�;c��'�������T��{�?������k����G��S��O�^�����I��	�:;�QQ���� �]A�0���	�|�-�S�4��[��C�����%���d������ w��9��\|�c��^O��&r{����������b��,�{�f�1����.�Zz����*:7
�<~����O'����T��{�����
�t�#����N~�o���s�
��p"%����?h5}���;[�H,s�7���V�l���'v�i�b����#�������������T���/�����3����������B~���l�{p�����q�.j�k�p�V����c��~�Lvl�1����EoX��G���v+(�����w}Ij���;���<v��c	��\\?+�]�V=(Bzq�r���E��]R0�������G�����);��%�8�Pp��S���4"�]g�����������B���o�T����L<� :g�����5������>��|U���?�,�o����N}�V�K9���W����|H`������q��T������zH�����w�E��UG�����v�1>d/8��O�6[?
�������;�q��y�?>�Zwl��H�I!:��s�*O�g:y>f/8c����X_kr�y���=�����z��������s�����������|P���~�N[�K�m)�:.��so���;���!��=U����3��s�9���"�����.l�!+��s�Z�a�-#�h��}~pE���c���b�R�C�SUNNf������o�.�eH������L�{�,�Qo��8�NO����������\�������������(>�����6������~H	}3�e�_���^�5|���V}M-�I���A�Dg�_�%�Rr�{.�Z1��;�����FY)7��]6��G|��p��k�B���O�a}lB����a��h��
n��{��P�o�WG��/k������#o����W8��h��N/�~J��cZ����>G�/��Y�4�]i"��Mn���!���������8�r��/��
����~��7�g+{�i�X�>g�.��\����K(�L��7��y���+A������e���z$���.�1o�������2���;m��2����s_\�O��t�(��o?�:�<k�-��k��S�m��(���p��sm}qr���N�:�:}w��}��|������^u�Vk��
g
�Y�B.%��+�.<�����^��<Qv���{�SY;^��NZ�uak�y??k������������`�A��9��m�5
v�r����!_�����)���Vv_9t�����cC����1����c�1q�w��_s	����>O�o
�\5�3��������$����������U��e7������4l�x�fw��tL����)E��j������cR�_�7����-����T��S��1�Hg���j=����|aa���i������f���oyg=�c<���~���XFZv�;��c���g~������Od=��?��������av�]�{�s�����c\l�|�9�>?k�9����&�+��om��4�s����L����s��%s8�����/��=��������=��^��~���E�#_x���d�s��j*�����{j<?����>g�a���Cqd�IR��1������<jv���{��q -�����]��5����s��������]��#v:�i����_����>�=�F��1y>/��������5���������kQ�a����|���;k��������{�A���g
��mmT?�eWT��v��S1����7����Q��]I�����F��~����=?k��zAk9�N�Y9��>�Sz��G�=��>t�l��x�CL��g���F|;�����	,^��xOzp4�	��������5��O�������6�j�A��9��>��~���l������F���zv�!�{�P�kp��R��6����{�|��;W���#mo������;�9�/��4����S���S�9���dK����U���$�?����������/�����}������m��jaT��w������w�x�����+�:��r��a?dk���c^�~�6�\���:�
��X\����<�#�	>�����~,���tJ)i�]
�_�O/�Z���}�,�Jcxu����lK_\C���|����\to8�~R�����4�
,�A��_�3��G��x�89��J������7���G�~>M��z���5�2�������1������Oq��o�n�����~�������~bp��>�]}���t�����������MI��,�x�����������VN]�L�>�Q:��\?��Xb��jr�D���������w5w�<��<�&��&�����Q��SE��(8��Q�A
�?��v-�~����V�<|����A/����R�5����c���(��J�J��E�v�������%���~��s�0�L�Y��2*H�Z�9��)�e�tS����;_�u�9��XK�)'����7��y�������z��/Ne�+0���
��[���*��g����1�2�~*-f��'�v=��Gu�}y��]����J�{�2���cR�^�7�����+��d�A�|w����!�XF��=w=�������g
?{gG*�����&Z\k��7�]�y���D����%��8�����)�>,���
���n���B_�vYJ����/�~��s��V����t����,xb�������{��&S/�<�]J�������;�����s���n�[)�}�b�A�j_�7��\m%�Qw�������O��?o���k��w����&�W���-����m�~~������4�������>N���>��r�����K�U���Oo>�����?�[�����?<~s�oZ~�������+��������_���r����w�~���������?|���_����7���/?��Y��~z������y�����wo�=*�9���;��������DQ�`j��c�M}���$&�/��C���I��7c����d��
(;���i����Xy���E��<��H;�$��<M��$���t���S?��*��{���$����������
�wS�<I��"},w���xj�&�4]�L�7��So���+O�y�H7�=��m�^���<
��$�����?�r���=��+Q�-En�6�N���6�[�7K����"T�b2��S��~kSM��N���R������r*��w��*V�$�D��;"���s�{���$�'���)>���{���$�'���F��r��yZ���d����JN�1p��'�<QM���U<|Z�I2MT{!��	J�Xy����[X���wC�D�����,���
��nb�I2O��q�%��T����a�o����#.E�+X3-��������'1�T��-�����5dh�&�4q-���U|u���'�<Q-l?n�b�B�M�<I��ka7S�Kh��U�<I��ka7�|�0O�Xy����^��v���}�]+O�y"���XO�����!V�$���|�q�Vl�����d��w�&�r�Z�o7�U�4I��kVC����Y��������k�`�M��N���P���M8]z�w4-Z�I2MT�z4A�;{M��$�&�y�w��O�F��N7�J�d�������G�Vi�L������.��_��Vi�L�����u]���$�`������9�oC�Xy��7�:*���j�&�4qo�����Wj�Xy��7tsK5����,O�G\�p���Y�T���������?�	��q�����y��'�<q�����&�]�+O�y��];���6��$�'n�����Y�U�+O�ybq�d�V7�b%JtPL��m6��V��V�$����M��c_�&V�$��.��[+py�E�<I����`R�hK�)V�$��.��R��C����~p���v,5����N���Rv�b����M�<I��];[�G��*M�ibW�Gt8�Y���d��&vJ��]�J���Z<���K���M�<I��� ��XC��b�I2O\����U�j�&�4q
�NH��3�M�<I��k`wDZ@��)V�$��=\6�R��v7�7����W"��_5�D4��ov�����+`��=\{+O�y���=n)�r���'�<�M�j�����b%J���4�Gyz�S�4I��ka{�sBM�)V�$��m_brj�+��U�$����v)&8�r+O�y�>�5%���oS�4I���mgb�zj�&�4qm/�J��S{�4�q����.V���"��ISJ5��I6��CS�4I��l]���e�8�����k\[oR�q���(�Dq�kM���u"�Z��L����[���Xy���������"�Xy�����3����a+O�y�VXJ����&V�$��}�L,����'�<q���.;�L��o����#�E�{4>�9S|���$��ld�H8�\�Pk+Q�'�[�4���`Z��V�d3E��K��l+ob%J6Q����X�*�<rS+S����d���9p�����l���v�&6���o+Q���	�G�����M�L�f���<[c�O`���V�d3�}�RM��`�&V�dE�%�s-�����f�Z?8�����������r���f'�A���A��ESz���b%J6QT�;����6��U�d������x�M��*O�y�fl����=Y���l���}�Ih���U�d����6�V&��Z�I6O���Q �[��U�d����6)����Vy��7�����r�*O�ybgO�],�I��U��R�`���<7��
Z�kS+S���V6����=�d���)�LQ��Lj����U�d��u�������S�D�&���Sl��7���(�DQ���J���}�X��M��a5)%�Q���(�Dq;b$SK?�a;�+Q�����	&����|+Q��b���&�T��w����&,]|��L�<S[�lb%J6QT��gj,�+���(�DQ=s�L�bc��J�l���y�$�6U��J�l���y���O
�06�%�(�k�!��&p��b%J6QT�|Yv��ob%J6QT�|�Z�0Q�X��M��Y���U�X��M��p21:���&V��T���.U�������>���J�l���y5�T�=��*O�y�z��������U�<�����W�B_�N��$�'�_>�����Z�I6OT�|��@�|j�'�<q3������Z�I6OT��3bF�*U�d���-7>g8x�R�I6M���7��O������H.t�������"X�e+Q���f�WS�o��+Q���f�W���*lb%J6Q���fRB�ob%J6Q���f\�h��+Q���f�7m��Qo+Q���f�7�]������(�Dq���i�{�����(�Dq����50��b%J6Q���~��l������&m��/��oJj�*���(�Dq]sgBM�:���(�Dq]sg|�`�M�D�&���;�
��z+Q��������"�O�%�(�k�L,�����(�Dq]sgl��]�+Q�����=4�	��9�J�l����3�F���b%J6Ql�|�
X+SM*���B����uf����)�LQ}�XLG��6�%�(�o�	1�71�X��M�7������U�X��M�7����6'��J�l���y�$��0a+Q�������,����(�DQ}��L��b��&V�dE��C4���}�X��M�7�����'����C���<�r����y�}�)����V�d3E��Ct&�PA�uS+S���:�%wJ<NmjeJ6S\�<c]��u��V�d3�u��3�F���2%�)n�y
&;�"eS�L�f���G�#$�v���V�d3E��c�}7s`�/jeJ6Sd��Gm��V�d3����7�������&[)��x�����&��>��s�*O�y�z���36��U�d�D��;#�;_�J�l����u^��Vy���5�x�7�Z�I6OT�|la�]�J�&�4Q���H��n7���l��>�`�4�80���l���5��I�S�<�����/�v�\���Cf"6��B��h�����
����)�Lqk��bB���V�d3��j��I>V�A��V�d3��k��i��/jeJ6S������R�yL�%�(n�y��Bh���V�d3��m�)��$<�Z���l��������,��M�2%�)n}�sW��G����l����7�d��TS�T=���5��}t��i9����2%�)���|1������)�LQ}�Z�-�a��&V�d����L��b+�&V�d��������+Q���z��D�*�
L�%�(��M�Mq�b%J6Q\��/;Np�b%J6Q\�<�s���M�D�&���G�RK0S�X�z�[��K�L���S���Z�I6O\��WX?j+Q���z���2�,���(�DQ=�f���V��$�&�_�I-�8
��$�'�[�,9u��T�'�<Q��f�-��*O�y�:���V�VS�<�����7c}�	6���l��.y_ujkpN�&�����j����w��}|������������_��|��q������5!�g�������Sn����.�eyV��$&n�NoZ��M��$&n��$�
Z�Xq��+��������$'�y=	�<���`���u��y��4���`���u_p���3��'�8q;pSJn0N�Xq����7!��IS�8	v��[5����6����~p�=��M��`G�M|�s�$f��z��`2�+N�q�Z�n�(��L�E�8	��j];g�w`���'�8Q�������`�&V��D��;!����&V��D�����m���M�8	��j]wB\J��\���`����Xrl��mbJ��C5��)����Xq��'f6-��6qZ������w!\����G,����:�ObF����&�X@��Xq���n�D�l\�
�`���u��v��b�I0N\���d3��d+N�q�Z���V,��&V��������4N��$'�u�L���%���}^M,�a��&V��������
.N�Va��0.���*�U�������'1'������?���Z������S�0	��jY���9�&��*L�a��c�*;�M��$&�]���$/Z�I0LT���656��5�
�`��V�Xo�����U���B�M
;lb�I0N\����?)�b�I0N�Kagl�|�8���`������~����*N�G�~����\ d���?��fYwBJl`��+N�q�fYwB|h��4���`��Y��Aoh+N�q�fY;����f��'�8���;#�e��+P��a�y�R0��bS+P����i��
��mb�I0Nl������i�'�8��L�
�2�Xq��,`R�����*N�G����[�f�����V��I�(�����o=���`����s,h�<���`����sIo53���`�����b���%9�a��y�t�	�6��$'�y=��^�mb�I0N\����,X7b+N�q�������6N��$'�y=�6�]�
�`����jZK�X��[�i���������ks��V��I�(�����
��Xq����!KN�o�Xq���n&������X����0��a��q�q�'�8q������
�Y���`���IL?���f�Va�t���y���Z�I0L���&�0�`j&�0q��zXv�Z�I0L\�����M����~p�
;�����zM������Q�e�L�6�CX�
�`���u?�{��Z�I���-���-��iS�8	��kW�b|L��
�`���ut&�f�/`+N�q�Z���j���S�8	��[�=��
X�x+N�q��Pr�5��`|+N�q��j
&������`�����j��i�o���#nB��z4�V���&��93J6�;#9���T�X�=�\;dC�����)�HQM��L��1l+P���������_���h�������,�/;�
�h��Vv5����a+P����Iu4�S���)�Hq_�'gJ�
����)�Hqs9�7�F����V�D#��Hh&�R0c�*P�G����wglr�v6���:<�h��Ac;{SB`obJ4PT[;��X�hj'�8q3�MJ
��6���h����}�I`��U�D�����VA7{�*N�q�ff��#��oj'�8q3�M
��Y��Vq�73�$���*N�q�&}�����j'�8�3�:$}��j�flu�?��Y��o
,��E�H�F�\f;�V�=o+P�����������M�@�����b��6�%(�C���p�,bJ4PT��8�m�y�X�
���XtXy{+P�����o&Wny�X�
��S3����X�
�5L6>y��Q�X�z`N�z���ny������	S�@�����l�u�*��(�@Q�r�LM�b[�&V�DE�����+����(�@Q�������Z�I4NT��/9�90$��
�h��Ny_sZj;gnbJ4PT�|���`�X�
�+Y?�9��o`+P��b��&�t�Z���s����N�T�<d�J�y�X�
�)��Y���U�D�D����5{��9���h��.y5�:����*N�q�z��,�@N��$'�G��!��,�E�0�����W�S�h��h'�8Q��j�K�m�Vq������Ft�[���h��9���
�J�Z��E{�������\�iN�%(n�x	��q��
�h�����
Z�n+P���f��c��L��bJ4P��jr�`�M�@���C^M��
��
�h��9���(���bJ4P����x��gN�%(ny5.��P�X�
;���}��bE��9[�_��<5���A�|j'�8q�rgj�|�7�
�h��N�31�B=�
�h��Nyg�$��&V�D�u�����8�+P���:�}��	|���(�@q����wj�(�@q�rg���W7�
�h��N�3�;|�[�
�h��N�7���lN�"���bq��P Cu�[3�[����
�h��^y����0�7�%(�W����)v�X�
�+������
�h��^�`$U�b�+P���z�!#�tx+P���z�!�`K��X�
�+�XIj�(�@Q���H�-�[�+P��"{��"��&V��S��.��p{xor+
s��)�HQ���)��z_���h��~y��%�^��V�D#�u�c29�:��Z���3w��
����
�h���yv����wS+R������W2X���Z���7w�������V�D#E���L�����V�D#����_�����V��Ul�pZ*���I�,��Z�I4NT���l[���Z�I4NT��#������U�D�Du�".aDO��$'�[>�`���*N�q�z��vlvA7;�8Q}��H���k�l�����xl��Z�I4NTw�#�����U�D�Dv�Hf}M����������r+��:�o�5�T+R���V+/��j�Ch�)�Hq��gk�K�mbJ4PT�gg�+	,X��)�Hq+��e'gW�^��Z���fy���b��V�D#��Z�!�������)�Hq�������,
��)�Hq���hjN����Z���vy�}�)`i�/j�����>/d`S�s�$�b~��"%)�{��3�k��"%)�{��q���6�%(�{��q�E���
�h���y4�60	a+P���:���\3x3�
�h���y���M;6�%(�kMj��IRS�@��[���E%U��bJ4Pl�<��R+�L�"���
�����~y�}`�M�@����g�}v �S�@����7\��1oj'�8Q��fl
�!oj'�8Q}�f|F/��Vq��%�+��j�*L�a�:��8�G�S�8��������g�nu�Vq���+N��	�Vq���������I������j����w��}|������������_��|��q1��y�\19&pO����Ys�-��L�%�c�b�I0N�")�����e+N�q��HI��������`��)���:-b�I0N��jXe�*L�a�&w'J���E�8	��\����CY���`��
6G;���b�I0N���%|���(�N"7t����V����~p�=�XMi�c��&��93J���5���- �Xq����$��mb�I0NT��R[@�qM��$'�m=)h'�M�8	��j\Br-��o�'�8Q��AHJ�~;�
�`���u�����n+N�q"����l]��)V�$[?���h����6��$'���������W����~p�Mw�j�;6����:�ObF���((cQ�q�'�8q��AH�;p�b�I0N\���_�6�<?���`���u3�U�s�+N�q�Z����w�Z�I0L\���<����'�8�����x�ash+P����w��G�l��'�8qSXF$�<�REI0J\���a�;���U���������b�"�S{�3�$��jY@����$&�a=��v=^�
�`��vuV�M��Va��[W/f�Va���&��b�Z�I0Ld�:�ih�h'�G*n�j|
;lb�I0N�:�4��&V����v&x4{{�*L�a��m��\3L�"�U�����`i���A������Qn��3��fXO��$'n�u�dJF�L��$'n�u'���0N��$'n�u'����4���`��9��L?�bJr<�����#X%��Z��@H4��
�4���`���L��a��U��D�9����x�*L�a�+M�6a��S{�0�qB���/��3�hou���|�kZ��Xd�'�8�kZ�p�����`���u��Z�X�>�
�`���uG�&0�zj'����N���<�lb�I0N\��k���Xq�7���`m���M�8	��kYW���W�E�8	����R����4���`���������-��[�i���[�����<��8��:�ObF��u�db��W��$&n�u��|Z4���`�����do���U�8I�m���������n+N�q����T��q+N�q"gZ�R2F��*L�a��
4�����*L�a"gZ'=�=�h&�0���C���4���`��V�	��m���U�������6B���������N�o0(LC�0	���c�S�h���U�/�� ��fz���(�@Q����~2�)V��D5�c4�[���&V��D���7.d���&V�����L�l���'�8qk&9S�O��`+N�q��gE�r�c�E�8	���g������n�[�i���{n�M���;����?�%����[�)V�D�)��N=�����6�"%)n���&TW���S�H�F����osW�M�H�F�[0$XS"�qfS+R���
���p���V�D#E������,vD��
�h��] ��5��o_���h��� K�~���)�Hq����y����o���#�J�Fh_<�N�����_)�m�Z�9�P�m����[�]����Wd��yi�+.7���F�m�f�����$�g������~"������v���=y����:\�t��2.+<�
(�@��L9Ep~�Z�I5N����cS6���&��lJ�����5�T�$��M9����i
'�8�ffS�`����`R
�l^v�oj����5�T�$��M�D>i;i
'�8��|S*�Q�6���'�,)J���n�P�(�G�T?^4�;G��>k�UR��N���4W�T��6�T#%���J�q{�N��(Q<9j>���P���u�=y���d�
(�@�z�)���5���j�d]�B�F���P����FP(���,��(�$oG�DwqSl@�J�+�B�ZbC��13������[��\-h��)6�T%���J�y�5�P��u�Su�ag�%6�T%���<�R�%o�
(�@�:�c���%o�
(�@�:�}�).&p��bJ5P�^yH�x7��&5�T�$�������!���j�d��1�����&6�T%]8Q�)`��R�)�R�TM%}����~Kl@�J�&��6IO���'Q�����0���j�D=�>���'�Z�I5N�y��}D�Mk8��I�����y`j
'�8���}��a��N�q���i�%t+�i
'�8��t%_KC�N��pR��t/J�������z`D�����L�������N�q����F0�`�
(�@���7��2�P����o�|��%6�T%�?�'�� a�
(�@������l����j�d���*�#�R���j�ds���
3.���R
�ly!�6tYbJ5P�9�}�\�Eo�
���?P���?^4��S+���w�
(�@�z����h%�)6�T%���I'�
B=��j�d���{�6o�
(�@�z��\j��6��(Y�<R)�N�P�����=�=��|�
(�@�z��Bt���%6�T%�����j�
(�@I{��b���%6�Sl��h##����xi���jCJ5R�n93���uKl@�J�-����R���%6�T%���H>90�|�
(�@���1P��`1,��(Q�|0RC���%6�T%��wF���A���j�D���-*
�����j�D��~p�����Kl@�J�-��Nq%���R�)h?��#��'?R�J���[�!�)�:,�h!��6�T#%�]^���RR���u��Rr
�t�6�T#%�����ZL�Wp�6�T#%��s\������R��l�9�����{��6�T#%��'*�1�~0���j�d����2t�[jCJ5R��y-`+�l~�6�Ul��O4U���TK��5�T�$��;�	}�7���j�D}��;�M�Sk8��I�3����0Clj
'�8���c�i�5���j�D�����0���j�D}���9�qZ�I5N��X�|����5�T�$���,��=��pR���7> ��
���z�I�F4<������U������j��k�g�����[�!�)��r��1��l�
(�@	W-{�n�o���j����;����[�!�)���>Q��aA��
)�H�f�����"8K-�!�)���}��s�g��
)�H��/gG��3p{����j��+�;*5��`���z�k��_�{�]������
)�H�������uL@����R���{^*y�vHXbJ5P��y��j_S-��(Y��)ev��0��j�d�s�P3��k�
(�@	Wc��X�0P���R
��k�vF�%o�
(�@	{��]m�70��j��s&v�V����C7������/o�B,[����R
�l���2� 5��j�D��F�o�03lj
'�8�:���om��5�T�$���'f��Z�I5N�.y#�>b���N�q����F�Sk8��I�!oZkXSk8��I����T�wZ�I5N��x_�b�L��j��cy:}�����n>�����_�������/7o?���9������-�o�W:��bHe�k�X2~c���&�4��HI+Gl���F�^�d�$J>�5���h�K�l~w"��$j��&�4�&wG��+87M����&���>���^�6����&����,G��F�^�ds�#��`3�%6���$��]}D��N����B�]h=��V�X�+����W ���H5$0�z��t�����Z�>PH	<�/����&Q��{�.�Kl4��I�������nSl4��I�����<7mb�I/M���w������h�K��e�����Rn��&�4�Z�c�����K��h�K��e=�p;FOuSl<)6}D�Vq��>|��&�4IWaF��,���t��������-b�%��!*kY7�)'�A�Mzi��� �Q��F�^�d-��hk�)6���$kY��P�`�%6���$kY�z����Mzi������,���F�^��-��He�}Kl<)>��>����jKl4��I�6��gpn�b�I/M��65M���t����Q�2��
��^��?����;��5A��X����Y�)U���Ij$�%I���x�XSk,�eI��|�5���X����I��O�t��i�%�,	[��rF=��5����k�x��l�t�6���$�U��y�u�Mzi���JBSl��h�K�t���2�9�WJ���#�<�����L����P�B �C�`��h�K�lV�w���fMzi/�2S�KzY�.���5�F�^��s�;"1�o��xR��������c�PKl4��I6����W���h�K���%�����)6���$�g@�C���
����&�#%��:S{�,�>8��C��F9G����^��?����Z�B�O-����&Y��Q�����)6���$kW;
-�����h�K��]��B��UB��hR�u�4�K&�R�bXb�I/M�fu�5���6����&�r�-���Mzi�5�+u>*�;f��&�4�f���=���)6���${���d��{9�WJ���#.?dO}�Zl�M�_��?���YkC+/N����&Y��RH���Sl4��I:��Q�\����xR��HZ��)�V+Zb�I/M��uN���Sl4��I����h
��IzI��H��;���H�K�p^u�`5���H�K�p�6���Sk,�eI���TX�jj����G\x���1p�|h�t���pJ���T�����5���$�OGaN��Mk4��d�U�J>T�?�ROzy���]�VS�`��x����A�����;�%6���$jR3g�l\b�I/M����B(`N�Mzi���������h�K���%O��S�Ik,�eI6������]�+��������H1��m���J��Y��e��82�M���yHem���m��F�f�d���T���N����'����bd���Il<i�I��.�j	4��x���lA������pXj#J3Q�EA<���G�KmDi&J��H��J@k`M���(�������>�_j#J3Q��j)����#K}�D�>8�zD���}�a.��/��;�����S����vM��:Kl<i�I��N��o���h�L�l6�����Z�I3M�y�T�C��OZ�I3M�y��b�i��F�f�d����0��x�M�i��������Sk4i�I6�J�n�}��M�i�M����
�Sk4i�I:���s� ��x�@�~=O��ES�k����Xj#J3Q���(^�j���%6�4�$��3��"�O�yu�S�Z"��v��'�<����r�	���x����3�1G��e��'�<��0�T[��%6�4�$��"S���NZ�I3M���*����qKl<i�I�-U#�L_b#��!_>�+I���a�����Kl<i�I�L5��0���f�D���HJ��9r��'�<���c�	LZb�I3O��xG����-����'Q| b���Kl<i�I��b+�M����&Qw<$���m���x���l��D�0X~��'�<I��eJ!���Ik<�?�`y�':����1���O�yu�+%v�n|j�&�4�z��bB��M����&Qg��
OSk4i�I����k
��M����&QW��754,��5�4�$����U���F�f�D=�N�`���5�4�$���Rs��;�F�f��;%P��;M��t��b�*�T=�$�pv8U���O�y��/T"Z`|��'�<�f�Wr�50s��'�<�f�7j5���%6�4�$�-���A�i��'�<�f�7J���
��x���l�x����OSl<i�I6_|��	���b�I3O��xt�C�C/����'�|�F9���6�u��b�������|�s���x����C���]68?M����'Y��'�y�Ik4i�I���P|��'�<����b�g6tz����f�d���HE��M����'Y<�Kp��)6�4�$���[�o�7����'�z*��Aa�L����f����>�d4�|������6�{��/��{�)������(�D�:�\�v�Xb�I3O������-�Sk4i�I�!�L1'���Kl<i�I�!���+`F�O�yu���2���L����'Q�<��:,�%6�4�$���%,���O�y�� �5���O�yv�������	o�������|�m����C�|��X�$���(�D�:���Q���S�TQ�������\��6�RQ������#.�a��[���(Y��#���b�j#J3Q�^y#N�
n�F�f����T���%jo�F�f��+�0���'
KmDi&J�1O��Co���x����c���2>KmL�?��,��h���3�~t'����&Q��Q�	��$5�4�$��@|��wSk4i�I�%��_��vj�&�4�:���o�K��5�4�$�������wSk4i�I�����$Sk4i�I�����t��h�L��#��+6=N����&a?|�8`����h��<��3<�p�:�#G��D���RQ����@"���"�KmDi&J��KG�U�+�j#J3Q�u�}�6���TQ����D��Ril���F�f�dk��B�L�TQ����wy�wbl��UQ���G�T}��s��(�D�V$��'��pYj#J3Q�5�]������jc���������}o*XD�VmDi&J�5��R���}����L��k���*�O�y��[��c���%6�4�$���Q7,0/�VmDi&J��J#�a��O�y����k	���b�I3O�n9�G���x����W����Sl<i�I�)����,5�F���)�+>��(���8�'6l����f�d]�B)p�[b�I3O�y���a����h�L��CN���0�F�f�D��F��F��M�i��!9b@O����&Qg�;����4���f�D��F9����h�L��/�Oj��y*��X����'>���[��g���	��?����_�}w����~�����o~�y�����:|��w�t��N���k�g1��
5#�����N�q���i�jcH/���'Q�:������i�
'�8	��$"��w�
'�8�&uGr�2�Nl�
'�8�:�1P+
|t����b�D������]b�I1N��3��Q���Sl8)�I�uf N`[��5�;��+���!���i����G�����\r�����:��bDE�k��=&�fm�
'�8�Z��Q�'*���N�q�-I�(��{���pR���u�	����ih
&�0I�\s�0LCk0)�I��[�
��mZ�I1L��u$��/���'a��3R�GN�����7�[kN;
,���'�����k	m&p_+N�������T�4�%��1#*k[7j��*N���'Y��O8-��#��pR���m����1���pR���q=�C|����b�d��F}��Ml8)�I������(:���b����q\+8P����|Z}��3��{j
&�0���yb���i�
'�8��K�%��Za:}p�=�(n�|k`�����)j[g
�/4��b�DM�������hh
&�0�Z�}�Jl2��b�D
��t��,�Z�I1L�vu�%����L�a6�3qp38��pR|��-���0�s�
'�8����Zd���Ik0)�I��H�[�)6��$�m����)�V�Nq�!����XZkf��u�����fYwBZ�`Z�N�q������sj
&�0��X@2X�s�
'�8��XwB��!6��$�c��y��j
'�{aI��3S������6�%[ �SH>bP/���'i����p�`�
'�8	gP��i�
'�8I�����V�_+N���	�k�g���_��?���l�cM�2���b��k[����)6��$]�:�Awh�
'�8I��~��{|.��y#i_����{l�]b�I1N�Y��Z�����5��$[�������~�
'�8�Z����M��PR���m]��vz�b�I1N�%�}M��n����G��H��}������:��bD��Z�2\�zN�q��k�}��8lb�I1N���8������)6�4�8��u����v�
'�8	w��+z��b�I1N�-I(;���j
&�0�����V��5��$���ra���Sk0)�I6��R�	aj
&�0��]��f '���t����Q�� ��.DCz���<FS��n��5��7��b����>������5�O��Ar �}����b�d��)������R��Y�q���<-���'Q��3���6Kl8)�I�N{��|�g�Ml8)�I�v���=X�h�
'�8��g�[k�-���'�<�@�:����V�Nq"�U�����n��u����
�����b�Kl@�Sa�P

����R
���]3q+�z�
(�@�f[r���}Kl@�J�P�Tr�h���6�T#%�+p����z�
(�@��I�|k`�����R���qnT}	`
��6�T#%�<�Q�h��%6�T%�����1�� ��Z�:}p�-�����kV�]�kw��q��v��[ap:�bJ5P��6��4��:i
'�8��eW�"��5�T�$��M�J�L��5�T�$��M��kSk8��I6/�8��;e�;i�I6/��+��6���'��lJ�%p�v�N�q�M���*X7kj
'�8IgKQ�}�t�P]4�7L�Bg�G����d�
)�H�&}Gj-��wKl@�J�������L�)6�T%���J1g0A��5�T�$��'G���}Kl@�J�!O�JA����R
�l�@.������j�D]��#G�����j�d+�e��pO>��j��X������R���Q�+��S������%6�T%���L-4p�[bJ5P�N�x�"c1,��(Q��O:���,��pR���S���)Kl@�J�)��V<��-��(Q��3��K0P���R
��S�W�����%6�T%���O:5�K�&6�T%]#8SJ������c�}�8�����NyLT8�����R
�lN�xi�����N�q��+qv`���5�T�$�����E|j
'�8������[��5�T�$����1>;u���'Q�|T���;mZ�I5N����sj
'�8��t��<llZ�I5N�=(.��i�P�(v��Ot�u���w����Sl@�J6��P�>`P/��(���
�L���'��F\2�x�
(�@���Wr�f0�i�
(�@���7
-D0�i�
(�@���7���;���pR��ly����-��(��J)�	Kl@�J:��S+�BM�!����E�����hy���k��5�T�$��{
�U�X���j�d]��Hv
t����R
��O�1��PSl@�J�'��Z����
(�@�����XX\l�
(�@���~\������R
��SF����bJ5P�N��ZZc�
(�@I;�����O�!���b��:?��K:��;
���UR��u���!�]����R
��[��V�\bJ5P�ny�T9l�\bJ5P�nyg$sE+�M��(Q��3jn.��(Q��o��s`Z�P��u���(����R
��[�I>��W���R
��[�)���7zKlH=0�����v��?^�-��"J1���n���j�D���G�hx#����j�d�rW(��0��VmH�FJ�1��JF+m��
)�H�z�-QA��.��(Y�<4����}n���j�d]�X�1Gp�[jCJ5R��9{���,�!�)Q��GVf�V-��(a��G���x�\j���Q��	�D��w��E�GM���'Q��Qn9`��5�T�$��wD:#�9���j�D���Ha���`R
��S�	�l�2���j�D}��H��>I
&�0�:�������pR���;>6C!b_��N�qu�"��8u���'a_|�}���Sk@=�"b#�hDe��s#v��
KmH�FJ�Vy�S�e�n���j�d���@��D�VmH�FJ��Qr���[���R��l������M��(���9Rvh��[�!�)��������jCJ5R�U�;$�y������R��l���(�Vp�UR����\�w�>50��VmP=������*.��{����f�RR��u��V����n���j�D������o.��(�Z,�j���9��j�d�s�Z"�&���j�d��H��
�����R
��o�CK PSl@�J�5gj��
;���R
��g����:i
'�8I���B�����z�KwO�.J���PMt6���R
��W^���h�����R
��S�F1�(�Z�I5N�>y#��
��N�qu��`���5�T�$��7�!�����pR���C>f����N�q��Go�����N�qu�;"��N���'aw|<9h`���}�@m���<�>x���w7_|���/��z�������o~��g�^�@����_��?��m�)���^���h�K�l��B1��,��h�K�lzw�"�s�Mzi�������Kl4��I��f$r���lb�I/M��5���0�,����&���}� MSl4��I����_*��w��&�4	��R����;���^Qv�V(�v�]�+���� ��q��x��W:��b@E-k��}�`/�)6���$jY{G��.��F�^�D-�H�	|���F�^�D-k)r�XKl4��I���M�	[m��h�K��e�m�LCZb�I/M�����9�g�)6���$lY�	�����b�I��#��(e����KzY��e���K|�4�>8��Cv�jTR
�1��W:��b@e
�Qf�3�8b��&�4���jJ�(O����&Y���W�trj�%�,����bJ�(ob�I/M�E��F�Mzi�����eW���Sl4��I�`vG�y�m�O���O�+��`J�Mzi�����c[����^�d�	���enj����G\}���):����I{��,�S���|��0aj�%�,���|������X����Q=��@�OZcI/K�6u�kZ5L����%Q�:S����ZcI/K�u�mRI�Sk4�=L	��}�SC��M����'���L\r_M����&��"!�
f�M����&�m[��x��WJ���#.=d�V��S�{L����P��j�w�l���F�^�d���t�|����h�K�l��_�}�1�F�^�d��xr������h�K�t��|9]�)6�o�EMk������TOzy�������M����&�L�cK�/����&�\�>g�T�&6���$]�sE/���Ji:}p���i�`��)��!*^�����Sk,�eI�n5��/\ixMzi��[�-+��F�^��-��&�����xR�u����'WJ�~���h�K�t�j���e�7����&���������&�4���J�	\m��h�K��a]��
n�OZcI/K�%�ce�<�_)M�������;
�UlA\�+�g1���u%�����Mzi�5�+����lb�I/M��uG$���O��I��o�jH���h�K��a�)�
��ZcI/K��F������5���$[��2c��KzY�}�K�5����5���$�IG�g����KzY�5��c
�7�W����#.=Di��j��US{��<�S��B�1y���<�K�u'$gl�~�Kz�� y�����x����A�F�!���TOzy5����:�Kl4��I���8*�l���F�^�d���.Fpn�b�I/M����B�`��%6���$�t�S�
]b�I/M���j�m@���Ji:}p����>�����
�_��?�����P��7���x�<���5S-|�1���f�D���w-�-�Ij,ifI�ru#�J_H/���(�b >S���M�����L�l��F��������f�d�)�>�d�/Xb�I3O���S��]K�/���(��M���<m��(�D�Z�9P�!���S}�D�>8�bDz9c��^����[�\�+4�K��=��h��'�<��L����NZ�I3M��������Z�I3M����1X }j�&�4�Z��\?��!��F�f�d��)���L����&��kJ�Et���F�f�d��)��1���h�L�lj7�<7
����&��(��}��O�(���T?^���r�`��%6�4�$[�$D*���_�TQ�������l�����f�d]�D��Z`��'�<��%����Kl<i�I�w��-XE{��'�<�z���/�t3���f�d;r)���O�y�-��R��M�i���TR��9�F��C
~���y��c�s��'�<�:�!SH�ck�O�y��"9���O�y��C�ZB���%6�4�$��oSN_�.����'Q�O9y��E��Ml<i�I���
v�]b�I3O��x_�����nO�y�m0�)�����x���t��D%��`SlD�?�h��_�C�/`9�%6�4�$[�bL[t��h�L��?^��+`����h�L��;^G����M��h�L�lYp*��&�Sk4i�I���OXSk4i�I��;���6����&QW��
hbN����&��������Sk4i�I:g���X�wj�����|�)������|�,n8���f�d3��o��n��'�<�f�W�x_����f�d3�+e��+�%6�4�$�1�(�
��\b�I3O����j�O�y��/��S��)6�4�$�1^s�_Hmb�I3O���|�|!5���f��3������:i����2�m�e��G�g��%6�4�$���'6t�4���f�d��@.�VT�b�I3O��x �������'�<��������Sl<i�I�������)6�4�$��{�����O�y�����;:l�]b�I3O��x?����O����'i��K
�Q��F��C��a����/��{�����GKmDi&J�#�J�q}�)6�4�$���H~�b��&6�4�$��G&v�as�O�y��;"�ep�<i�&�4�:�}�}?�v��x����C����7�Kl<i�I�!���\�Kl<i�I�!;"�[lx�4���f���I�%aT/�u��bk�oc��%���JH���UQ��u�cg��FpS��F�f�d=r��L��UQ����R�MoS�����L��O���(�
N�KmDi&J�+��N��U�RQ����'�N�-�8�F�f�d������1�VmDi&J�1�L�'�F�����L��g����&^jc��A���z2?������R/a��h�L��c��|@/jj�&�4����ru`/��5�4�$��B<�L����&Q�|�NS�M�iu�����mZ�I3M��x'���-�Sk4i�I��W��.�k�&�4�����Z��i�M�iv�����L��5��7�
O4��u��)e��������L�l%����V��b�I3O����V3�P/���(�:+.�U,�{�[���(�j�%P+�0�o�F�f���u�p��[���(�����S�"��j#J3Q�5�K��3�Tx��(�D�V%��r��VmDi&J�.y��K@�/�1u���v^�z�~�2(l.|�6�4%�����F���S�j#J3Q��y���Vl#����f�D=s�9�`������L��g��Q�����VmDi&J�3�}��
�
L����'��+����%6�4�$���[M�Is��'�<���L)9�,�b�I3O�^y���~SlD������SY��Ny
:#�s����f�d}�J�\�$6�4�$��7�99���Z�I3M�y#�=X�~j�&�4�������}Sk4i�I�o�9�S��K�Y������XSk4i�I��;!�Q�Ij,ifI�o\v�2�i�&�4	��}�*�}�I�i�;�K����_�}w����~�����o~�y�����3|vu�(36�-����P�B(�J�G6����$�(<n���x��&�4���}��1:����&�4��>�Tb�}����^�d�9����Kl4��I6}�)��`M�)6���$��]Jk�/����&���H5��"Sk,�eI:m;�CZ}�%6��Z����J������Ji:}p���(o�����K|�C�,T����|`��G:��&�4	W!�!�=_��h�K�l�O����L����&Q���g��%6���$jX��&�����&�4���X\��$6���$jX��5�e�Mzi���f(��b�I��#����rm�/�Mzi�����#z�����G\���^��4��J��Y��e](���NZcI/K��u��.�0mb�I/M��u��a��F�^�d
�H���%6���$kXw@\N`��Mzi�5��t�x����F�^��
�J�D�:m��'��t�r�Zp;,����&���>����0���^�d�	
�5�X9�W����#�>Di��o��9�W:��b8E���Gelcu�IzI5�;}��9Sk,�eI����bt�
�i�%�,����Sz���Mk,�eI����V��7���^��
�~g��w0�F����l��D������F�^���6�����b�I/M��ER�	s'��h�K�tu��"�e��Ji:}p���t	��8�O7����P� 1����F�^��K�8��Ml4��I�H�,3��F�^��K���.����&�4IgT{j��}���xR����}LT������x���l��������b�I/M�+��w��j�%�,��?QN
|:4���^�d�	b����^)K��������P0�c�^�p?����+5�*�o����^�D��:�otK�i�%�,����"��M�Sk,�eI���+W`����Mz7-�5{�>�Xb�I/M�Y��bq$z��&�4I��������h�K�lVu��������h�K�t	�8�gx�b�I/M�%�C�d5�WJ���#.=��T���U��W:��b@��Ts�x��Ml4��I�N����s�&6���$�U���5�����xR��HZ����<d�LXb�I/M��u �������h�K�l{�)�
>��X���l@�|'{�IzI�}�K��x�<i�%�,���Q��`[��5���$krQn
����JY:}p���(m}B���S{��<�S���|����hh�%�,	[�}yq
��6���wr�-����ROzy�������0�Vm<��I���H�x�_b�I/M�6u����/`��&�4�^wTbM����F�^�dk"E*!3��q��&�4�>_��p��J���&�4��$���K|�4�>8��Cv�)�v}]�+�g1���5{r)�w Kl<iR�z��j�;O-���(Y��g���o��(�D�����K�J/���(�� ��qC���6�4%����}.`��)6�4�$\d��Cg��6�4%� �K_�j�.���(Y;�Rm!���O�y��Vc"��fW��+%���$�s�H�m�Ng��t�qt�~��v��D��,����f�d[0Rn`
���X���lv�m|w�'����&�<l��<5
����&�<l��80���5�4�$��M9���ORcI3K�Y��C��R{�M�i���)����:i�&�4�&x��h6M����&��(�����M�'�5�T?^4��9��7�Bm��(�D	'w7���+Xj#J3Q��x�#s
41��x����'��bL	���b�I3O����
�u���h�L��+^)��;Yb�I3O�
q��<�y�Z�I3M�}t
��������f�dK7Uj!Ul/����f����*>c���O�(�@����g��V@�i��'�<���!Q�{"�,Xb�I3O��xG$��d.����'Qo<�����4���f�D���i��}���h�L��7�	�>g,�%6�4�$���
��AXb�I3O��x�Tk
��n��'�<�6���y�b�I3O�u�bv`_�%6��R0y��*�J��1P.�1���x����?^�Q�NRcI3K��x�3X{pj�&�4�:������6����&Q_�Rh�a[��5�4�$��BhL����&QW��^��)�Z�I3M��x�Y��'����%����\�wM��h�L�t]q
)0��mZ����6��?��%�pjs{��x���l�x��\��^b�I3O����J�	�a��'�<����>�4p����f�ds��R�}-����'�l��%J������f�d�����6����'�l�Q�)%���O�y�������Kl<i�I:[�RB��L��t�������g�t�x�`��%6�4�$��{�%�����h�L��;�	��[�)6�4�$��{���&RKl<i�I��B.0O��x����;����x��b�I3O�������Sl<i�I�'�
>CXb�I3O���'*�����f����>����c0�F��C��~�'������X��VmDi&J�!�L9q��qKl<i�I�#�~��c�b�I3O�yG�s;q.����'Q��#rh`5�)6�4�$���@�C��nb�I3O�ytT��wxKl<i�I�g$���<M����'Q�<�f��A���x����GG��\��Q�)���'Ztd�q:�r��KmDi&J6��U��+�RQ����$��2p��UQ�����]�Vb���[���(Y��$���^�UQ�����[!���K�RQ���u�=S�����6�4%��s�u�KX�j#J3Q��yi��k�e��F�f��=�(����US�*6O�'�(D]�L-f���Z�I3M���'=�+�Z�I3M�ny'�s����h�L��S�	I%�����h�L��K>^'�y��M�iu���&b���M�iu����k2�4�$�����^���h�L��#>�A��Z�I3M�n����`�Ik<�ob�j@%����{�n�VmDi&J�
�~t������(�D�:�%S������6�4%��wF8D���RQ���u�;#��]��6�4%[�����ww�j#J3Q�yIT�k��7�F�f�d���HK�8Q����L��[�:#1�m�n�F�f��������������)��~ ;���*��{��Bt`��RQ���u�}�X��XSl<i�I�3�}�h�O�yu�����aL/����'����2{���O�y�u���QKl<i�I�{'��.�����x���l��H���wSl<i�I�{g�Z\��)6�4�$��3R	|���F���)8�?��(���H1�����x����C^�:8�n�M�i���T+�}�Z�I3M��x��"}Sk4i�I�o����Mk4i�I�o�Sv�Q`j�&�4�����RL��M�iu����'����M�i�����eC8i�&�4	;���v��g������t����w��||������{�����_n�~��a�
��c�����������g1���4����Lja�����
^,���&Q�:x�>����Sl0��I6��SNl����Z�d���d���g�!6���$�����&�����Z�d��=A/h�
&�0��n�.V���Lja�N��#��
����5���bN����:a:}p���(n���_},�u���O�B���U*��{�
&�0����'���4�%6���$[�{���U��JjQ��Z��P!$ln\b�I-L�%��\���M���&�j���i,0L��`R�l!nO�6�$�Lja����9����b�I��#z���je�Xj�I-N��i��"c'�%�N�Nq�!�Q�8f����^�x?�����;%��n��`R�pI��gp_3��Z�d��B1�^�M���&����{�/���&����\m�Q=��Z�d��1���13u���&i��R���Q=������h��H�p�`Zb�I-L�7x���V�'���%Y_��4!aS��^'J�����-SN�|����g1��u�����ZCI-J�u�#���Sk(�EI���x�^�O���%Qs:S*
�"<���Z�D����:��!Sk(�EI����}�B��Mk0�=F����K���5���$kJ7J��-<��`R�t��\X�f�
&�0I�)!&�"����G�rH���<���:G�Y��t�vL��
&�0I��H�T�Ml0��I��g�OL]k(�EI��G�����6���&���NHI>�ob�I�X�����c`�a�RNjq�-�Q�q.��9��Z�d_ORN�U�Ij �I6=��k	mY�i
%�(�z�]���4������#n;Da��Z��{�^�x?����;����Sk(�EI�����Ahj
%�(���}�R���TSk(�EI���sM�����5��nXd�3����c�
&�0��O*�1X�c�
&�0��OWr�Epv�b�I-L����RK�����Z��[sHx-�Ml0��I�(Y�gF��M�u�t�������}���7�u���O���J!'�)6���$]}���fPO���&���v10�z�
'�k��Qq��B���Z�d�jO�$��vlb�I-L�=��RA���`R�pu���$5���$�w���ZCI-J��sTZk0JCk(�EI��]�<���^'J�������a��������~�)iN7�1l��ZCI-J���#���~�
'���lq��(U.�%�TNjqn�����&+.���'Q{�#qq�a�
&�0����'��<�_b�I-L����*�w[b�I-L�����Lja�}��(���_b�I-L��L�6.sS|�0�>8��Cv����>]]���g1��fu?�_���%6����]�Z��)6��$�K�(����UP����v�p�ZjJ1P��?��\�m�
(�@�I�8��qKm@)J���cS��	o�
'�8���f�������R�l�o!v
����pR���?>��'x��������!��gl�cDk�-�u�:��������vL�5�����R������k��t�L�a����D��<i
&�0��\S��-���b�ds��%_����L�a����5�S�Z�I1L�9��8$0��5��$�s=J6�����PR���YM-�K\�N3H�YP�rs��5������}�{���M���=v�UP��N���}��)�Vm@)J��L�U�,�N�q�-�����Yb�I1N�Nxbb6C.���'Q/<V���b6Kl8)�I��m�R���Sk0)�I�
�g�b�
'�8���rT[�XKl8)�I�m���J�N�Kl@�;�`b�S���t��a-���4��b�D]��O�9��M��pR���'�		���'��pR���'F�wN�V|�
'�8�z�!R���Kl8)�I������-���'QO�RZ-�q`�
'�8�����-�Ij()FI�_X_�|��B7���b��+���jjP��(Z
�W���B�8�&Xb�I1N��x���bN��L�au�+�����Mj()FI�
�T��tSk0)�I�W�L���&Q'�sBW�Mk0)�I���B�iN���&��p�%�����`R�l�UJ��NRCI1J�Y���z�������	��{��I�8{
��;�%6��$�^����5��$�����'`Kl8)�I6'��T�S�N�q��	�TB@SQ��pR��lNx!N�	�b�I1N�9��b@i:i
&�0�f����	|Lw�L�a��	o2��Ml8)�I:'�3�R��O�u������h/,�('���N�q�u�=��"8i
&�0�:��\�`7�%6��$��{�
M%Xb�I1N��x�pZ`I�)6��$��{b��\�%6��$�������y��pR���'��/�;mb�I1N��x'$1Zvg�
'�8I���J�5���#
v|�
�lWM�wD\3��v�
(�@����T<Zzg�
'�8�:��S��������b�D��NH��a1,���'Qg<:*��u���pR��lOMO9/v��pR���3�'�����N�qu�;!��������b�D��AH(��6���'ag�o�jH`��%6��Ql��O���v�,�R�
n��b�D��2�\"8A-��(Yo�5�96�~�jJ1P�y�eTGa�+�UP������)z�4���b�d�\)�:�Sl8)�I6w��[v`��6�%\Q%Qj.�o����R��K�
���ZjJ1P�>y��JJ`%��6��Sl��O4M�:��Bv����5��$��{���7�p�L�au���Xzj
&�0����[_�j��L�au�7@�g�Sk0)�I���>�>i
&�0�z����e�k
&�0������L�a���}P��g��g���>���ih
�{}Cl<�S���x<x������b�d}��)��n��b�d��\�$��ir�
(�@����Q������R��'���*x*YjJ1P��x_�js<�-��(Yo| �X��Vm@)J��l�����jJ1P���s
�K�PP�����K��2X��VmH�������~Kz��'J����Sm@)J�+����]��UP�����S	����pR���S^��`'�%6��$���)���7�Sl8)�I�'Sn%�
��pR��lM�D��D�N�q�����/�h��)6��$����_�5pv�b�I1N��8�8&�;�b���4��M����#W+�
,���'Qg<8
p��%6��$������|��5��$��@
�0u���&QO�Q��4��b�D�F�7�l��L�a����`�6���&Q7�/]��0mZ�I1L�^��m�y�@������b�������?��@'X'���y��_�o�{�������/�������~���o���Oy�������������������f�����O����~�����������O�_���������O����o?���/}+������������<Z#eru}��S�����DQ����m�)��n��|���?|����������_~x�����_||���7�������/>�o_�N����{D�@�?)D���#������G(�?!A�		�OHP��z��	�%�K(�WHP���^!A����	�$�o�����z��	�5�k(�o���E��	�[(�7HPo��� A�]����O����������-���:�����
�O�~��f}��/����y���������g�?������������m��]_��n2�3�O������?��������o�������`nc��{=����]�5��5�Q,����w�)V�?��Zb*�gq�V$�?Aq�	��OP\/��^Bq���z	��
���+(�WP\�@q}��
�7P\���^Cq���z
��-��P\�Bq}����
�(�7��XxX��sn0�����_�p����w��rj���_��n~|�����y����1~�a��7!?�|��#�����7��������~�G���?r�����n�o�uW�������!|-�rv �?��?����G���N~z���Q��_��IO$����Q������)
E���c:
�|vH?~��C��Z�_�k���-.�9��y<�A�H180�f_�_���>��/`H�H��������15�D�A��fr��5�6��	�.�
w��0�9��������i�w��)��H`W_,��k�=3��&�Jbp�7���v,w��	�5������^o���sK`G�.����*��K�}�89��P_��4*
����������Y���M�Lfn�w���]���=�.,��7���w�{��N����������#����}�JvX����X<">��������B%�����3wiT�!~&����������'��sr���k/���UpM�K��C����=���)�����w��sl�w�#&�}���:`]|�o�������+0z+8r�T-�-�����������A��]}�]ipfz�u�S��'w8������{s�+�/���0�{�& ���VC|qs$�����/V9��y[�)�E�j9
��M��}7;����P�]|������t�����[C����}��v����xX��#���R��R��72�����i[��Y���io�����
�t����J��=j�
��
YWJ������F�e����4�����x��@��l�#��ihW��p�g2m���7��/��Z����%_#�	���G}��=t8}��
x�o�/<W7��<�v������U�{�v�]���z���*���K��h5�TS@O����P����C|���oko�������3}o6���>9�#x�%�����3����E�$����M|��{<���U�����-�#�H\k�eP����}��"�`���Z �\3z4��]8��KDo�6��#�8��7��G9��'��9\>g;��YsGy�/}1
qh.����L�(O��K2��\��G��c@�}�/^�.�f�A��v�Wsbl���?b�����}l/}x��{p�(�{�������L����qA7�]L)������z��<No��RY��H��/`�P3v$����R�����M}�s�Pb3���S���n�����E�g6�e'����.�������S�T$�H��C|��l��.&p��?f	i��g�&��W���H�C|�
c2�j+j��_���G{�����d4Yh�/�������H2��e�d���d�1mc;�z��D�X���zqw���V�z.���sN9���z��T��"z7Y/����jF�/������e���������|E�5h�?����\�������_�����������5r���zC}�9�P����>h������?2��f����zc�kh�b��k�1od������L����'z)F�0�Q�R�u������������Jwe]]/}����F���/�hi��\���.|�
�\d0�i_��%{t���z�i��)M���L��K����#S�>a+�&�,�1n�[A07��Tsh]�p����#G�Vpk;�����qc4���(����<Zx�/~G���s�'�������7�s�����O�jrk��]���/���<^;���I~����^����� �����`��(��J��)����g����pj���1�~.���l�O�1Qj��>���T�Ex�g��r����;�y�6�����]�*����[/_]�����<����h����t��x��jg���^xr�����.���E���C�az&��=�����=y�B���I}�����f�#�tU���x����s�_8D��pi����_����������'��*o�K8���'����~b�5T�+���e*��'zH2���_�����W6��7�������K�x�'nT2��&�����e�L/h����7������G��1I�����sh�M-9w������G���z+���5jj:��=����],���1i\��c�f:�cr�wEWb@S��1���
m_	��=���ohcD�P��Jq<Ax�U��!e�������r�
;!��*�:?~���w7�����7����|���$����A�����~���?����������ow�����������z������w��?��|������#����?��Q��_��IO$����Q���p����������1��g�=!���������������3w�m������?��������?�����F����jt��|������������JN.�����^�����b����p@�/|)����]�&��fJ��3���c4v}|�#�����G�G��c�����c���;K[}-�>^����9�7��yJ��/;�o����=���-��|Lw$9����G����g.���P?r�wp�;����/��q�1c��� �F'>��������9� �;G�Y�������i��<d-8#��s���V�]��_>�s�!k�9�x.������l�!���s����W�P��ksW����=#�c`�'T�*�����x�ZpF���U�o=�U�c~�z����L�Z����it�{�� �������
}u�4�
��|�9��D��{G������9�G����������!��o��������<��9���Cd��	�SI���F��]��!�o|�}�cK�P��k=h~sF�%%���]�w �����^
���G]��R�N���E
�/��[����][�pZ/��s���U[�+���c�1����>�����]���N}6;d-8���B�5����;�c��s����T����������,���{m�g��A��T�����9#�����|����[�s<��T�����X
�it�#�H%������g�[�r������3A���R�rg���)��|E��#j�Y�oN�-8��s.����];�Q�������K
]r����U�_��-xl��77��\���r�7w6o�	����7�w�����G�Z�?b-(��)�B��O=��Z����N��#�|l��}>*9�c���0�c,�3���"m��s�w��c!s������
���T}wU@�>f-8��������P��z�����}|��O���b?�����.��2?d-8#�>�y�I���U�����}[�={��^�it��,�~ZK.�s�����,��?��Zb��}�1�If��i=f-8��o!���}��gs���������}7��/�����w9���ZpN��}�����v&�cn��`�W�Zj�D��P�W��T������}��C�u��������y*���:�����Z�N���]���]'�}S�;�|yF�9�I���8��^��e��������kX8z���0���s����Z��q�sU3��C����`������q��r��>���o>��l��=�J�P����&���[w��������:���=�q�?���������O��|���}�s����������c9��w];*���_�~�;�T�
����c.
�c����lj���������p^��+'.e��}���y�w����Z�i�.�t�sV����#�jiO���[p���j�=�(��,
~���A���4v���[���#_�~��0+~�#9�?�6z|����2�������n���1g�s��'�qL`r�{�w���1k�9��X��=���G���9/�����5�~��#�h���#�!��9�Z������`<�A�K���I>�Q����c����T?��PwzH��^�~?Hs����s�.o8�H��Y���M�\}a�un(=�������3������ke>&���y�����$�>���Xrd��,xBu5��~�Xv���<P>+���;[N|g�������l(y����=���0�
�G=�m���J��������������JC���������K�z����s��}Ih>���pW��;�0�1O���m����r	������^����F�E�%������V������6��F_��$ ��{��p���jH}av#�y�������2`/��!O��|F�����z��KM�����������g��sI1��A�~��G�e�:+�QN'�w;�����t���7��S���������
"�z������a!���P�]{�;���
g����C?���+!���)eqV����8�������L��6�My����B��W�}Je�����w�����y�sq��OK{_��6�����W�}��P���"������_b+�����)�2�/�b���'��k�L�^����y�|^�!������9r���IcxsV��k���tg���G���W�^�6e��i������T]t.���]]��J�;�������kB�����Y����"���~+:�����X�����]C��o�E���OQ�2n�Y�^�~��0�:^����������o���"�'��/�����o���%�R��O>;3��w��������G��Q�U��7�������1��<+�F����t�������C��������1�[�����	?�8Jv��>�z��������#��4�����y�����������N�x*�"�9����c^��~�9��W�Qm���B�k����~>B��y�8�����P��)p6�E������3��xp�'�g�H=����Y����(&9���	�A/�b'�3[��a_-�t�����[Y��r5;wMM�������R��.�/WvX�zP��9���yto���z�}5|O�Y�������~�H���$n%F	�:
P����A�_�~����J�S��������Y�(���|a<��5��y��Y_~�G�~`��������>��qRk��������c�C~{V�}G��k������
k�9��<��9\�;�}.�u���.��yi8�5t���c%�B�>�yWOwPu�����H/qm���qW���?�94�~�y��}y�W�$T�u\;�:�$�TG���.��X��1��
�S�A�����l�oz���v<�7N�{�}��'#�����9/�T��g�:���?=�[��=�~\��Y�������uS�9��w>�9&7��9�w�F)�FoE�cq���B��	�4�|
�s������W��"����r��M;�k����O��9���������<�o��'�
��r�~T������m�����4�������_�����^�������m�c���
���w��Q�Uw����pV�1�~��-r�s�"�c�(=>zO=�Q�t\��������m����N���\�9�=��tP���?�z��:l�����>�z��te;���<���V�n=����c�Y�����8v�=_�xJ�����v,
`��C^C��*1<�U���N)�������m8+��s�������*t��������h�<J}�>�6�������3��4��xO;�-���c�Y���G��~l�����������%�;ov������s����r�T��+��������?Y�1�������|������?���w3�O���?|��������?�����>|��]��������?��PK����2�CPK��EL�l9�..mimetypePK��EL^��hffTThumbnails/thumbnail.pngPK��ELd��bM�settings.xmlPK��EL���n
E�@Object 6/content.xmlPK��EL�P����0Object 6/styles.xmlPK��EL3��5g�2Object 6/meta.xmlPK��ELn$���S$
4styles.xmlPK��EL��~����;Object 9/content.xmlPK��EL�P����KObject 9/styles.xmlPK��EL3��5g�MObject 9/meta.xmlPK��EL�}���	�GOObject 5/content.xmlPK��EL�P���
_Object 5/styles.xmlPK��EL3��5g%aObject 5/meta.xmlPK��ELO�`���bObject 4/content.xmlPK��EL�P����tObject 4/styles.xmlPK��EL3��5g	wObject 4/meta.xmlPK��EL}xConfigurations2/toolbar/PK��EL�xConfigurations2/progressbar/PK��EL�xConfigurations2/menubar/PK��EL#yConfigurations2/floater/PK��ELYyConfigurations2/images/Bitmaps/PK��EL�yConfigurations2/popupmenu/PK��EL�yConfigurations2/statusbar/PK��ELzConfigurations2/accelerator/PK��EL@zConfigurations2/toolpanel/PK��EL�I����xzObject 10/content.xmlPK��EL�P�����Object 10/styles.xmlPK��EL3��5g��Object 10/meta.xmlPK��EL��h��?�manifest.rdfPK��EL�A�l~�meta.xmlPK��EL��M���d�Object 3/content.xmlPK��EL�P���z�Object 3/styles.xmlPK��EL3��5g��Object 3/meta.xmlPK��EL<��"���Object 2/content.xmlPK��EL�P����Object 2/styles.xmlPK��EL3��5g1�Object 2/meta.xmlPK��EL���1�����Object 1/content.xmlPK��EL�P�����Object 1/styles.xmlPK��EL3��5g��Object 1/meta.xmlPK��EL�V�l��&�META-INF/manifest.xmlPK��EL����2�C"�content.xmlPK))x
Q�
#118Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#1)
Re: JIT compiling with LLVM v10.0

Hi,

I've pushed v10.0. The big (and pretty painful to make) change is that
now all the LLVM specific code lives in src/backend/jit/llvm, which is
built as a shared library which is loaded on demand.

The layout is now as follows:

src/backend/jit/jit.c:
Part of JITing always linked into the server. Supports loading the
LLVM using JIT library.

src/backend/jit/llvm/
Infrastructure:
llvmjit.c:
General code generation and optimization infrastructure
llvmjit_error.cpp, llvmjit_wrap.cpp:
Error / backward compat wrappers
llvmjit_inline.cpp:
Cross module inlining support
Code-Gen:
llvmjit_expr.c
Expression compilation
llvmjit_deform.c
Deform compilation

I generally like how this shaped out. There's a good amount of followup
cleanup needed, but I'd appreciate some early feedback.

I've also rebased onto a recent master version.

postgres[21915][1]=# SELECT pg_llvmjit_available();
┌──────────────────────┐
│ pg_llvmjit_available │
├──────────────────────┤
│ t │
└──────────────────────┘
(1 row)

make -C src/backend/jit/llvm/ uninstall
postgres[21915][1]=# \c
You are now connected to database "postgres" as user "andres".
postgres[21922][1]=# SELECT pg_llvmjit_available();
┌──────────────────────┐
│ pg_llvmjit_available │
├──────────────────────┤
│ f │
└──────────────────────┘
(1 row)

Yeha ;)

Greetings,

Andres Freund

#119Pierre Ducroquet
p.psql@pinaraf.info
In reply to: Andres Freund (#118)
8 attachment(s)
Re: JIT compiling with LLVM v10.0

On Wednesday, February 7, 2018 3:54:05 PM CET Andres Freund wrote:

Hi,

I've pushed v10.0. The big (and pretty painful to make) change is that
now all the LLVM specific code lives in src/backend/jit/llvm, which is
built as a shared library which is loaded on demand.

The layout is now as follows:

src/backend/jit/jit.c:
Part of JITing always linked into the server. Supports loading the
LLVM using JIT library.

src/backend/jit/llvm/
Infrastructure:
llvmjit.c:
General code generation and optimization infrastructure
llvmjit_error.cpp, llvmjit_wrap.cpp:
Error / backward compat wrappers
llvmjit_inline.cpp:
Cross module inlining support
Code-Gen:
llvmjit_expr.c
Expression compilation
llvmjit_deform.c
Deform compilation

I generally like how this shaped out. There's a good amount of followup
cleanup needed, but I'd appreciate some early feedback.

Hi

I also find it more readable and it looks cleaner, insane guys could be able
to write their own JIT engines for PostgreSQL by patching a single file :)
Since it's now in its own .so file, does it still make as much sense using
mostly the LLVM C API ?
I'll really look in the jit code itself later, right now I've just rebased my
previous patches and did a quick check that everything worked for LLVM4 and
3.9.
I included a small addition to the gitignore file, I'm surprised you were not
bothered by the various .bc files generated.

Anyway, great work, and I look forward exploring the code :)

Pierre

Attachments:

0001-Add-support-for-LLVM4-in-llvmjit.c.patchtext/x-patch; charset=UTF-8; name=0001-Add-support-for-LLVM4-in-llvmjit.c.patchDownload
From f461c3d6d0deec52b66f3276a87cfdb3ab65b259 Mon Sep 17 00:00:00 2001
From: Pierre <pierre.ducroquet@people-doc.com>
Date: Fri, 2 Feb 2018 09:11:55 +0100
Subject: [PATCH 1/8] Add support for LLVM4 in llvmjit.c

---
 src/backend/jit/llvm/llvmjit.c | 21 ++++++++++++++++++---
 1 file changed, 18 insertions(+), 3 deletions(-)

diff --git a/src/backend/jit/llvm/llvmjit.c b/src/backend/jit/llvm/llvmjit.c
index a1bc6449f7..e81764af98 100644
--- a/src/backend/jit/llvm/llvmjit.c
+++ b/src/backend/jit/llvm/llvmjit.c
@@ -215,12 +215,19 @@ llvm_get_function(LLVMJitContext *context, const char *funcname)
 
 		addr = 0;
 		if (LLVMOrcGetSymbolAddressIn(handle->stack, &addr, handle->orc_handle, mangled))
-			elog(ERROR, "failed to lookup symbol");
+			elog(ERROR, "failed to lookup symbol %s", mangled);
 		if (addr)
 			return (void *) addr;
 	}
 #endif
 
+#if LLVM_VERSION_MAJOR < 5
+	if ((addr = LLVMOrcGetSymbolAddress(llvm_opt0_orc, mangled)))
+		return (void *) addr;
+	if ((addr = LLVMOrcGetSymbolAddress(llvm_opt3_orc, mangled)))
+		return (void *) addr;
+	elog(ERROR, "failed to lookup symbol %s for %s", mangled, funcname);
+#else
 	if (LLVMOrcGetSymbolAddress(llvm_opt0_orc, &addr, mangled))
 		elog(ERROR, "failed to lookup symbol");
 	if (addr)
@@ -229,7 +236,7 @@ llvm_get_function(LLVMJitContext *context, const char *funcname)
 		elog(ERROR, "failed to lookup symbol");
 	if (addr)
 		return (void *) addr;
-
+#endif
 	elog(ERROR, "failed to JIT: %s", funcname);
 
 	return NULL;
@@ -365,11 +372,18 @@ llvm_compile_module(LLVMJitContext *context)
 	 * faster instruction selection mechanism is used.
 	 */
 	{
-		LLVMSharedModuleRef smod;
 		instr_time tb, ta;
 
 		/* emit the code */
 		INSTR_TIME_SET_CURRENT(ta);
+#if LLVM_VERSION_MAJOR < 5
+		orc_handle = LLVMOrcAddEagerlyCompiledIR(compile_orc, context->module,
+							 llvm_resolve_symbol, NULL);
+		// It seems there is no error return from that function in LLVM < 5.
+#else
+		LLVMSharedModuleRef smod;
+
+		LLVMSharedModuleRef smod;
 		smod = LLVMOrcMakeSharedModule(context->module);
 		if (LLVMOrcAddEagerlyCompiledIR(compile_orc, &orc_handle, smod,
 										llvm_resolve_symbol, NULL))
@@ -377,6 +391,7 @@ llvm_compile_module(LLVMJitContext *context)
 			elog(ERROR, "failed to jit module");
 		}
 		LLVMOrcDisposeSharedModuleRef(smod);
+#endif
 		INSTR_TIME_SET_CURRENT(tb);
 		INSTR_TIME_SUBTRACT(tb, ta);
 		ereport(DEBUG1, (errmsg("time to emit: %.3fs",
-- 
2.16.1

0002-Add-LLVM4-support-in-llvmjit_error.cpp.patchtext/x-patch; charset=UTF-8; name=0002-Add-LLVM4-support-in-llvmjit_error.cpp.patchDownload
From 7c34e2264edad3d2d99ba2ba6fbf41ec3a73e0ed Mon Sep 17 00:00:00 2001
From: Pierre <pierre.ducroquet@people-doc.com>
Date: Fri, 2 Feb 2018 09:13:40 +0100
Subject: [PATCH 2/8] Add LLVM4 support in llvmjit_error.cpp

---
 src/backend/jit/llvm/llvmjit_error.cpp | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/src/backend/jit/llvm/llvmjit_error.cpp b/src/backend/jit/llvm/llvmjit_error.cpp
index 625ba2d25d..1c78bd956d 100644
--- a/src/backend/jit/llvm/llvmjit_error.cpp
+++ b/src/backend/jit/llvm/llvmjit_error.cpp
@@ -56,7 +56,9 @@ llvm_enter_fatal_on_oom(void)
 	if (fatal_new_handler_depth == 0)
 	{
 		old_new_handler = std::set_new_handler(fatal_system_new_handler);
+#if LLVM_VERSION_MAJOR > 4
 		llvm::install_bad_alloc_error_handler(fatal_llvm_new_handler);
+#endif
 		llvm::install_fatal_error_handler(fatal_llvm_error_handler);
 	}
 	fatal_new_handler_depth++;
@@ -72,7 +74,9 @@ llvm_leave_fatal_on_oom(void)
 	if (fatal_new_handler_depth == 0)
 	{
 		std::set_new_handler(old_new_handler);
+#if LLVM_VERSION_MAJOR > 4
 		llvm::remove_bad_alloc_error_handler();
+#endif
 		llvm::remove_fatal_error_handler();
 	}
 }
@@ -87,7 +91,9 @@ llvm_reset_after_error(void)
 	if (fatal_new_handler_depth != 0)
 	{
 		std::set_new_handler(old_new_handler);
+#if LLVM_VERSION_MAJOR > 4
 		llvm::remove_bad_alloc_error_handler();
+#endif
 		llvm::remove_fatal_error_handler();
 	}
 	fatal_new_handler_depth = 0;
-- 
2.16.1

0003-Add-LLVM4-support-in-llvmjit_inline.cpp.patchtext/x-patch; charset=UTF-8; name=0003-Add-LLVM4-support-in-llvmjit_inline.cpp.patchDownload
From 57477cd2005e78b70d8409d422327b23eb71737a Mon Sep 17 00:00:00 2001
From: Pierre <pierre.ducroquet@people-doc.com>
Date: Fri, 2 Feb 2018 09:23:56 +0100
Subject: [PATCH 3/8] Add LLVM4 support in llvmjit_inline.cpp

---
 src/backend/jit/llvm/llvmjit_inline.cpp | 36 +++++++++++++++++++++++++++++++--
 1 file changed, 34 insertions(+), 2 deletions(-)

diff --git a/src/backend/jit/llvm/llvmjit_inline.cpp b/src/backend/jit/llvm/llvmjit_inline.cpp
index 7d0d18b43d..4fa0e5ab64 100644
--- a/src/backend/jit/llvm/llvmjit_inline.cpp
+++ b/src/backend/jit/llvm/llvmjit_inline.cpp
@@ -100,6 +100,13 @@ llvm_inline(LLVMModuleRef M)
 	llvm_execute_inline_plan(mod, globalsToInline.get());
 }
 
+#if LLVM_VERSION_MAJOR < 5
+bool operator!(const llvm::ValueInfo &vi) {
+	return !(  (vi.Kind == llvm::ValueInfo::VI_GUID && vi.TheValue.Id)
+		|| (vi.Kind == llvm::ValueInfo::VI_Value && vi.TheValue.GV));
+}
+#endif
+
 /*
  * Build information necessary for inlining external function references in
  * mod.
@@ -146,7 +153,14 @@ llvm_build_inline_plan(llvm::Module *mod)
 		if (threshold == -1)
 			continue;
 
+#if LLVM_VERSION_MAJOR > 4
 		llvm::ValueInfo funcVI = llvm_index->getValueInfo(funcGUID);
+#else
+		const llvm::const_gvsummary_iterator &I = llvm_index->findGlobalValueSummaryList(funcGUID);
+		if (I == llvm_index->end())
+			continue;
+		llvm::ValueInfo funcVI = llvm::ValueInfo(I->first);
+#endif
 
 		/* if index doesn't know function, we don't have a body, continue */
 		if (!funcVI)
@@ -157,7 +171,12 @@ llvm_build_inline_plan(llvm::Module *mod)
 		 * look up module(s), check if function actually is defined (there
 		 * could be hash conflicts).
 		 */
+#if LLVM_VERSION_MAJOR > 4
 		for (const auto &gvs : funcVI.getSummaryList())
+#else
+		auto it_gvs = llvm_index->findGlobalValueSummaryList(funcVI.getGUID());
+		for (const auto &gvs: it_gvs->second)
+#endif
 		{
 			const llvm::FunctionSummary *fs;
 			llvm::StringRef modPath = gvs->modulePath();
@@ -318,9 +337,14 @@ llvm_execute_inline_plan(llvm::Module *mod, ImportMapTy *globalsToInline)
 
 		}
 
+#if LLVM_VERSION_MAJOR > 4
+#define IRMOVE_PARAMS , /*IsPerformingImport=*/false
+#else
+#define IRMOVE_PARAMS , /*LinkModuleInlineAsm=*/false, /*IsPerformingImport=*/false
+#endif
 		if (Mover.move(std::move(importMod), GlobalsToImport.getArrayRef(),
-					   [](llvm::GlobalValue &, llvm::IRMover::ValueAdder) {},
-					   /*IsPerformingImport=*/false))
+					   [](llvm::GlobalValue &, llvm::IRMover::ValueAdder) {}
+					   IRMOVE_PARAMS))
 			elog(ERROR, "function import failed with linker error");
 	}
 }
@@ -619,9 +643,17 @@ llvm_load_index(void)
 				elog(ERROR, "failed to open %s: %s", subpath,
 					 EC.message().c_str());
 			llvm::MemoryBufferRef ref(*MBOrErr.get().get());
+#if LLVM_VERSION_MAJOR > 4
 			llvm::Error e = llvm::readModuleSummaryIndex(ref, *index, 0);
 			if (e)
 				elog(ERROR, "could not load summary at %s", subpath);
+#else
+			std::unique_ptr<llvm::ModuleSummaryIndex> subindex = std::move(llvm::getModuleSummaryIndex(ref).get());
+			if (!subindex)
+				elog(ERROR, "could not load summary at %s", subpath);
+			else
+				index->mergeFrom(std::move(subindex), 0);
+#endif
 		}
 	}
 
-- 
2.16.1

0004-Don-t-emit-bitcode-depending-on-an-LLVM-5-function.patchtext/x-patch; charset=UTF-8; name=0004-Don-t-emit-bitcode-depending-on-an-LLVM-5-function.patchDownload
From e0b3147fe7b4eec8593b62c78d7491796c9e9a2f Mon Sep 17 00:00:00 2001
From: Pierre <pierre.ducroquet@people-doc.com>
Date: Fri, 2 Feb 2018 10:34:09 +0100
Subject: [PATCH 4/8] Don't emit bitcode depending on an LLVM 5+ function

---
 src/backend/jit/llvm/llvmjit_expr.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/backend/jit/llvm/llvmjit_expr.c b/src/backend/jit/llvm/llvmjit_expr.c
index a06319b1b6..4b3c5367e5 100644
--- a/src/backend/jit/llvm/llvmjit_expr.c
+++ b/src/backend/jit/llvm/llvmjit_expr.c
@@ -170,7 +170,11 @@ get_LifetimeEnd(LLVMModuleRef mod)
 	LLVMTypeRef sig;
 	LLVMValueRef fn;
 	LLVMTypeRef param_types[2];
+#if LLVM_VERSION_MAJOR > 4
 	const char *nm = "llvm.lifetime.end.p0i8";
+#else
+	const char *nm = "llvm.lifetime.end";
+#endif
 
 	fn = LLVMGetNamedFunction(mod, nm);
 	if (fn)
-- 
2.16.1

0005-Fix-warning.patchtext/x-patch; charset=UTF-8; name=0005-Fix-warning.patchDownload
From 1df043c0345f02a58a68bae0c671dbbb4a5d97f1 Mon Sep 17 00:00:00 2001
From: Pierre Ducroquet <pinaraf@pinaraf.info>
Date: Wed, 7 Feb 2018 20:22:37 +0100
Subject: [PATCH 5/8] Fix warning

---
 src/backend/jit/llvm/llvmjit_error.cpp | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/backend/jit/llvm/llvmjit_error.cpp b/src/backend/jit/llvm/llvmjit_error.cpp
index 1c78bd956d..623a70a7cc 100644
--- a/src/backend/jit/llvm/llvmjit_error.cpp
+++ b/src/backend/jit/llvm/llvmjit_error.cpp
@@ -28,7 +28,9 @@ static int fatal_new_handler_depth = 0;
 static std::new_handler old_new_handler = NULL;
 
 static void fatal_system_new_handler(void);
+#if LLVM_VERSION_MAJOR > 4
 static void fatal_llvm_new_handler(void *user_data, const std::string& reason, bool gen_crash_diag);
+#endif
 static void fatal_llvm_error_handler(void *user_data, const std::string& reason, bool gen_crash_diag);
 
 
@@ -114,6 +116,7 @@ fatal_system_new_handler(void)
 			 errdetail("while in LLVM")));
 }
 
+#if LLVM_VERSION_MAJOR > 4
 static void
 fatal_llvm_new_handler(void *user_data,
 					   const std::string& reason,
@@ -124,6 +127,7 @@ fatal_llvm_new_handler(void *user_data,
 			 errmsg("out of memory"),
 			 errdetail("while in LLVM: %s", reason.c_str())));
 }
+#endif
 
 static void
 fatal_llvm_error_handler(void *user_data,
-- 
2.16.1

0006-Ignore-LLVM-.bc-files.patchtext/x-patch; charset=UTF-8; name=0006-Ignore-LLVM-.bc-files.patchDownload
From 8904b24bb4f9428bc5a18a55a9c2d879dafeb31a Mon Sep 17 00:00:00 2001
From: Pierre Ducroquet <pinaraf@pinaraf.info>
Date: Wed, 7 Feb 2018 20:23:43 +0100
Subject: [PATCH 6/8] Ignore LLVM .bc files

---
 .gitignore | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.gitignore b/.gitignore
index a59e3da3be..794e35b73c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,7 @@
 # Global excludes across all subdirectories
 *.o
 *.obj
+*.bc
 *.so
 *.so.[0-9]
 *.so.[0-9].[0-9]
-- 
2.16.1

0007-Fix-building-with-LLVM-3.9.patchtext/x-patch; charset=UTF-8; name=0007-Fix-building-with-LLVM-3.9.patchDownload
From e10a1ae9a88406199665a3b010d44d5026d45ca8 Mon Sep 17 00:00:00 2001
From: Pierre <pierre.ducroquet@people-doc.com>
Date: Fri, 2 Feb 2018 11:29:45 +0100
Subject: [PATCH 7/8] Fix building with LLVM 3.9

---
 src/backend/jit/llvm/llvmjit_inline.cpp | 23 +++++++++++++++++++++--
 1 file changed, 21 insertions(+), 2 deletions(-)

diff --git a/src/backend/jit/llvm/llvmjit_inline.cpp b/src/backend/jit/llvm/llvmjit_inline.cpp
index 4fa0e5ab64..8cfac20565 100644
--- a/src/backend/jit/llvm/llvmjit_inline.cpp
+++ b/src/backend/jit/llvm/llvmjit_inline.cpp
@@ -37,7 +37,12 @@ extern "C"
 #include <llvm/ADT/StringSet.h>
 #include <llvm/ADT/StringMap.h>
 #include <llvm/Analysis/ModuleSummaryAnalysis.h>
+#if LLVM_VERSION_MAJOR > 3
 #include <llvm/Bitcode/BitcodeReader.h>
+#else
+#include "llvm/Bitcode/ReaderWriter.h"
+#include "llvm/Support/Error.h"
+#endif
 #include <llvm/IR/CallSite.h>
 #include <llvm/IR/DebugInfo.h>
 #include <llvm/IR/IntrinsicInst.h>
@@ -100,7 +105,12 @@ llvm_inline(LLVMModuleRef M)
 	llvm_execute_inline_plan(mod, globalsToInline.get());
 }
 
-#if LLVM_VERSION_MAJOR < 5
+#if LLVM_VERSION_MAJOR < 4
+bool operator!(const llvm::ValueInfo &vi) {
+	return !(  (vi.Kind == llvm::ValueInfo::VI_GUID && vi.TheValue.Id)
+		|| (vi.Kind == llvm::ValueInfo::VI_Value && vi.TheValue.V));
+}
+#elif LLVM_VERSION_MAJOR < 5
 bool operator!(const llvm::ValueInfo &vi) {
 	return !(  (vi.Kind == llvm::ValueInfo::VI_GUID && vi.TheValue.Id)
 		|| (vi.Kind == llvm::ValueInfo::VI_Value && vi.TheValue.GV));
@@ -188,12 +198,15 @@ llvm_build_inline_plan(llvm::Module *mod)
 				 funcName.data(),
 				 modPath.data());
 
+// XXX Missing in LLVM < 4.0 ?
+#if LLVM_VERSION_MAJOR > 3
 			if (gvs->notEligibleToImport())
 			{
 				elog(DEBUG1, "uneligible to import %s due to summary",
 					 funcName.data());
 				continue;
 			}
+#endif
 
 			if ((int) fs->instCount() > threshold)
 			{
@@ -339,8 +352,10 @@ llvm_execute_inline_plan(llvm::Module *mod, ImportMapTy *globalsToInline)
 
 #if LLVM_VERSION_MAJOR > 4
 #define IRMOVE_PARAMS , /*IsPerformingImport=*/false
-#else
+#elif LLVM_VERSION_MAJOR > 3
 #define IRMOVE_PARAMS , /*LinkModuleInlineAsm=*/false, /*IsPerformingImport=*/false
+#else
+#define IRMOVE_PARAMS
 #endif
 		if (Mover.move(std::move(importMod), GlobalsToImport.getArrayRef(),
 					   [](llvm::GlobalValue &, llvm::IRMover::ValueAdder) {}
@@ -648,7 +663,11 @@ llvm_load_index(void)
 			if (e)
 				elog(ERROR, "could not load summary at %s", subpath);
 #else
+#if LLVM_VERSION_MAJOR > 3
 			std::unique_ptr<llvm::ModuleSummaryIndex> subindex = std::move(llvm::getModuleSummaryIndex(ref).get());
+#else
+			std::unique_ptr<llvm::ModuleSummaryIndex> subindex = std::move(llvm::getModuleSummaryIndex(ref, [](const llvm::DiagnosticInfo &) {}).get());
+#endif
 			if (!subindex)
 				elog(ERROR, "could not load summary at %s", subpath);
 			else
-- 
2.16.1

0008-Fix-segfault-with-LLVM-3.9.patchtext/x-patch; charset=UTF-8; name=0008-Fix-segfault-with-LLVM-3.9.patchDownload
From 5e593b0f31227bc6d8e8f73f4cfbc525d7ed5e76 Mon Sep 17 00:00:00 2001
From: Pierre <pierre.ducroquet@people-doc.com>
Date: Fri, 2 Feb 2018 11:29:57 +0100
Subject: [PATCH 8/8] Fix segfault with LLVM 3.9

---
 src/backend/jit/llvm/llvmjit.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/backend/jit/llvm/llvmjit.c b/src/backend/jit/llvm/llvmjit.c
index e81764af98..0878c174ee 100644
--- a/src/backend/jit/llvm/llvmjit.c
+++ b/src/backend/jit/llvm/llvmjit.c
@@ -444,12 +444,12 @@ llvm_session_initialize(void)
 
 	cpu = LLVMGetHostCPUName();
 	llvm_opt0_targetmachine =
-		LLVMCreateTargetMachine(llvm_targetref, llvm_triple, cpu, NULL,
+		LLVMCreateTargetMachine(llvm_targetref, llvm_triple, cpu, "",
 								LLVMCodeGenLevelNone,
 								LLVMRelocDefault,
 								LLVMCodeModelJITDefault);
 	llvm_opt3_targetmachine =
-		LLVMCreateTargetMachine(llvm_targetref, llvm_triple, cpu, NULL,
+		LLVMCreateTargetMachine(llvm_targetref, llvm_triple, cpu, "",
 								LLVMCodeGenLevelAggressive,
 								LLVMRelocDefault,
 								LLVMCodeModelJITDefault);
-- 
2.16.1

#120Andres Freund
andres@anarazel.de
In reply to: Pierre Ducroquet (#119)
Re: JIT compiling with LLVM v10.0

Hi,

On 2018-02-07 20:35:12 +0100, Pierre Ducroquet wrote:

I also find it more readable and it looks cleaner, insane guys could be able
to write their own JIT engines for PostgreSQL by patching a single
file :)

Right - we could easily make the libname configurable if requested.

Since it's now in its own .so file, does it still make as much sense using
mostly the LLVM C API ?

Yes, I definitely want to continue that. For one the C API is a *lot*
more stable, for another postgres is C.

I included a small addition to the gitignore file, I'm surprised you were not
bothered by the various .bc files generated.

I use a VPATH build (i.e. source code is in a different directory than
the build products), so I do not really see that. But yes, it makes
sense to add ignores....

Thanks for looking,

Andres Freund

#121Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Andres Freund (#118)
Re: JIT compiling with LLVM v10.0

On Thu, Feb 8, 2018 at 3:54 AM, Andres Freund <andres@anarazel.de> wrote:

I've pushed v10.0. The big (and pretty painful to make) change is that
now all the LLVM specific code lives in src/backend/jit/llvm, which is
built as a shared library which is loaded on demand.

The layout is now as follows:

src/backend/jit/jit.c:
Part of JITing always linked into the server. Supports loading the
LLVM using JIT library.

src/backend/jit/llvm/
Infrastructure:
llvmjit.c:
General code generation and optimization infrastructure
llvmjit_error.cpp, llvmjit_wrap.cpp:
Error / backward compat wrappers
llvmjit_inline.cpp:
Cross module inlining support
Code-Gen:
llvmjit_expr.c
Expression compilation
llvmjit_deform.c
Deform compilation

You are asking LLVM to dlopen(""), which doesn't work on my not-Linux,
explaining the errors I reported in the older thread. The portable
way to dlopen the main binary is dlopen(NULL), so I think you need to
pass NULL in to LLVMLoadLibraryPermanently(), even though that isn't
really clear from any LLVM documentation I've looked at.

diff --git a/src/backend/jit/llvm/llvmjit.c b/src/backend/jit/llvm/llvmjit.c
index a1bc6449f7..874bddf81e 100644
--- a/src/backend/jit/llvm/llvmjit.c
+++ b/src/backend/jit/llvm/llvmjit.c
@@ -443,7 +443,7 @@ llvm_session_initialize(void)
        cpu = NULL;
        /* force symbols in main binary to be loaded */
-       LLVMLoadLibraryPermanently("");
+       LLVMLoadLibraryPermanently(NULL);

llvm_opt0_orc = LLVMOrcCreateInstance(llvm_opt0_targetmachine);
llvm_opt3_orc = LLVMOrcCreateInstance(llvm_opt3_targetmachine);

--
Thomas Munro
http://www.enterprisedb.com

#122Andres Freund
andres@anarazel.de
In reply to: Thomas Munro (#121)
Re: JIT compiling with LLVM v10.0

On 2018-02-08 11:50:17 +1300, Thomas Munro wrote:

You are asking LLVM to dlopen(""), which doesn't work on my not-Linux,
explaining the errors I reported in the older thread. The portable
way to dlopen the main binary is dlopen(NULL), so I think you need to
pass NULL in to LLVMLoadLibraryPermanently(), even though that isn't
really clear from any LLVM documentation I've looked at.

Ugh. Thanks for figuring that out, will incorporate!

Greetings,

Andres Freund

#123Andreas Karlsson
andreas@proxel.se
In reply to: Andres Freund (#118)
Re: JIT compiling with LLVM v10.0

On 02/07/2018 03:54 PM, Andres Freund wrote:

I've pushed v10.0. The big (and pretty painful to make) change is that
now all the LLVM specific code lives in src/backend/jit/llvm, which is
built as a shared library which is loaded on demand.

It does not seem to be possible build without LLVM anymore.

Error:

In file included from planner.c:32:0:
../../../../src/include/jit/llvmjit.h:13:10: fatal error:
llvm-c/Types.h: No such file or directory
#include <llvm-c/Types.h>
^~~~~~~~~~~~~~~~

Options:

./configure --prefix=/home/andreas/dev/postgresql-inst
--enable-tap-tests --enable-cassert --enable-debug

I also noticed the following typo:

diff --git a/configure.in b/configure.in
index b035966c0a..b89c4a138a 100644
--- a/configure.in
+++ b/configure.in
@@ -499,7 +499,7 @@ fi
  if test "$enable_coverage" = yes; then
    if test "$GCC" = yes; then
      CFLAGS="$CFLAGS -fprofile-arcs -ftest-coverage"
-    CFLAGS="$CXXFLAGS -fprofile-arcs -ftest-coverage"
+    CXXFLAGS="$CXXFLAGS -fprofile-arcs -ftest-coverage"
    else
      AC_MSG_ERROR([--enable-coverage is supported only when using GCC])
    fi

Andreas

#124Dmitry Dolgov
9erthalion6@gmail.com
In reply to: Andreas Karlsson (#123)
Re: JIT compiling with LLVM v10.0

On 8 February 2018 at 10:29, Andreas Karlsson <andreas@proxel.se> wrote:

On 02/07/2018 03:54 PM, Andres Freund wrote:

I've pushed v10.0. The big (and pretty painful to make) change is that
now all the LLVM specific code lives in src/backend/jit/llvm, which is
built as a shared library which is loaded on demand.

It does not seem to be possible build without LLVM anymore.

Maybe I'm doing something wrong, but I also see some issues during compilation
even with llvm included (with gcc 5.4.0 and 7.1.0). Is it expected, do I need
to use another version to check it out?

$ git rev-parse HEAD
e24cac5951575cf86f138080acec663a0a05983e

$ ./configure --prefix=/build/postgres-jit/ --with-llvm
--enable-debug --enable-depend --enable-cassert

In file included from llvmjit_error.cpp:22:0:
/usr/lib/llvm-5.0/include/llvm/Support/ErrorHandling.h:47:36:
warning: identifier 'nullptr' is a keyword in C++11 [-Wc++0x-compat]
void *user_data = nullptr);
^
In file included from /usr/include/c++/5/cinttypes:35:0,
from /usr/lib/llvm-5.0/include/llvm/Support/DataTypes.h:39,
from /usr/lib/llvm-5.0/include/llvm-c/Types.h:17,
from ../../../../src/include/jit/llvmjit.h:13,
from llvmjit_error.cpp:24:
/usr/include/c++/5/bits/c++0x_warning.h:32:2: error: #error This
file requires compiler and library support for the ISO C++ 2011
standard. This support must be enabled with the -std=c++11 or
-std=gnu++11 compiler options.
#error This file requires compiler and library support \
^
In file included from llvmjit_error.cpp:22:0:
/usr/lib/llvm-5.0/include/llvm/Support/ErrorHandling.h:47:54:
error: 'nullptr' was not declared in this scope
void *user_data = nullptr);
^
/usr/lib/llvm-5.0/include/llvm/Support/ErrorHandling.h:57:56:
error: 'nullptr' was not declared in this scope
void *user_data = nullptr) {
^
/usr/lib/llvm-5.0/include/llvm/Support/ErrorHandling.h:98:56:
error: 'nullptr' was not declared in this scope
void *user_data = nullptr);
^
/usr/lib/llvm-5.0/include/llvm/Support/ErrorHandling.h:121:45:
error: 'nullptr' was not declared in this scope
llvm_unreachable_internal(const char *msg = nullptr, const char
*file = nullptr,
^
/usr/lib/llvm-5.0/include/llvm/Support/ErrorHandling.h:121:73:
error: 'nullptr' was not declared in this scope
llvm_unreachable_internal(const char *msg = nullptr, const char
*file = nullptr,
^
../../../../src/Makefile.global:838: recipe for target
'llvmjit_error.o' failed
make[2]: *** [llvmjit_error.o] Error 1
make[2]: Leaving directory '/postgres/src/backend/jit/llvm'
Makefile:42: recipe for target 'all-backend/jit/llvm-recurse' failed
make[1]: *** [all-backend/jit/llvm-recurse] Error 2
make[1]: Leaving directory '/postgres/src'
GNUmakefile:11: recipe for target 'all-src-recurse' failed
make: *** [all-src-recurse] Error 2

#125Andres Freund
andres@anarazel.de
In reply to: Dmitry Dolgov (#124)
Re: JIT compiling with LLVM v10.0

On 2018-02-08 15:14:42 +0100, Dmitry Dolgov wrote:

On 8 February 2018 at 10:29, Andreas Karlsson <andreas@proxel.se> wrote:

On 02/07/2018 03:54 PM, Andres Freund wrote:

I've pushed v10.0. The big (and pretty painful to make) change is that
now all the LLVM specific code lives in src/backend/jit/llvm, which is
built as a shared library which is loaded on demand.

It does not seem to be possible build without LLVM anymore.

Yea, wrong header included. Will fix.

Maybe I'm doing something wrong, but I also see some issues during compilation
even with llvm included (with gcc 5.4.0 and 7.1.0). Is it expected, do I need
to use another version to check it out?

$ git rev-parse HEAD
e24cac5951575cf86f138080acec663a0a05983e

$ ./configure --prefix=/build/postgres-jit/ --with-llvm
--enable-debug --enable-depend --enable-cassert

Seems you need to provide a decent C++ compiler (via CXX=... to
configure). Will test that it actually works with a recent clang.

Greetings,

Andres Freund

#126Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Dmitry Dolgov (#124)
Re: JIT compiling with LLVM v10.0

On Fri, Feb 9, 2018 at 3:14 AM, Dmitry Dolgov <9erthalion6@gmail.com> wrote:

$ ./configure --prefix=/build/postgres-jit/ --with-llvm
--enable-debug --enable-depend --enable-cassert

/usr/include/c++/5/bits/c++0x_warning.h:32:2: error: #error This
file requires compiler and library support for the ISO C++ 2011
standard. This support must be enabled with the -std=c++11 or
-std=gnu++11 compiler options.

Did you try passing CXXFLAGS="-std=c++11" to configure?

--
Thomas Munro
http://www.enterprisedb.com

#127Merlin Moncure
mmoncure@gmail.com
In reply to: Thomas Munro (#97)
Re: JIT compiling with LLVM v9.0

On Thu, Feb 1, 2018 at 8:16 PM, Thomas Munro
<thomas.munro@enterprisedb.com> wrote:

On Fri, Feb 2, 2018 at 2:05 PM, Andres Freund <andres@anarazel.de> wrote:

On 2018-02-01 09:32:17 -0800, Jeff Davis wrote:

On Wed, Jan 31, 2018 at 12:03 AM, Konstantin Knizhnik
<k.knizhnik@postgrespro.ru> wrote:

The same problem takes place with old versions of GCC: I have to upgrade GCC
to 7.2 to make it possible to compile this code.
The problem in not in compiler itself, but in libc++ headers.

How can I get this branch to compile on ubuntu 16.04? I have llvm-5.0
and gcc-5.4 installed. Do I need to compile with clang or gcc? Any
CXXFLAGS required?

Just to understand: You're running in the issue with the header being
included from within the extern "C" {}? Hm, I've pushed a quick fix for
that.

That change wasn't quite enough: to get this building against libc++
(Clang's native stdlb) I also needed this change to llvmjit.h so that
<llvm-c/Types.h> wouldn't be included with the wrong linkage (perhaps
you can find a less ugly way):

+#ifdef __cplusplus
+}
+#endif
#include <llvm-c/Types.h>
+#ifdef __cplusplus
+extern "C"
+{
+#endif

This did the trick -- thanks. Sitting through 20 minute computer
crashing link times really brings back C++ nightmares -- if anyone
else needs to compile llvm/clang as I did (I'm stuck on 3.2 with my
aging mint box), I strongly encourage you to use the gold linker.

Question: when watching the compilation log, I see quite a few files
being compiled with both O2 and O1, for example:

clang -Wall -Wmissing-prototypes -Wpointer-arith
-Wdeclaration-after-statement -Wendif-labels
-Wmissing-format-attribute -Wformat-security -fno-strict-aliasing
-fwrapv -Wno-unused-command-line-argument -O2 -O1
-Wno-ignored-attributes -Wno-unknown-warning-option
-Wno-ignored-optimization-argument -I../../../../src/include
-D_GNU_SOURCE -I/home/mmoncure/llvm/include -DLLVM_BUILD_GLOBAL_ISEL
-D_GNU_SOURCE -D_DEBUG -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS
-D__STDC_LIMIT_MACROS -flto=thin -emit-llvm -c -o nbtsort.bc
nbtsort.c

Is this intentional? (didn't check standard compilation, it just jumped out).

merlin

#128Andres Freund
andres@anarazel.de
In reply to: Merlin Moncure (#127)
Re: JIT compiling with LLVM v9.0

On 2018-02-09 09:10:25 -0600, Merlin Moncure wrote:

Question: when watching the compilation log, I see quite a few files
being compiled with both O2 and O1, for example:

clang -Wall -Wmissing-prototypes -Wpointer-arith
-Wdeclaration-after-statement -Wendif-labels
-Wmissing-format-attribute -Wformat-security -fno-strict-aliasing
-fwrapv -Wno-unused-command-line-argument -O2 -O1
-Wno-ignored-attributes -Wno-unknown-warning-option
-Wno-ignored-optimization-argument -I../../../../src/include
-D_GNU_SOURCE -I/home/mmoncure/llvm/include -DLLVM_BUILD_GLOBAL_ISEL
-D_GNU_SOURCE -D_DEBUG -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS
-D__STDC_LIMIT_MACROS -flto=thin -emit-llvm -c -o nbtsort.bc
nbtsort.c

Is this intentional? (didn't check standard compilation, it just jumped out).

It stemms from the following hunk in Makefile.global.in about emitting
bitcode:
# Add -O1 to the options as clang otherwise will emit 'noinline'
# attributes everywhere, making JIT inlining impossible to test in a
# debugging build.
#
# FIXME: While LLVM will re-optimize when emitting code (after
# inlining), it'd be better to only do this if -O0 is specified.
%.bc : CFLAGS +=-O1

%.bc : %.c
$(COMPILE.c.bc) -o $@ $<

Inspecting the clang source code it's impossible to stop clang from
emitting noinline attributes for every function on -O0.

I think it makes sense to change this to filtering out -O0 and only
adding -O1 if that's not present. :/

Greetings,

Andres Freund

#129Dmitry Dolgov
9erthalion6@gmail.com
In reply to: Thomas Munro (#126)
Re: JIT compiling with LLVM v10.0

On 8 February 2018 at 21:26, Thomas Munro <thomas.munro@enterprisedb.com> wrote:
On Fri, Feb 9, 2018 at 3:14 AM, Dmitry Dolgov <9erthalion6@gmail.com> wrote:

$ ./configure --prefix=/build/postgres-jit/ --with-llvm
--enable-debug --enable-depend --enable-cassert

/usr/include/c++/5/bits/c++0x_warning.h:32:2: error: #error This
file requires compiler and library support for the ISO C++ 2011
standard. This support must be enabled with the -std=c++11 or
-std=gnu++11 compiler options.

Did you try passing CXXFLAGS="-std=c++11" to configure?

Yes, it solved the issue, thanks.

In reply to: Robert Haas (#84)
Re: JIT compiling with LLVM v9.0

On Wed, Jan 31, 2018 at 8:53 AM, Robert Haas <robertmhaas@gmail.com> wrote:

As far as the second one, looking back at what happened with parallel
query, I found (on a quick read) 13 back-patched commits in
REL9_6_STABLE prior to the release of 10.0, 3 of which I would qualify
as low-importance (improving documentation, fixing something that's
not really a bug, improving a test case). A couple of those were
really stupid mistakes on my part. On the other hand, would it have
been overall worse for our users if that feature had been turned on in
9.6? I don't know. They would have had those bugs (at least until we
fixed them) but they would have had parallel query, too. It's hard
for me to judge whether that was a win or a loss, and so here. Like
parallel query, this is a feature which seems to have a low risk of
data corruption, but a fairly high risk of wrong answers to queries
and/or strange errors. Users don't like that. On the other hand,
also like parallel query, if you've got the right kind of queries, it
can make them go a lot faster. Users DO like that.

As a data point, I can tell you that Heroku enabled parallel query for
9.6 immediately, and it turned out fine. The first version available
as stable was probably 9.6.3 -- there or thereabouts.

There were some bugs, of course, but not to the extent that 9.6 was
looked upon as being more buggy than the average Postgres release.

--
Peter Geoghegan

#131Merlin Moncure
mmoncure@gmail.com
In reply to: Konstantin Knizhnik (#31)
Re: JIT compiling with LLVM v9.0

On Thu, Jan 25, 2018 at 9:40 AM, Konstantin Knizhnik
<k.knizhnik@postgrespro.ru> wrote:

As far as I understand generation of native code is now always done for all
supported expressions and individually by each backend.
I wonder it will be useful to do more efforts to understand when compilation
to native code should be done and when interpretation is better.
For example many JIT-able languages like Lua are using traces, i.e. query is
first interpreted and trace is generated. If the same trace is followed
more than N times, then native code is generated for it.

In context of DBMS executor it is obvious that only frequently executed or
expensive queries have to be compiled.
So we can use estimated plan cost and number of query executions as simple
criteria for JIT-ing the query.
May be compilation of simple queries (with small cost) should be done only
for prepared statements...

Another question is whether it is sensible to redundantly do expensive work
(llvm compilation) in all backends.
This question refers to shared prepared statement cache. But even without
such cache, it seems to be possible to use for library name some signature
of the compiled expression and allow
to share this libraries between backends. So before starting code
generation, ExecReadyCompiledExpr can first build signature and check if
correspondent library is already present.
Also it will be easier to control space used by compiled libraries in this
case.

Totally agree; these considerations are very important.

I tested several queries in my application that had >30 second compile
times against a one second run time,. Not being able to manage when
compilation happens is making it difficult to get a sense of llvm
performance in the general case. Having explain analyze print compile
time and being able to prepare llvm compiled queries ought to help
measurement and tuning. There may be utility here beyond large
analytical queries as the ability to optimize spreads through the
executor with the right trade off management.

This work is very exciting...thank you.

merlin

#132Robert Haas
robertmhaas@gmail.com
In reply to: Merlin Moncure (#131)
Re: JIT compiling with LLVM v9.0

On Sun, Feb 11, 2018 at 10:00 AM, Merlin Moncure <mmoncure@gmail.com> wrote:

I tested several queries in my application that had >30 second compile
times against a one second run time,. Not being able to manage when
compilation happens is making it difficult to get a sense of llvm
performance in the general case.

In theory, the GUCs Andres has added to only compile if the estimated
total cost is above some threshold is supposed to help with this. But
if the compile time and the cost don't correlate, then we've got
trouble. How did you manage to create an expression that took 30
seconds to compile? It doesn't take that long to compile a 5000-line
C file.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#133Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#132)
Re: JIT compiling with LLVM v9.0

On 2018-02-13 13:43:40 -0500, Robert Haas wrote:

On Sun, Feb 11, 2018 at 10:00 AM, Merlin Moncure <mmoncure@gmail.com> wrote:

I tested several queries in my application that had >30 second compile
times against a one second run time,. Not being able to manage when
compilation happens is making it difficult to get a sense of llvm
performance in the general case.

In theory, the GUCs Andres has added to only compile if the estimated
total cost is above some threshold is supposed to help with this.

Note that the GUCs as posted are set *way* too low, they're currently
toy thresholds. That's easier for testing, but I guess I should set them
to something better.

It's not unrealistic to expect them to be insufficient however - the
overhead roughly linearly grows with the number of expressions, which
might not reflect the gain equally.

How did you manage to create an expression that took 30 seconds to
compile? It doesn't take that long to compile a 5000-line C file.

Any chance a debug build of LLVM was used? The overhead of that are
easily an order of magnitude or more.

Greetings,

Andres Freund

#134Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#118)
Re: JIT compiling with LLVM v10.1

Hi,

On 2018-02-07 06:54:05 -0800, Andres Freund wrote:

I've pushed v10.0. The big (and pretty painful to make) change is that
now all the LLVM specific code lives in src/backend/jit/llvm, which is
built as a shared library which is loaded on demand.

The layout is now as follows:

src/backend/jit/jit.c:
Part of JITing always linked into the server. Supports loading the
LLVM using JIT library.

src/backend/jit/llvm/
Infrastructure:
llvmjit.c:
General code generation and optimization infrastructure
llvmjit_error.cpp, llvmjit_wrap.cpp:
Error / backward compat wrappers
llvmjit_inline.cpp:
Cross module inlining support
Code-Gen:
llvmjit_expr.c
Expression compilation
llvmjit_deform.c
Deform compilation

I've pushed a revised version that hopefully should address Jeff's
wish/need of being able to experiment with this out of core. There's now
a "jit_provider" PGC_POSTMASTER GUC that's by default set to
"llvmjit". llvmjit.so is the .so implementing JIT using LLVM. It fills a
set of callbacks via
extern void _PG_jit_provider_init(JitProviderCallbacks *cb);
which can also be implemented by any other potential provider.

The other two biggest changes are that I've added a README
https://git.postgresql.org/gitweb/?p=users/andresfreund/postgres.git;a=blob;f=src/backend/jit/README;hb=jit
and that I've revised the configure support so it does more error
checks, and moved it into config/llvm.m4.

There's a larger smattering of small changes too.

I'm pretty happy with how the separation of core / shlib looks now. I'm
planning to work on cleaning and then pushing some of the preliminary
patches (fixed tupledesc, grouping) over the next few days.

Greetings,

Andres Freund

#135Pierre Ducroquet
p.psql@pinaraf.info
In reply to: Andres Freund (#134)
8 attachment(s)
Re: JIT compiling with LLVM v10.1

On Wednesday, February 14, 2018 7:17:10 PM CET Andres Freund wrote:

Hi,

On 2018-02-07 06:54:05 -0800, Andres Freund wrote:

I've pushed v10.0. The big (and pretty painful to make) change is that
now all the LLVM specific code lives in src/backend/jit/llvm, which is
built as a shared library which is loaded on demand.

The layout is now as follows:

src/backend/jit/jit.c:
Part of JITing always linked into the server. Supports loading the
LLVM using JIT library.

src/backend/jit/llvm/

Infrastructure:
llvmjit.c:
General code generation and optimization infrastructure

llvmjit_error.cpp, llvmjit_wrap.cpp:
Error / backward compat wrappers

llvmjit_inline.cpp:
Cross module inlining support

Code-Gen:
llvmjit_expr.c

Expression compilation

llvmjit_deform.c

Deform compilation

I've pushed a revised version that hopefully should address Jeff's
wish/need of being able to experiment with this out of core. There's now
a "jit_provider" PGC_POSTMASTER GUC that's by default set to
"llvmjit". llvmjit.so is the .so implementing JIT using LLVM. It fills a
set of callbacks via
extern void _PG_jit_provider_init(JitProviderCallbacks *cb);
which can also be implemented by any other potential provider.

The other two biggest changes are that I've added a README
https://git.postgresql.org/gitweb/?p=users/andresfreund/postgres.git;a=blob;
f=src/backend/jit/README;hb=jit and that I've revised the configure support
so it does more error
checks, and moved it into config/llvm.m4.

There's a larger smattering of small changes too.

I'm pretty happy with how the separation of core / shlib looks now. I'm
planning to work on cleaning and then pushing some of the preliminary
patches (fixed tupledesc, grouping) over the next few days.

Greetings,

Andres Freund

Hi

Here are the LLVM4 and LLVM3.9 compatibility patches.
Successfully built, and executed some silly queries with JIT forced to make
sure it worked.

Pierre

Attachments:

0001-Add-support-for-LLVM4-in-llvmjit.c.patchtext/x-patch; charset=UTF-8; name=0001-Add-support-for-LLVM4-in-llvmjit.c.patchDownload
From c856a5db2f0ba34ba7c230a65f60277ae0e7347f Mon Sep 17 00:00:00 2001
From: Pierre <pierre.ducroquet@people-doc.com>
Date: Fri, 2 Feb 2018 09:11:55 +0100
Subject: [PATCH 1/8] Add support for LLVM4 in llvmjit.c

Signed-off-by: Pierre Ducroquet <pinaraf@pinaraf.info>
---
 src/backend/jit/llvm/llvmjit.c | 21 +++++++++++++++++++--
 1 file changed, 19 insertions(+), 2 deletions(-)

diff --git a/src/backend/jit/llvm/llvmjit.c b/src/backend/jit/llvm/llvmjit.c
index 7a96ece0f7..7557dc9a19 100644
--- a/src/backend/jit/llvm/llvmjit.c
+++ b/src/backend/jit/llvm/llvmjit.c
@@ -222,13 +222,20 @@ llvm_get_function(LLVMJitContext *context, const char *funcname)
 
 		addr = 0;
 		if (LLVMOrcGetSymbolAddressIn(handle->stack, &addr, handle->orc_handle, mangled))
-			elog(ERROR, "failed to lookup symbol");
+			elog(ERROR, "failed to lookup symbol %s", mangled);
 		if (addr)
 			return (void *) addr;
 	}
 
 #else
 
+#if LLVM_VERSION_MAJOR < 5
+	if ((addr = LLVMOrcGetSymbolAddress(llvm_opt0_orc, mangled)))
+		return (void *) addr;
+	if ((addr = LLVMOrcGetSymbolAddress(llvm_opt3_orc, mangled)))
+		return (void *) addr;
+	elog(ERROR, "failed to lookup symbol %s for %s", mangled, funcname);
+#else
 	if (LLVMOrcGetSymbolAddress(llvm_opt0_orc, &addr, mangled))
 		elog(ERROR, "failed to lookup symbol");
 	if (addr)
@@ -237,6 +244,8 @@ llvm_get_function(LLVMJitContext *context, const char *funcname)
 		elog(ERROR, "failed to lookup symbol");
 	if (addr)
 		return (void *) addr;
+#endif // LLVM_VERSION_MAJOR
+
 #endif
 
 	elog(ERROR, "failed to JIT: %s", funcname);
@@ -374,11 +383,18 @@ llvm_compile_module(LLVMJitContext *context)
 	 * faster instruction selection mechanism is used.
 	 */
 	{
-		LLVMSharedModuleRef smod;
 		instr_time tb, ta;
 
 		/* emit the code */
 		INSTR_TIME_SET_CURRENT(ta);
+#if LLVM_VERSION_MAJOR < 5
+		orc_handle = LLVMOrcAddEagerlyCompiledIR(compile_orc, context->module,
+							 llvm_resolve_symbol, NULL);
+		// It seems there is no error return from that function in LLVM < 5.
+#else
+		LLVMSharedModuleRef smod;
+
+		LLVMSharedModuleRef smod;
 		smod = LLVMOrcMakeSharedModule(context->module);
 		if (LLVMOrcAddEagerlyCompiledIR(compile_orc, &orc_handle, smod,
 										llvm_resolve_symbol, NULL))
@@ -386,6 +402,7 @@ llvm_compile_module(LLVMJitContext *context)
 			elog(ERROR, "failed to jit module");
 		}
 		LLVMOrcDisposeSharedModuleRef(smod);
+#endif
 		INSTR_TIME_SET_CURRENT(tb);
 		INSTR_TIME_SUBTRACT(tb, ta);
 		ereport(DEBUG1, (errmsg("time to emit: %.3fs",
-- 
2.16.1

0002-Add-LLVM4-support-in-llvmjit_error.cpp.patchtext/x-patch; charset=UTF-8; name=0002-Add-LLVM4-support-in-llvmjit_error.cpp.patchDownload
From a44378f05c33a40c485f26e5f007614100c70fe7 Mon Sep 17 00:00:00 2001
From: Pierre <pierre.ducroquet@people-doc.com>
Date: Fri, 2 Feb 2018 09:13:40 +0100
Subject: [PATCH 2/8] Add LLVM4 support in llvmjit_error.cpp

Signed-off-by: Pierre Ducroquet <pinaraf@pinaraf.info>
---
 src/backend/jit/llvm/llvmjit_error.cpp | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/src/backend/jit/llvm/llvmjit_error.cpp b/src/backend/jit/llvm/llvmjit_error.cpp
index 625ba2d25d..1c78bd956d 100644
--- a/src/backend/jit/llvm/llvmjit_error.cpp
+++ b/src/backend/jit/llvm/llvmjit_error.cpp
@@ -56,7 +56,9 @@ llvm_enter_fatal_on_oom(void)
 	if (fatal_new_handler_depth == 0)
 	{
 		old_new_handler = std::set_new_handler(fatal_system_new_handler);
+#if LLVM_VERSION_MAJOR > 4
 		llvm::install_bad_alloc_error_handler(fatal_llvm_new_handler);
+#endif
 		llvm::install_fatal_error_handler(fatal_llvm_error_handler);
 	}
 	fatal_new_handler_depth++;
@@ -72,7 +74,9 @@ llvm_leave_fatal_on_oom(void)
 	if (fatal_new_handler_depth == 0)
 	{
 		std::set_new_handler(old_new_handler);
+#if LLVM_VERSION_MAJOR > 4
 		llvm::remove_bad_alloc_error_handler();
+#endif
 		llvm::remove_fatal_error_handler();
 	}
 }
@@ -87,7 +91,9 @@ llvm_reset_after_error(void)
 	if (fatal_new_handler_depth != 0)
 	{
 		std::set_new_handler(old_new_handler);
+#if LLVM_VERSION_MAJOR > 4
 		llvm::remove_bad_alloc_error_handler();
+#endif
 		llvm::remove_fatal_error_handler();
 	}
 	fatal_new_handler_depth = 0;
-- 
2.16.1

0003-Add-LLVM4-support-in-llvmjit_inline.cpp.patchtext/x-patch; charset=UTF-8; name=0003-Add-LLVM4-support-in-llvmjit_inline.cpp.patchDownload
From 9360b80327863d3ccaa93b8acfdb85bbe07730ce Mon Sep 17 00:00:00 2001
From: Pierre <pierre.ducroquet@people-doc.com>
Date: Fri, 2 Feb 2018 09:23:56 +0100
Subject: [PATCH 3/8] Add LLVM4 support in llvmjit_inline.cpp

Signed-off-by: Pierre Ducroquet <pinaraf@pinaraf.info>
---
 src/backend/jit/llvm/llvmjit_inline.cpp | 36 +++++++++++++++++++++++++++++++--
 1 file changed, 34 insertions(+), 2 deletions(-)

diff --git a/src/backend/jit/llvm/llvmjit_inline.cpp b/src/backend/jit/llvm/llvmjit_inline.cpp
index 7d0d18b43d..4fa0e5ab64 100644
--- a/src/backend/jit/llvm/llvmjit_inline.cpp
+++ b/src/backend/jit/llvm/llvmjit_inline.cpp
@@ -100,6 +100,13 @@ llvm_inline(LLVMModuleRef M)
 	llvm_execute_inline_plan(mod, globalsToInline.get());
 }
 
+#if LLVM_VERSION_MAJOR < 5
+bool operator!(const llvm::ValueInfo &vi) {
+	return !(  (vi.Kind == llvm::ValueInfo::VI_GUID && vi.TheValue.Id)
+		|| (vi.Kind == llvm::ValueInfo::VI_Value && vi.TheValue.GV));
+}
+#endif
+
 /*
  * Build information necessary for inlining external function references in
  * mod.
@@ -146,7 +153,14 @@ llvm_build_inline_plan(llvm::Module *mod)
 		if (threshold == -1)
 			continue;
 
+#if LLVM_VERSION_MAJOR > 4
 		llvm::ValueInfo funcVI = llvm_index->getValueInfo(funcGUID);
+#else
+		const llvm::const_gvsummary_iterator &I = llvm_index->findGlobalValueSummaryList(funcGUID);
+		if (I == llvm_index->end())
+			continue;
+		llvm::ValueInfo funcVI = llvm::ValueInfo(I->first);
+#endif
 
 		/* if index doesn't know function, we don't have a body, continue */
 		if (!funcVI)
@@ -157,7 +171,12 @@ llvm_build_inline_plan(llvm::Module *mod)
 		 * look up module(s), check if function actually is defined (there
 		 * could be hash conflicts).
 		 */
+#if LLVM_VERSION_MAJOR > 4
 		for (const auto &gvs : funcVI.getSummaryList())
+#else
+		auto it_gvs = llvm_index->findGlobalValueSummaryList(funcVI.getGUID());
+		for (const auto &gvs: it_gvs->second)
+#endif
 		{
 			const llvm::FunctionSummary *fs;
 			llvm::StringRef modPath = gvs->modulePath();
@@ -318,9 +337,14 @@ llvm_execute_inline_plan(llvm::Module *mod, ImportMapTy *globalsToInline)
 
 		}
 
+#if LLVM_VERSION_MAJOR > 4
+#define IRMOVE_PARAMS , /*IsPerformingImport=*/false
+#else
+#define IRMOVE_PARAMS , /*LinkModuleInlineAsm=*/false, /*IsPerformingImport=*/false
+#endif
 		if (Mover.move(std::move(importMod), GlobalsToImport.getArrayRef(),
-					   [](llvm::GlobalValue &, llvm::IRMover::ValueAdder) {},
-					   /*IsPerformingImport=*/false))
+					   [](llvm::GlobalValue &, llvm::IRMover::ValueAdder) {}
+					   IRMOVE_PARAMS))
 			elog(ERROR, "function import failed with linker error");
 	}
 }
@@ -619,9 +643,17 @@ llvm_load_index(void)
 				elog(ERROR, "failed to open %s: %s", subpath,
 					 EC.message().c_str());
 			llvm::MemoryBufferRef ref(*MBOrErr.get().get());
+#if LLVM_VERSION_MAJOR > 4
 			llvm::Error e = llvm::readModuleSummaryIndex(ref, *index, 0);
 			if (e)
 				elog(ERROR, "could not load summary at %s", subpath);
+#else
+			std::unique_ptr<llvm::ModuleSummaryIndex> subindex = std::move(llvm::getModuleSummaryIndex(ref).get());
+			if (!subindex)
+				elog(ERROR, "could not load summary at %s", subpath);
+			else
+				index->mergeFrom(std::move(subindex), 0);
+#endif
 		}
 	}
 
-- 
2.16.1

0004-Don-t-emit-bitcode-depending-on-an-LLVM-5-function.patchtext/x-patch; charset=UTF-8; name=0004-Don-t-emit-bitcode-depending-on-an-LLVM-5-function.patchDownload
From 4f0c2dc0dea6b3fb09b09451095f2225bde8458c Mon Sep 17 00:00:00 2001
From: Pierre <pierre.ducroquet@people-doc.com>
Date: Fri, 2 Feb 2018 10:34:09 +0100
Subject: [PATCH 4/8] Don't emit bitcode depending on an LLVM 5+ function

Signed-off-by: Pierre Ducroquet <pinaraf@pinaraf.info>
---
 src/backend/jit/llvm/llvmjit_expr.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/backend/jit/llvm/llvmjit_expr.c b/src/backend/jit/llvm/llvmjit_expr.c
index a06319b1b6..4b3c5367e5 100644
--- a/src/backend/jit/llvm/llvmjit_expr.c
+++ b/src/backend/jit/llvm/llvmjit_expr.c
@@ -170,7 +170,11 @@ get_LifetimeEnd(LLVMModuleRef mod)
 	LLVMTypeRef sig;
 	LLVMValueRef fn;
 	LLVMTypeRef param_types[2];
+#if LLVM_VERSION_MAJOR > 4
 	const char *nm = "llvm.lifetime.end.p0i8";
+#else
+	const char *nm = "llvm.lifetime.end";
+#endif
 
 	fn = LLVMGetNamedFunction(mod, nm);
 	if (fn)
-- 
2.16.1

0006-Ignore-LLVM-.bc-files.patchtext/x-patch; charset=UTF-8; name=0006-Ignore-LLVM-.bc-files.patchDownload
From 9f0993d739d1df43e792a9523d1da3b941d67472 Mon Sep 17 00:00:00 2001
From: Pierre Ducroquet <pinaraf@pinaraf.info>
Date: Wed, 7 Feb 2018 20:23:43 +0100
Subject: [PATCH 6/8] Ignore LLVM .bc files

Signed-off-by: Pierre Ducroquet <pinaraf@pinaraf.info>
---
 .gitignore | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.gitignore b/.gitignore
index a59e3da3be..794e35b73c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,7 @@
 # Global excludes across all subdirectories
 *.o
 *.obj
+*.bc
 *.so
 *.so.[0-9]
 *.so.[0-9].[0-9]
-- 
2.16.1

0005-Fix-warning.patchtext/x-patch; charset=UTF-8; name=0005-Fix-warning.patchDownload
From b6107de417e9654c7f78aa5945a7b78812dcfa96 Mon Sep 17 00:00:00 2001
From: Pierre Ducroquet <pinaraf@pinaraf.info>
Date: Wed, 7 Feb 2018 20:22:37 +0100
Subject: [PATCH 5/8] Fix warning

Signed-off-by: Pierre Ducroquet <pinaraf@pinaraf.info>
---
 src/backend/jit/llvm/llvmjit_error.cpp | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/backend/jit/llvm/llvmjit_error.cpp b/src/backend/jit/llvm/llvmjit_error.cpp
index 1c78bd956d..623a70a7cc 100644
--- a/src/backend/jit/llvm/llvmjit_error.cpp
+++ b/src/backend/jit/llvm/llvmjit_error.cpp
@@ -28,7 +28,9 @@ static int fatal_new_handler_depth = 0;
 static std::new_handler old_new_handler = NULL;
 
 static void fatal_system_new_handler(void);
+#if LLVM_VERSION_MAJOR > 4
 static void fatal_llvm_new_handler(void *user_data, const std::string& reason, bool gen_crash_diag);
+#endif
 static void fatal_llvm_error_handler(void *user_data, const std::string& reason, bool gen_crash_diag);
 
 
@@ -114,6 +116,7 @@ fatal_system_new_handler(void)
 			 errdetail("while in LLVM")));
 }
 
+#if LLVM_VERSION_MAJOR > 4
 static void
 fatal_llvm_new_handler(void *user_data,
 					   const std::string& reason,
@@ -124,6 +127,7 @@ fatal_llvm_new_handler(void *user_data,
 			 errmsg("out of memory"),
 			 errdetail("while in LLVM: %s", reason.c_str())));
 }
+#endif
 
 static void
 fatal_llvm_error_handler(void *user_data,
-- 
2.16.1

0007-Fix-building-with-LLVM-3.9.patchtext/x-patch; charset=UTF-8; name=0007-Fix-building-with-LLVM-3.9.patchDownload
From 9f60304697c559fd3cce7fc91ed81af7ea37b7e0 Mon Sep 17 00:00:00 2001
From: Pierre <pierre.ducroquet@people-doc.com>
Date: Fri, 2 Feb 2018 11:29:45 +0100
Subject: [PATCH 7/8] Fix building with LLVM 3.9

Signed-off-by: Pierre Ducroquet <pinaraf@pinaraf.info>
---
 src/backend/jit/llvm/llvmjit_inline.cpp | 23 +++++++++++++++++++++--
 1 file changed, 21 insertions(+), 2 deletions(-)

diff --git a/src/backend/jit/llvm/llvmjit_inline.cpp b/src/backend/jit/llvm/llvmjit_inline.cpp
index 4fa0e5ab64..8cfac20565 100644
--- a/src/backend/jit/llvm/llvmjit_inline.cpp
+++ b/src/backend/jit/llvm/llvmjit_inline.cpp
@@ -37,7 +37,12 @@ extern "C"
 #include <llvm/ADT/StringSet.h>
 #include <llvm/ADT/StringMap.h>
 #include <llvm/Analysis/ModuleSummaryAnalysis.h>
+#if LLVM_VERSION_MAJOR > 3
 #include <llvm/Bitcode/BitcodeReader.h>
+#else
+#include "llvm/Bitcode/ReaderWriter.h"
+#include "llvm/Support/Error.h"
+#endif
 #include <llvm/IR/CallSite.h>
 #include <llvm/IR/DebugInfo.h>
 #include <llvm/IR/IntrinsicInst.h>
@@ -100,7 +105,12 @@ llvm_inline(LLVMModuleRef M)
 	llvm_execute_inline_plan(mod, globalsToInline.get());
 }
 
-#if LLVM_VERSION_MAJOR < 5
+#if LLVM_VERSION_MAJOR < 4
+bool operator!(const llvm::ValueInfo &vi) {
+	return !(  (vi.Kind == llvm::ValueInfo::VI_GUID && vi.TheValue.Id)
+		|| (vi.Kind == llvm::ValueInfo::VI_Value && vi.TheValue.V));
+}
+#elif LLVM_VERSION_MAJOR < 5
 bool operator!(const llvm::ValueInfo &vi) {
 	return !(  (vi.Kind == llvm::ValueInfo::VI_GUID && vi.TheValue.Id)
 		|| (vi.Kind == llvm::ValueInfo::VI_Value && vi.TheValue.GV));
@@ -188,12 +198,15 @@ llvm_build_inline_plan(llvm::Module *mod)
 				 funcName.data(),
 				 modPath.data());
 
+// XXX Missing in LLVM < 4.0 ?
+#if LLVM_VERSION_MAJOR > 3
 			if (gvs->notEligibleToImport())
 			{
 				elog(DEBUG1, "uneligible to import %s due to summary",
 					 funcName.data());
 				continue;
 			}
+#endif
 
 			if ((int) fs->instCount() > threshold)
 			{
@@ -339,8 +352,10 @@ llvm_execute_inline_plan(llvm::Module *mod, ImportMapTy *globalsToInline)
 
 #if LLVM_VERSION_MAJOR > 4
 #define IRMOVE_PARAMS , /*IsPerformingImport=*/false
-#else
+#elif LLVM_VERSION_MAJOR > 3
 #define IRMOVE_PARAMS , /*LinkModuleInlineAsm=*/false, /*IsPerformingImport=*/false
+#else
+#define IRMOVE_PARAMS
 #endif
 		if (Mover.move(std::move(importMod), GlobalsToImport.getArrayRef(),
 					   [](llvm::GlobalValue &, llvm::IRMover::ValueAdder) {}
@@ -648,7 +663,11 @@ llvm_load_index(void)
 			if (e)
 				elog(ERROR, "could not load summary at %s", subpath);
 #else
+#if LLVM_VERSION_MAJOR > 3
 			std::unique_ptr<llvm::ModuleSummaryIndex> subindex = std::move(llvm::getModuleSummaryIndex(ref).get());
+#else
+			std::unique_ptr<llvm::ModuleSummaryIndex> subindex = std::move(llvm::getModuleSummaryIndex(ref, [](const llvm::DiagnosticInfo &) {}).get());
+#endif
 			if (!subindex)
 				elog(ERROR, "could not load summary at %s", subpath);
 			else
-- 
2.16.1

0008-Fix-segfault-with-LLVM-3.9.patchtext/x-patch; charset=UTF-8; name=0008-Fix-segfault-with-LLVM-3.9.patchDownload
From 504c311fc18ce2ef04e22144a21fd3af13b1ab04 Mon Sep 17 00:00:00 2001
From: Pierre <pierre.ducroquet@people-doc.com>
Date: Fri, 2 Feb 2018 11:29:57 +0100
Subject: [PATCH 8/8] Fix segfault with LLVM 3.9

Signed-off-by: Pierre Ducroquet <pinaraf@pinaraf.info>
---
 src/backend/jit/llvm/llvmjit.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/backend/jit/llvm/llvmjit.c b/src/backend/jit/llvm/llvmjit.c
index 7557dc9a19..b99408b468 100644
--- a/src/backend/jit/llvm/llvmjit.c
+++ b/src/backend/jit/llvm/llvmjit.c
@@ -455,12 +455,12 @@ llvm_session_initialize(void)
 
 	cpu = LLVMGetHostCPUName();
 	llvm_opt0_targetmachine =
-		LLVMCreateTargetMachine(llvm_targetref, llvm_triple, cpu, NULL,
+		LLVMCreateTargetMachine(llvm_targetref, llvm_triple, cpu, "",
 								LLVMCodeGenLevelNone,
 								LLVMRelocDefault,
 								LLVMCodeModelJITDefault);
 	llvm_opt3_targetmachine =
-		LLVMCreateTargetMachine(llvm_targetref, llvm_triple, cpu, NULL,
+		LLVMCreateTargetMachine(llvm_targetref, llvm_triple, cpu, "",
 								LLVMCodeGenLevelAggressive,
 								LLVMRelocDefault,
 								LLVMCodeModelJITDefault);
-- 
2.16.1

#136Andres Freund
andres@anarazel.de
In reply to: Pierre Ducroquet (#135)
Re: JIT compiling with LLVM v10.1

Hi,

On 2018-02-14 23:32:17 +0100, Pierre Ducroquet wrote:

Here are the LLVM4 and LLVM3.9 compatibility patches.
Successfully built, and executed some silly queries with JIT forced to make
sure it worked.

Thanks!

I'm going to integrate them into my series in the next few days.

Regards,

Andres

#137Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Andres Freund (#134)
Re: JIT compiling with LLVM v10.1

On 14.02.2018 21:17, Andres Freund wrote:

Hi,

On 2018-02-07 06:54:05 -0800, Andres Freund wrote:

I've pushed v10.0. The big (and pretty painful to make) change is that
now all the LLVM specific code lives in src/backend/jit/llvm, which is
built as a shared library which is loaded on demand.

The layout is now as follows:

src/backend/jit/jit.c:
Part of JITing always linked into the server. Supports loading the
LLVM using JIT library.

src/backend/jit/llvm/
Infrastructure:
llvmjit.c:
General code generation and optimization infrastructure
llvmjit_error.cpp, llvmjit_wrap.cpp:
Error / backward compat wrappers
llvmjit_inline.cpp:
Cross module inlining support
Code-Gen:
llvmjit_expr.c
Expression compilation
llvmjit_deform.c
Deform compilation

I've pushed a revised version that hopefully should address Jeff's
wish/need of being able to experiment with this out of core. There's now
a "jit_provider" PGC_POSTMASTER GUC that's by default set to
"llvmjit". llvmjit.so is the .so implementing JIT using LLVM. It fills a
set of callbacks via
extern void _PG_jit_provider_init(JitProviderCallbacks *cb);
which can also be implemented by any other potential provider.

The other two biggest changes are that I've added a README
https://git.postgresql.org/gitweb/?p=users/andresfreund/postgres.git;a=blob;f=src/backend/jit/README;hb=jit
and that I've revised the configure support so it does more error
checks, and moved it into config/llvm.m4.

There's a larger smattering of small changes too.

I'm pretty happy with how the separation of core / shlib looks now. I'm
planning to work on cleaning and then pushing some of the preliminary
patches (fixed tupledesc, grouping) over the next few days.

Greetings,

Andres Freund

I have made  some more experiments with efficiency of JIT-ing of deform
tuple and I want to share this results (I hope that them will be
interesting).
It is well known fact that Postgres spends most of the time in sequence
scan queries for warm data in deforming tuples (17% in case of TPC-H Q1).
Postgres  tries to optimize access to the tuple by caching fixed size
offsets to the fields whenever possible and loading attributes on demand.
It is also well know recommendation to put fixed size, non-null,
frequently used attributes at the beginning of table's attribute list to
make this optimization work more efficiently.
You can see in the code of heap_deform_tuple shows that first NULL value
will switch it to "slow" mode:

for (attnum = 0; attnum < natts; attnum++)
    {
        Form_pg_attribute thisatt = TupleDescAttr(tupleDesc, attnum);

        if (hasnulls && att_isnull(attnum, bp))
        {
            values[attnum] = (Datum) 0;
            isnull[attnum] = true;
            slow = true;        /* can't use attcacheoff anymore */
            continue;
        }

I tried to investigate importance of this optimization and what is
actual penalty of "slow" mode.
At the same time I want to understand how JIT help to speed-up tuple
deforming.

I have populated with data three tables:

create table t1(id integer primary key,c1 integer,c2 integer,c3
integer,c4 integer,c5 integer,c6 integer,c7 integer,c8 integer,c9 integer);
create table t2(id integer primary key,c1 integer,c2 integer,c3
integer,c4 integer,c5 integer,c6 integer,c7 integer,c8 integer,c9 integer);
create table t3(id integer primary key,c1 integer not null,c2 integer
not null,c3 integer not null,c4 integer not null,c5 integer not null,c6
integer not null,c7 integer not null,c8 integer not null,c9 integer not
null);
insert into t1 (id,c1,c2,c3,c4,c5,c6,c7,c8) values
(generate_series(1,10000000),0,0,0,0,0,0,0,0);
insert into t2 (id,c2,c3,c4,c5,c6,c7,c8,c9) values
(generate_series(1,10000000),0,0,0,0,0,0,0,0);
insert into t3 (id,c1,c2,c3,c4,c5,c6,c7,c8,c9) values
(generate_series(1,10000000),0,0,0,0,0,0,0,0,0);
vacuum analyze t1;
vacuum analyze t2;
vacuum analyze t3;

t1 contains null in last c9 column, t2 - in first c1 columns and t3 has
all attributes declared as not-null (and JIT can use this knowledge to
generate more efficient deforming code).
All data set is hold in memory (shared buffer size is greater than
database size) and I intentionally switch off parallel execution to make
results more deterministic.
I run two queries calculating aggregates on one/all not-null fields:

select sum(c8) from t*;
select sum(c2), sum(c3), sum(c4), sum(c5), sum(c6), sum(c7), sum(c8)
from t*;

As expected 35% time was spent in heap_deform_tuple.
But results (msec) were slightly confusing and unexected:

select sum(c8) from t*;

w/o JIT
with JIT
t1 763
563
t2 772
570
t3
776
592

select sum(c2), sum(c3), sum(c4), sum(c5), sum(c6), sum(c7), sum(c8)
from t*;

w/o JIT
with JIT
t1 1239 742
t2 1233 747
t3
1255 803

I repeat each query 10 times and take the minimal time ( I think that it
is more meaningful than average time which depends on some other
activity on the system).
So there is no big difference between "slow" and "fast" ways of
deforming tuple.
Moreover, for sometimes "slow" case is faster. Although I have to say
thatvariance of results is quite large: about 10%.
But in any case, I can made two conclusions from this results:

1. Modern platforms are mostly limited by memory access time, number of
performed instructions is less critical.
This is why extra processing needed for nullable attributes can not
significantly affect performance.
2. For large number of attributes JIT-ing of deform tuple can improve
speed up to two time. Which is quite good result from my point of view.

--

Konstantin Knizhnik
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

#138Andreas Karlsson
andreas@proxel.se
In reply to: Pierre Ducroquet (#116)
Re: JIT compiling with LLVM v9.1

On 02/05/2018 10:44 PM, Pierre Ducroquet wrote:

psqlscanslash.l: In function ‘psql_scan_slash_option’:
psqlscanslash.l:550:8: warning: variable ‘lexresult’ set but not used
[-Wunused-but-set-variable]
int final_state;
^~~~~~~~~

I'm not sure Andres's patches have anything to do with psql, it's surprising.

I managed to track down the bug and apparently when building with
--with-llvm the -DNDEBUG option is added to CPPFLAGS, but I am not
entirely sure what the code in config/llvm.m4 is trying to do in the
first place.

The two issues I see with what the code does are:

1) Why does config/llvm.m4 modify CPPFLAGS? That affects the building of
the binaries too which may be done with gcc like in my case. Shouldn't
it use a LLVM_CPPFLAGS or something?

2) When I build with --with-cassert I expect the assertions to be there,
both in the binaries and the bitcode. Is that just a bug or is there any
thought behind this?

Below is the diff in src/Makefile.global between when I run configure
with --with-llvm or not.

diff src/Makefile.global-nollvm  src/Makefile.global-llvm
78c78
< configure_args =  '--prefix=/home/andreas/dev/postgresql-inst' 
'--enable-tap-tests' '--enable-cassert' '--enable-debug'
---

configure_args = '--prefix=/home/andreas/dev/postgresql-inst'

'--enable-tap-tests' '--enable-cassert' '--enable-debug' '--with-llvm'
190c190
< with_llvm = no
---

with_llvm = yes

227,229c227,229
< LLVM_CONFIG =
< LLVM_BINPATH =
< CLANG =
---

LLVM_CONFIG = /usr/bin/llvm-config
LLVM_BINPATH = /usr/lib/llvm-4.0/bin
CLANG = /usr/bin/clang

238c238
< CPPFLAGS = -D_GNU_SOURCE
---

CPPFLAGS = -D__STDC_LIMIT_MACROS -D__STDC_FORMAT_MACROS

-D__STDC_CONSTANT_MACROS -D_GNU_SOURCE -DNDEBUG
-I/usr/lib/llvm-4.0/include -D_GNU_SOURCE
261c261
< LLVM_CXXFLAGS =
---

LLVM_CXXFLAGS = -std=c++0x -std=c++11 -fno-exceptions

283c283
< LLVM_LIBS=
---

LLVM_LIBS= -lLLVM-4.0

297c297
< LDFLAGS += -Wl,--as-needed
---

Show quoted text

LDFLAGS += -L/usr/lib/llvm-4.0/lib -Wl,--as-needed

#139Andres Freund
andres@anarazel.de
In reply to: Andreas Karlsson (#138)
Re: JIT compiling with LLVM v9.1

Hi,

On 2018-02-15 12:54:34 +0100, Andreas Karlsson wrote:

1) Why does config/llvm.m4 modify CPPFLAGS? That affects the building of the
binaries too which may be done with gcc like in my case. Shouldn't it use a
LLVM_CPPFLAGS or something?

Well, most of the time cppflags just are things like additional include
directories. And the established precedent is to just add those to the
global cppflags (c.f. libxml stuff in configure in). I've no problem
changing this, I just followed established practice.

2) When I build with --with-cassert I expect the assertions to be there,
both in the binaries and the bitcode. Is that just a bug or is there any
thought behind this?

Not sure what you mean by that. NDEBUG and cassert are independent
mechanisms, no?

Greetings,

Andres Freund

#140Andres Freund
andres@anarazel.de
In reply to: Konstantin Knizhnik (#137)
Re: JIT compiling with LLVM v10.1

Hi,

On 2018-02-15 11:59:46 +0300, Konstantin Knizhnik wrote:

It is well known fact that Postgres spends most of the time in sequence scan
queries for warm data in deforming tuples (17% in case of TPC-H Q1).

I think that the majority of the time therein is not actually
bottlenecked by CPU, but by cache misses. It might be worthwhile to
repeat your analysis with the last patch of my series applied, and the
#define FASTORDER
uncommented.

Postgres� tries to optimize access to the tuple by caching fixed size
offsets to the fields whenever possible and loading attributes on demand.
It is also well know recommendation to put fixed size, non-null, frequently
used attributes at the beginning of table's attribute list to make this
optimization work more efficiently.

FWIW, I think this optimization causes vastly more trouble than it's
worth.

You can see in the code of heap_deform_tuple shows that first NULL value
will switch it to "slow" mode:

Note that in most workloads the relevant codepath isn't
heap_deform_tuple but slot_deform_tuple.

1. Modern platforms are mostly limited by memory access time, number of
performed instructions is less critical.

I don't think this is quite the correct result. Especially because a lot
of time is spent accessing memory, having code that the CPU can execute
out-of-order (by speculatively executing forward) is hugely
beneficial. Some of the benefit of JITing comes from being able to
start deforming the next field while memory fetches for the previous one
are still ongoing (iff dealing with fixed width cols).

2. For large number of attributes JIT-ing of deform tuple can improve speed
up to two time. Which is quite good result from my point of view.

+1

Note the last version has a small deficiency in decoding varlena datums
that I need to fix (varsize_any isn't inlined anymore).

Greetings,

Andres Freund

#141Andreas Karlsson
andreas@proxel.se
In reply to: Andres Freund (#139)
Re: JIT compiling with LLVM v9.1

On 02/15/2018 06:23 PM, Andres Freund wrote:

2) When I build with --with-cassert I expect the assertions to be there,
both in the binaries and the bitcode. Is that just a bug or is there any
thought behind this?

Not sure what you mean by that. NDEBUG and cassert are independent
mechanisms, no?

Yeah, I think I just managed to confuse myself there.

The actual issue is that --with-llvm changes if NDEBUG is set or not,
which is quite surprising. I would not expect assertions to be disabled
in the fronted code just because I compiled PostgreSQL with llvm.

Andreas

#142Jesper Pedersen
jesper.pedersen@redhat.com
In reply to: Andres Freund (#134)
Re: JIT compiling with LLVM v10.1

Hi,

On 02/14/2018 01:17 PM, Andres Freund wrote:

On 2018-02-07 06:54:05 -0800, Andres Freund wrote:

I've pushed v10.0. The big (and pretty painful to make) change is that
now all the LLVM specific code lives in src/backend/jit/llvm, which is
built as a shared library which is loaded on demand.

I thought

https://db.in.tum.de/~leis/papers/adaptiveexecution.pdf?lang=en

was relevant for this thread.

Best regards,
Jesper

#143Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#1)
JIT compiling with LLVM v11

Hi,

I've pushed a revised version of my JIT patchset.
The git tree is at
https://git.postgresql.org/git/users/andresfreund/postgres.git
in the jit branch
https://git.postgresql.org/gitweb/?p=users/andresfreund/postgres.git;a=shortlog;h=refs/heads/jit

Biggest changes:
- LLVM 3.9 - master are now supported. This includes a good chunk of
work by Pierre Ducroquet.

Doing so I found that the patches Pierre provided didn't work when a
query was expensive enough to warrant inlining. Turns out LLVM < 5
can't combine the summaries of multiple thin module summaries.

But that actually turned out to be a good thing, because it made me
think about symbol resolution preferences. Previously it was basically
arbitrary whether a function with conflicting names would be choosen
from core postgres or one of the extension libs providing it.

This is now rewritten so we don't build a combined module summary for
core postgres and extensions at backend start. Instead summaries for
core pg and extensions are loaded separately, and the correct one for
a symbol is used.

- Functions in extension libraries are now not referred to with their C
symbol in LLVM IR, instead we generate a fictious symbol that includes
the library path. E.g. hstore's hstore_from_record is now referenced as
@"pgextern.$libdir/hstore.hstore_from_record".

Both symbol resolution and inlining knows how to properly resolve
those.

- As hinted to above, the inlining support has evolved
considerably. Instead of a combined index built at backend start we
now have individual indexes for each extension / shlib. Symbols are
searched with a search path (internal functions just in the 'postgres'
index, for extensions it's main 'postgres', 'extension'), and symbols
that explicitly reference a function are just looked up within that
extension.

This has the nice advantage that we don't have to process indexes for
extensions that aren't used, which in turn means that extensions can
be installed on the system level while a backend is running, and
JITing will work even for old backends once the extension is created
(or rather functions in it).

Additionally the inline costing logic has improved, the super verbose
logging is #ifdef'ed out ('ilog' wrapper that's just (void) 0).

- The installation of bitcode is now a nice separate make function. pgxs
(including contrib's kinda use of pgxs) now automatically generate &
install bitcode when the server was compiled --with-llvm.

I learned some about make I didn't know ;).

- bunch of compilation issues (older clang, -D_NDEBUG from llvm-config
being used for all of postgres, ...) have been fixed.

- Two bigger prerequisite patches have been merged.

- lotsa smaller stuff.

Regards,

Andres

#144Peter Eisentraut
peter.eisentraut@2ndquadrant.com
In reply to: Andres Freund (#143)
Re: JIT compiling with LLVM v11

On 3/1/18 03:02, Andres Freund wrote:

I've pushed a revised version of my JIT patchset.
The git tree is at
https://git.postgresql.org/git/users/andresfreund/postgres.git
in the jit branch
https://git.postgresql.org/gitweb/?p=users/andresfreund/postgres.git;a=shortlog;h=refs/heads/jit

(testing 2e15e8b8100a61ec092a1e5b2db4a93f07a64cbd)

I'm having an interesting time getting this to build on macOS.

First, you need to use a CXX that is reasonably similar to the CC.
Otherwise, the CXX will complain about things like attributes not
being supported etc. That's not surprising, but it's a support issue
that we'll have to prepare ourselves for.

Using my standard set of CC=gcc-7 and CXX=g++-7, the build fails with

g++-7: error: unrecognized command line option '-stdlib=libc++'

That comes from llvm-config --cxxflags, which was apparently made for
/usr/bin/cc (which is clang).

I see here the same problems as we had in the olden days with Perl,
where it gave us a bunch of compiler flags that applied to the system
compiler but not the compiler currently in use. We should just take the
flags that we really need, like -I and -L. Maybe we don't need it at all.

Trying it again then with CC=/usr/bin/cc and CXX=/usr/bin/c++, it
fails with

In file included from llvmjit_inline.cpp:25:
In file included from ../../../../src/include/jit/llvmjit.h:16:
In file included from
/usr/local/Cellar/llvm/5.0.1/include/llvm-c/Types.h:17:
In file included from
/usr/local/Cellar/llvm/5.0.1/include/llvm/Support/DataTypes.h:33:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/cmath:555:1:
error: templates must have C++ linkage

Using this patch gets it past that:

diff --git a/src/backend/jit/llvm/llvmjit_inline.cpp
b/src/backend/jit/llvm/llvmjit_inline.cpp
index d4204d2cd2..ad87cfd2d9 100644
--- a/src/backend/jit/llvm/llvmjit_inline.cpp
+++ b/src/backend/jit/llvm/llvmjit_inline.cpp
@@ -22,7 +22,6 @@
 extern "C"
 {
 #include "postgres.h"
-#include "jit/llvmjit.h"

#include <fcntl.h>
#include <sys/mman.h>
@@ -35,6 +34,8 @@ extern "C"
#include "storage/fd.h"
}

+#include "jit/llvmjit.h"
+
 #include <llvm-c/Core.h>
 #include <llvm-c/BitReader.h>

It seems that it was intended that way anyway, since llvmjit.h contains
its own provisions for extern C.

Then, I'm getting this error:

/usr/bin/cc -Wall -Wmissing-prototypes -Wpointer-arith
-Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute
-Wformat-security -fno-strict-aliasing -fwrapv
-Wno-unused-command-line-argument -g -O2 -Wno-deprecated-declarations
-Werror -bundle -multiply_defined suppress -o llvmjit.so llvmjit.o
llvmjit_error.o llvmjit_inline.o llvmjit_wrap.o llvmjit_expr.o
llvmjit_deform.o -L../../../../src/port -L../../../../src/common
-L/usr/local/lib -L/usr/local/opt/openssl/lib
-L/usr/local/opt/readline/lib -L/usr/local/Cellar/libxml2/2.9.7/lib
-L/usr/local/Cellar/llvm/5.0.1/lib -L/usr/local/lib
-L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib
-Wl,-dead_strip_dylibs -Werror -lLLVMPasses -lLLVMipo
-lLLVMInstrumentation -lLLVMVectorize -lLLVMLinker -lLLVMIRReader
-lLLVMAsmParser -lLLVMOrcJIT -lLLVMX86Disassembler -lLLVMX86AsmParser
-lLLVMX86CodeGen -lLLVMGlobalISel -lLLVMSelectionDAG -lLLVMAsmPrinter
-lLLVMDebugInfoCodeView -lLLVMDebugInfoMSF -lLLVMCodeGen
-lLLVMScalarOpts -lLLVMInstCombine -lLLVMTransformUtils -lLLVMBitWriter
-lLLVMX86Desc -lLLVMMCDisassembler -lLLVMX86Info -lLLVMX86AsmPrinter
-lLLVMX86Utils -lLLVMMCJIT -lLLVMExecutionEngine -lLLVMTarget
-lLLVMAnalysis -lLLVMProfileData -lLLVMRuntimeDyld -lLLVMDebugInfoDWARF
-lLLVMObject -lLLVMMCParser -lLLVMMC -lLLVMBitReader -lLLVMCore
-lLLVMBinaryFormat -lLLVMSupport -lLLVMDemangle -lcurses -lz -lm
-bundle_loader ../../../../src/backend/postgres
Undefined symbols for architecture x86_64:
"std::__1::error_code::message() const", referenced from:
_LLVMPrintModuleToFile in libLLVMCore.a(Core.cpp.o)
_LLVMCreateMemoryBufferWithContentsOfFile in libLLVMCore.a(Core.cpp.o)
_LLVMCreateMemoryBufferWithSTDIN in libLLVMCore.a(Core.cpp.o)
_LLVMTargetMachineEmitToFile in libLLVMTarget.a(TargetMachineC.cpp.o)
llvm::errorToErrorCode(llvm::Error) in libLLVMSupport.a(Error.cpp.o)
llvm::ECError::log(llvm::raw_ostream&) const in
libLLVMSupport.a(Error.cpp.o)

llvm::SectionMemoryManager::finalizeMemory(std::__1::basic_string<char,
std::__1::char_traits<char>, std::__1::allocator<char> >*) in
libLLVMExecutionEngine.a(SectionMemoryManager.cpp.o)
[snipped about 900 lines]

It seems the problem here is linking C++ with the C compiler. If I
hack in to use c++ in the above command, it continues, and the build
completes.

configure didn't find any of the LLVMOrc* symbols it was looking for.
Is that a problem? They seem to be for some debugging support.

So, how do I turn this on then? I see a bunch of new GUC settings
that are all off by default. Which ones turn the feature(s) on?

--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#145Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#144)
Re: JIT compiling with LLVM v11

Hi,

On 2018-03-02 19:13:01 -0500, Peter Eisentraut wrote:

On 3/1/18 03:02, Andres Freund wrote:

I've pushed a revised version of my JIT patchset.
The git tree is at
https://git.postgresql.org/git/users/andresfreund/postgres.git
in the jit branch
https://git.postgresql.org/gitweb/?p=users/andresfreund/postgres.git;a=shortlog;h=refs/heads/jit

(testing 2e15e8b8100a61ec092a1e5b2db4a93f07a64cbd)

I'm having an interesting time getting this to build on macOS.

Sorry for that...

First, you need to use a CXX that is reasonably similar to the CC.
Otherwise, the CXX will complain about things like attributes not
being supported etc. That's not surprising, but it's a support issue
that we'll have to prepare ourselves for.

Right.

Using my standard set of CC=gcc-7 and CXX=g++-7, the build fails with

g++-7: error: unrecognized command line option '-stdlib=libc++'

That comes from llvm-config --cxxflags, which was apparently made for
/usr/bin/cc (which is clang).

I see here the same problems as we had in the olden days with Perl,
where it gave us a bunch of compiler flags that applied to the system
compiler but not the compiler currently in use. We should just take the
flags that we really need, like -I and -L. Maybe we don't need it at all.

It's actually already filtered, I just added -std*, because of selecting
the c++ standard, I guess I need to filter more aggressively. This is
fairly fairly annoying.

Using this patch gets it past that:

diff --git a/src/backend/jit/llvm/llvmjit_inline.cpp
b/src/backend/jit/llvm/llvmjit_inline.cpp
index d4204d2cd2..ad87cfd2d9 100644
--- a/src/backend/jit/llvm/llvmjit_inline.cpp
+++ b/src/backend/jit/llvm/llvmjit_inline.cpp
@@ -22,7 +22,6 @@
extern "C"
{
#include "postgres.h"
-#include "jit/llvmjit.h"

#include <fcntl.h>
#include <sys/mman.h>
@@ -35,6 +34,8 @@ extern "C"
#include "storage/fd.h"
}

+#include "jit/llvmjit.h"
+
#include <llvm-c/Core.h>
#include <llvm-c/BitReader.h>

It seems that it was intended that way anyway, since llvmjit.h contains
its own provisions for extern C.

Hrmpf, yea, I broke that the third time now. I'm actually inclined to
add an appropriate #ifdef ... #error so it's not repeated, what do you
think?

Then, I'm getting this error:

It seems the problem here is linking C++ with the C compiler. If I
hack in to use c++ in the above command, it continues, and the build
completes.

Yea, I was afraid of that, even if I didn't see it locally.
Unfortunately Makefile.shlib has a bunch of references both to
$(COMPILER) and $(CC). Most of the relevant platforms (using llvmjit on
hpux seems like and edge case somebody desiring it can fix) use
$(COMPILER).

Does putting an
override COMPILER = $(CXX) $(CFLAGS)

into src/backend/jit/llvm/Makefile work? It does force the use of CXX
for all important platforms if I see it correctly. Verified that it
works on linux.

configure didn't find any of the LLVMOrc* symbols it was looking for.
Is that a problem? They seem to be for some debugging support.

That's not a problem, except that the symbols won't be registered with
the debugger, which is a bit annoying for backtraces. I tried to have
configure throw errors in cases llvm is too old or such.

So, how do I turn this on then? I see a bunch of new GUC settings
that are all off by default. Which ones turn the feature(s) on?

Hm, I'll switch them on in the development branch. Independent of the
final decision that's definitely the right thing for now. The "full
capability" of the patchset is used if you turn on these three GUCs:

-c jit_expressions=1
-c jit_tuple_deforming=1
-c jit_perform_inlining=1

If you set -c log_min_messages=debug one and run a query you'd see
something like:
2018-03-02 16:27:19.717 PST [11077][3/8] DEBUG: time to inline: 0.087s
2018-03-02 16:27:19.724 PST [11077][3/8] DEBUG: time to opt: 0.007s
2018-03-02 16:27:19.750 PST [11077][3/8] DEBUG: time to emit: 0.027s

I think I should just remove jit_tuple_deforming=1,
jit_perform_inlining=1, they're better done via the cost settings (-1
disables). I think having -c jit_expressions is helpful leaving the
cost settings aside, because it allows to enable/disable jitting
wholesale without changing cost settings, which seems good.

Greetings,

Andres Freund

#146Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#145)
Re: JIT compiling with LLVM v11

On 2018-03-02 16:29:54 -0800, Andres Freund wrote:

#include <llvm-c/Core.h>
#include <llvm-c/BitReader.h>

It seems that it was intended that way anyway, since llvmjit.h contains
its own provisions for extern C.

Hrmpf, yea, I broke that the third time now. I'm actually inclined to
add an appropriate #ifdef ... #error so it's not repeated, what do you
think?

Hm, don't think that's easily possible :(

- Andres

#147Peter Eisentraut
peter.eisentraut@2ndquadrant.com
In reply to: Andres Freund (#145)
1 attachment(s)
Re: JIT compiling with LLVM v11

On 3/2/18 19:29, Andres Freund wrote:

Using my standard set of CC=gcc-7 and CXX=g++-7, the build fails with

g++-7: error: unrecognized command line option '-stdlib=libc++'

It's actually already filtered, I just added -std*, because of selecting
the c++ standard, I guess I need to filter more aggressively. This is
fairly fairly annoying.

I see you already filter llvm-config --cflags by picking only -I and -D.
Why not do the same for --cxxflags? Any other options that we need
like -f* should be discovered using the normal
does-the-compiler-support-this-option tests.

It seems that it was intended that way anyway, since llvmjit.h contains
its own provisions for extern C.

Hrmpf, yea, I broke that the third time now. I'm actually inclined to
add an appropriate #ifdef ... #error so it's not repeated, what do you
think?

Not sure. Why not just move the line and not move it again? ;-)

Does putting an
override COMPILER = $(CXX) $(CFLAGS)

into src/backend/jit/llvm/Makefile work? It does force the use of CXX
for all important platforms if I see it correctly. Verified that it
works on linux.

Your latest HEAD builds out of the box for me now using the system compiler.

configure didn't find any of the LLVMOrc* symbols it was looking for.
Is that a problem? They seem to be for some debugging support.

That's not a problem, except that the symbols won't be registered with
the debugger, which is a bit annoying for backtraces. I tried to have
configure throw errors in cases llvm is too old or such.

Where does one get those then? I have LLVM 5.0.1. Is there something
even newer?

Hm, I'll switch them on in the development branch. Independent of the
final decision that's definitely the right thing for now. The "full
capability" of the patchset is used if you turn on these three GUCs:

-c jit_expressions=1
-c jit_tuple_deforming=1
-c jit_perform_inlining=1

The last one doesn't seem to exist anymore.

If I turn on either of the first two, then make installcheck fails. See
attached diff.

--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Attachments:

regression.diffstext/plain; charset=UTF-8; name=regression.diffs; x-mac-creator=0; x-mac-type=0Download
--- src/test/regress/expected/boolean.out	2018-03-02 18:38:36.000000000 -0500
+++ src/test/regress/results/boolean.out	2018-03-03 09:18:15.000000000 -0500
@@ -295,41 +295,11 @@
 SELECT '' AS tf_12, BOOLTBL1.*, BOOLTBL2.*
    FROM BOOLTBL1, BOOLTBL2
    WHERE BOOLTBL2.f1 <> BOOLTBL1.f1;
- tf_12 | f1 | f1 
--------+----+----
-       | t  | f
-       | t  | f
-       | t  | f
-       | t  | f
-       | t  | f
-       | t  | f
-       | t  | f
-       | t  | f
-       | t  | f
-       | t  | f
-       | t  | f
-       | t  | f
-(12 rows)
-
+ERROR:  failed to JIT: evalexpr.0.3
 SELECT '' AS tf_12, BOOLTBL1.*, BOOLTBL2.*
    FROM BOOLTBL1, BOOLTBL2
    WHERE boolne(BOOLTBL2.f1,BOOLTBL1.f1);
- tf_12 | f1 | f1 
--------+----+----
-       | t  | f
-       | t  | f
-       | t  | f
-       | t  | f
-       | t  | f
-       | t  | f
-       | t  | f
-       | t  | f
-       | t  | f
-       | t  | f
-       | t  | f
-       | t  | f
-(12 rows)
-
+ERROR:  failed to JIT: evalexpr.1.3
 SELECT '' AS ff_4, BOOLTBL1.*, BOOLTBL2.*
    FROM BOOLTBL1, BOOLTBL2
    WHERE BOOLTBL2.f1 = BOOLTBL1.f1 and BOOLTBL1.f1 = bool 'false';
@@ -345,26 +315,7 @@
    FROM BOOLTBL1, BOOLTBL2
    WHERE BOOLTBL2.f1 = BOOLTBL1.f1 or BOOLTBL1.f1 = bool 'true'
    ORDER BY BOOLTBL1.f1, BOOLTBL2.f1;
- tf_12_ff_4 | f1 | f1 
-------------+----+----
-            | f  | f
-            | f  | f
-            | f  | f
-            | f  | f
-            | t  | f
-            | t  | f
-            | t  | f
-            | t  | f
-            | t  | f
-            | t  | f
-            | t  | f
-            | t  | f
-            | t  | f
-            | t  | f
-            | t  | f
-            | t  | f
-(16 rows)
-
+ERROR:  failed to JIT: evalexpr.2.3
 --
 -- SQL syntax
 -- Try all combinations to ensure that we get nothing when we expect nothing

======================================================================

--- src/test/regress/expected/bit.out	2018-03-02 18:38:36.000000000 -0500
+++ src/test/regress/results/bit.out	2018-03-03 09:18:16.000000000 -0500
@@ -44,22 +44,7 @@
 SELECT v, b, (v || b) AS concat
        FROM BIT_TABLE, VARBIT_TABLE
        ORDER BY 3;
-      v      |      b      |         concat         
--------------+-------------+------------------------
-             | 00000000000 | 00000000000
- 0           | 00000000000 | 000000000000
- 0           | 01010101010 | 001010101010
- 010101      | 00000000000 | 01010100000000000
-             | 01010101010 | 01010101010
- 01010101010 | 00000000000 | 0101010101000000000000
- 01010101010 | 01010101010 | 0101010101001010101010
- 010101      | 01010101010 | 01010101010101010
- 01010101010 | 11011000000 | 0101010101011011000000
- 010101      | 11011000000 | 01010111011000000
- 0           | 11011000000 | 011011000000
-             | 11011000000 | 11011000000
-(12 rows)
-
+ERROR:  failed to JIT: evalexpr.0.0
 -- Length
 SELECT b, length(b) AS lb
        FROM BIT_TABLE;

======================================================================

--- src/test/regress/expected/rangetypes.out	2018-03-02 18:38:36.000000000 -0500
+++ src/test/regress/results/rangetypes.out	2018-03-03 09:18:17.000000000 -0500
@@ -1359,11 +1359,7 @@
 create type cashrange as range (subtype = money);
 set enable_sort = off;  -- try to make it pick a hash setop implementation
 select '(2,5)'::cashrange except select '(5,6)'::cashrange;
-   cashrange   
----------------
- ($2.00,$5.00)
-(1 row)
-
+ERROR:  failed to JIT: evalexpr.0.0
 reset enable_sort;
 --
 -- OUT/INOUT/TABLE functions

======================================================================

--- src/test/regress/expected/numerology.out	2018-03-02 18:38:36.000000000 -0500
+++ src/test/regress/results/numerology.out	2018-03-03 09:18:17.000000000 -0500
@@ -76,25 +76,24 @@
 INSERT INTO TEMP_GROUP
   SELECT 1, (- i.f1), (- f.f1)
   FROM INT4_TBL i, FLOAT8_TBL f;
+ERROR:  failed to JIT: evalexpr.0.0
 INSERT INTO TEMP_GROUP
   SELECT 2, i.f1, f.f1
   FROM INT4_TBL i, FLOAT8_TBL f;
 SELECT DISTINCT f1 AS two FROM TEMP_GROUP ORDER BY 1;
  two 
 -----
-   1
    2
-(2 rows)
+(1 row)
 
 SELECT f1 AS two, max(f3) AS max_float, min(f3) as min_float
   FROM TEMP_GROUP
   GROUP BY f1
   ORDER BY two, max_float, min_float;
- two |      max_float       |       min_float       
------+----------------------+-----------------------
-   1 | 1.2345678901234e+200 |                    -0
-   2 |                    0 | -1.2345678901234e+200
-(2 rows)
+ two | max_float |       min_float       
+-----+-----------+-----------------------
+   2 |         0 | -1.2345678901234e+200
+(1 row)
 
 -- GROUP BY a result column name is not legal per SQL92, but we accept it
 -- anyway (if the name is not the name of any column exposed by FROM).
@@ -102,21 +101,19 @@
   FROM TEMP_GROUP
   GROUP BY two
   ORDER BY two, max_float, min_float;
- two |      max_float       |       min_float       
------+----------------------+-----------------------
-   1 | 1.2345678901234e+200 |                    -0
-   2 |                    0 | -1.2345678901234e+200
-(2 rows)
+ two | max_float |       min_float       
+-----+-----------+-----------------------
+   2 |         0 | -1.2345678901234e+200
+(1 row)
 
 SELECT f1 AS two, (max(f3) + 1) AS max_plus_1, (min(f3) - 1) AS min_minus_1
   FROM TEMP_GROUP
   GROUP BY f1
   ORDER BY two, min_minus_1;
- two |      max_plus_1      |      min_minus_1      
------+----------------------+-----------------------
-   1 | 1.2345678901234e+200 |                    -1
-   2 |                    1 | -1.2345678901234e+200
-(2 rows)
+ two | max_plus_1 |      min_minus_1      
+-----+------------+-----------------------
+   2 |          1 | -1.2345678901234e+200
+(1 row)
 
 SELECT f1 AS two,
        max(f2) + min(f2) AS max_plus_min,
@@ -126,9 +123,8 @@
   ORDER BY two, min_minus_1;
  two | max_plus_min |      min_minus_1      
 -----+--------------+-----------------------
-   1 |            0 |                    -1
    2 |            0 | -1.2345678901234e+200
-(2 rows)
+(1 row)
 
 DROP TABLE TEMP_INT2;
 DROP TABLE TEMP_INT4;

======================================================================

--- src/test/regress/expected/point.out	2018-03-02 18:38:36.000000000 -0500
+++ src/test/regress/results/point.out	2018-03-03 09:18:17.000000000 -0500
@@ -132,46 +132,7 @@
 SELECT '' AS thirtysix, p1.f1 AS point1, p2.f1 AS point2, p1.f1 <-> p2.f1 AS dist
    FROM POINT_TBL p1, POINT_TBL p2
    ORDER BY dist, p1.f1[0], p2.f1[0];
- thirtysix |   point1   |   point2   |       dist       
------------+------------+------------+------------------
-           | (-10,0)    | (-10,0)    |                0
-           | (-5,-12)   | (-5,-12)   |                0
-           | (-3,4)     | (-3,4)     |                0
-           | (0,0)      | (0,0)      |                0
-           | (5.1,34.5) | (5.1,34.5) |                0
-           | (10,10)    | (10,10)    |                0
-           | (-3,4)     | (0,0)      |                5
-           | (0,0)      | (-3,4)     |                5
-           | (-10,0)    | (-3,4)     | 8.06225774829855
-           | (-3,4)     | (-10,0)    | 8.06225774829855
-           | (-10,0)    | (0,0)      |               10
-           | (0,0)      | (-10,0)    |               10
-           | (-10,0)    | (-5,-12)   |               13
-           | (-5,-12)   | (-10,0)    |               13
-           | (-5,-12)   | (0,0)      |               13
-           | (0,0)      | (-5,-12)   |               13
-           | (0,0)      | (10,10)    |  14.142135623731
-           | (10,10)    | (0,0)      |  14.142135623731
-           | (-3,4)     | (10,10)    | 14.3178210632764
-           | (10,10)    | (-3,4)     | 14.3178210632764
-           | (-5,-12)   | (-3,4)     | 16.1245154965971
-           | (-3,4)     | (-5,-12)   | 16.1245154965971
-           | (-10,0)    | (10,10)    | 22.3606797749979
-           | (10,10)    | (-10,0)    | 22.3606797749979
-           | (5.1,34.5) | (10,10)    | 24.9851956166046
-           | (10,10)    | (5.1,34.5) | 24.9851956166046
-           | (-5,-12)   | (10,10)    | 26.6270539113887
-           | (10,10)    | (-5,-12)   | 26.6270539113887
-           | (-3,4)     | (5.1,34.5) | 31.5572495632937
-           | (5.1,34.5) | (-3,4)     | 31.5572495632937
-           | (0,0)      | (5.1,34.5) | 34.8749193547455
-           | (5.1,34.5) | (0,0)      | 34.8749193547455
-           | (-10,0)    | (5.1,34.5) | 37.6597928831267
-           | (5.1,34.5) | (-10,0)    | 37.6597928831267
-           | (-5,-12)   | (5.1,34.5) | 47.5842410888311
-           | (5.1,34.5) | (-5,-12)   | 47.5842410888311
-(36 rows)
-
+ERROR:  failed to JIT: evalexpr.0.0
 SELECT '' AS thirty, p1.f1 AS point1, p2.f1 AS point2
    FROM POINT_TBL p1, POINT_TBL p2
    WHERE (p1.f1 <-> p2.f1) > 3;

======================================================================

--- src/test/regress/expected/interval.out	2018-03-02 18:38:36.000000000 -0500
+++ src/test/regress/results/interval.out	2018-03-03 09:18:19.000000000 -0500
@@ -158,55 +158,7 @@
    FROM INTERVAL_TBL r1, INTERVAL_TBL r2
    WHERE r1.f1 > r2.f1
    ORDER BY r1.f1, r2.f1;
- fortyfive |       f1        |       f1        
------------+-----------------+-----------------
-           | 00:01:00        | -00:00:14
-           | 05:00:00        | -00:00:14
-           | 05:00:00        | 00:01:00
-           | 1 day 02:03:04  | -00:00:14
-           | 1 day 02:03:04  | 00:01:00
-           | 1 day 02:03:04  | 05:00:00
-           | 10 days         | -00:00:14
-           | 10 days         | 00:01:00
-           | 10 days         | 05:00:00
-           | 10 days         | 1 day 02:03:04
-           | 3 mons          | -00:00:14
-           | 3 mons          | 00:01:00
-           | 3 mons          | 05:00:00
-           | 3 mons          | 1 day 02:03:04
-           | 3 mons          | 10 days
-           | 5 mons          | -00:00:14
-           | 5 mons          | 00:01:00
-           | 5 mons          | 05:00:00
-           | 5 mons          | 1 day 02:03:04
-           | 5 mons          | 10 days
-           | 5 mons          | 3 mons
-           | 5 mons 12:00:00 | -00:00:14
-           | 5 mons 12:00:00 | 00:01:00
-           | 5 mons 12:00:00 | 05:00:00
-           | 5 mons 12:00:00 | 1 day 02:03:04
-           | 5 mons 12:00:00 | 10 days
-           | 5 mons 12:00:00 | 3 mons
-           | 5 mons 12:00:00 | 5 mons
-           | 6 years         | -00:00:14
-           | 6 years         | 00:01:00
-           | 6 years         | 05:00:00
-           | 6 years         | 1 day 02:03:04
-           | 6 years         | 10 days
-           | 6 years         | 3 mons
-           | 6 years         | 5 mons
-           | 6 years         | 5 mons 12:00:00
-           | 34 years        | -00:00:14
-           | 34 years        | 00:01:00
-           | 34 years        | 05:00:00
-           | 34 years        | 1 day 02:03:04
-           | 34 years        | 10 days
-           | 34 years        | 3 mons
-           | 34 years        | 5 mons
-           | 34 years        | 5 mons 12:00:00
-           | 34 years        | 6 years
-(45 rows)
-
+ERROR:  failed to JIT: evalexpr.0.3
 -- Test intervals that are large enough to overflow 64 bits in comparisons
 CREATE TEMP TABLE INTERVAL_TBL_OF (f1 interval);
 INSERT INTO INTERVAL_TBL_OF (f1) VALUES
@@ -236,20 +188,7 @@
    FROM INTERVAL_TBL_OF r1, INTERVAL_TBL_OF r2
    WHERE r1.f1 > r2.f1
    ORDER BY r1.f1, r2.f1;
-                    f1                     |                    f1                     
--------------------------------------------+-------------------------------------------
- -178956970 years -8 mons +2147483647 days | -178956970 years -8 mons -2147483648 days
- 1 year                                    | -178956970 years -8 mons -2147483648 days
- 1 year                                    | -178956970 years -8 mons +2147483647 days
- 178956970 years 7 mons -2147483648 days   | -178956970 years -8 mons -2147483648 days
- 178956970 years 7 mons -2147483648 days   | -178956970 years -8 mons +2147483647 days
- 178956970 years 7 mons -2147483648 days   | 1 year
- 178956970 years 7 mons 2147483647 days    | -178956970 years -8 mons -2147483648 days
- 178956970 years 7 mons 2147483647 days    | -178956970 years -8 mons +2147483647 days
- 178956970 years 7 mons 2147483647 days    | 1 year
- 178956970 years 7 mons 2147483647 days    | 178956970 years 7 mons -2147483648 days
-(10 rows)
-
+ERROR:  failed to JIT: evalexpr.1.3
 CREATE INDEX ON INTERVAL_TBL_OF USING btree (f1);
 SET enable_seqscan TO false;
 EXPLAIN (COSTS OFF)

======================================================================

--- src/test/regress/expected/reltime.out	2018-03-02 18:38:36.000000000 -0500
+++ src/test/regress/results/reltime.out	2018-03-03 09:18:19.000000000 -0500
@@ -88,22 +88,4 @@
    FROM RELTIME_TBL r1, RELTIME_TBL r2
    WHERE r1.f1 > r2.f1
    ORDER BY r1.f1, r2.f1;
- fifteen |     f1     |      f1       
----------+------------+---------------
-         | @ 1 min    | @ 14 secs ago
-         | @ 5 hours  | @ 14 secs ago
-         | @ 5 hours  | @ 1 min
-         | @ 10 days  | @ 14 secs ago
-         | @ 10 days  | @ 1 min
-         | @ 10 days  | @ 5 hours
-         | @ 3 mons   | @ 14 secs ago
-         | @ 3 mons   | @ 1 min
-         | @ 3 mons   | @ 5 hours
-         | @ 3 mons   | @ 10 days
-         | @ 34 years | @ 14 secs ago
-         | @ 34 years | @ 1 min
-         | @ 34 years | @ 5 hours
-         | @ 34 years | @ 10 days
-         | @ 34 years | @ 3 mons
-(15 rows)
-
+ERROR:  failed to JIT: evalexpr.0.3

======================================================================

--- src/test/regress/expected/tinterval.out	2018-03-02 18:38:36.000000000 -0500
+++ src/test/regress/results/tinterval.out	2018-03-03 09:18:19.000000000 -0500
@@ -125,24 +125,7 @@
    FROM TINTERVAL_TBL t1, TINTERVAL_TBL t2
    WHERE t1.f1 && t2.f1 and not t1.f1 = t2.f1
    ORDER BY interval1, interval2;
- fourteen |                            interval1                            |                            interval2                            
-----------+-----------------------------------------------------------------+-----------------------------------------------------------------
-          | ["-infinity" "infinity"]                                        | ["Sun Sep 04 23:59:12 1983 PDT" "Tue Oct 04 23:59:12 1983 PDT"]
-          | ["-infinity" "infinity"]                                        | ["Thu Feb 15 12:15:03 1990 PST" "Sun Sep 23 11:12:13 2001 PDT"]
-          | ["-infinity" "infinity"]                                        | ["Wed Dec 31 16:00:00 1969 PST" "Mon May 01 00:30:30 1995 PDT"]
-          | ["-infinity" "infinity"]                                        | ["Sat May 10 23:59:12 1947 PST" "Sun Jan 14 03:14:21 1973 PST"]
-          | ["Sun Sep 04 23:59:12 1983 PDT" "Tue Oct 04 23:59:12 1983 PDT"] | ["-infinity" "infinity"]
-          | ["Sun Sep 04 23:59:12 1983 PDT" "Tue Oct 04 23:59:12 1983 PDT"] | ["Wed Dec 31 16:00:00 1969 PST" "Mon May 01 00:30:30 1995 PDT"]
-          | ["Thu Feb 15 12:15:03 1990 PST" "Sun Sep 23 11:12:13 2001 PDT"] | ["-infinity" "infinity"]
-          | ["Thu Feb 15 12:15:03 1990 PST" "Sun Sep 23 11:12:13 2001 PDT"] | ["Wed Dec 31 16:00:00 1969 PST" "Mon May 01 00:30:30 1995 PDT"]
-          | ["Wed Dec 31 16:00:00 1969 PST" "Mon May 01 00:30:30 1995 PDT"] | ["-infinity" "infinity"]
-          | ["Wed Dec 31 16:00:00 1969 PST" "Mon May 01 00:30:30 1995 PDT"] | ["Sun Sep 04 23:59:12 1983 PDT" "Tue Oct 04 23:59:12 1983 PDT"]
-          | ["Wed Dec 31 16:00:00 1969 PST" "Mon May 01 00:30:30 1995 PDT"] | ["Thu Feb 15 12:15:03 1990 PST" "Sun Sep 23 11:12:13 2001 PDT"]
-          | ["Wed Dec 31 16:00:00 1969 PST" "Mon May 01 00:30:30 1995 PDT"] | ["Sat May 10 23:59:12 1947 PST" "Sun Jan 14 03:14:21 1973 PST"]
-          | ["Sat May 10 23:59:12 1947 PST" "Sun Jan 14 03:14:21 1973 PST"] | ["-infinity" "infinity"]
-          | ["Sat May 10 23:59:12 1947 PST" "Sun Jan 14 03:14:21 1973 PST"] | ["Wed Dec 31 16:00:00 1969 PST" "Mon May 01 00:30:30 1995 PDT"]
-(14 rows)
-
+ERROR:  failed to JIT: evalexpr.0.3
 -- contains
 SELECT '' AS five, t1.f1
    FROM TINTERVAL_TBL t1

======================================================================

--- src/test/regress/expected/geometry.out	2018-03-02 18:38:36.000000000 -0500
+++ src/test/regress/results/geometry.out	2018-03-03 09:18:19.000000000 -0500
@@ -536,28 +536,4 @@
    FROM CIRCLE_TBL c1, POINT_TBL p1
    WHERE (p1.f1 <-> c1.f1) > 0
    ORDER BY distance, area(c1.f1), p1.f1[0];
- twentyfour |     circle     |   point    |   distance    
-------------+----------------+------------+---------------
-            | <(1,2),3>      | (-3,4)     |   1.472135955
-            | <(5,1),3>      | (0,0)      | 2.09901951359
-            | <(5,1),3>      | (-3,4)     | 5.54400374532
-            | <(1,3),5>      | (-10,0)    | 6.40175425099
-            | <(1,3),5>      | (10,10)    | 6.40175425099
-            | <(5,1),3>      | (10,10)    | 7.29563014099
-            | <(1,2),3>      | (-10,0)    |  8.1803398875
-            | <(1,2),3>      | (10,10)    | 9.04159457879
-            | <(1,3),5>      | (-5,-12)   | 11.1554944214
-            | <(5,1),3>      | (-10,0)    | 12.0332963784
-            | <(1,2),3>      | (-5,-12)   | 12.2315462117
-            | <(5,1),3>      | (-5,-12)   | 13.4012194669
-            | <(1,3),5>      | (5.1,34.5) | 26.7657047773
-            | <(1,2),3>      | (5.1,34.5) | 29.7575945393
-            | <(5,1),3>      | (5.1,34.5) | 30.5001492534
-            | <(100,200),10> | (5.1,34.5) | 180.778038568
-            | <(100,200),10> | (10,10)    | 200.237960416
-            | <(100,200),10> | (-3,4)     | 211.415898255
-            | <(100,200),10> | (0,0)      |  213.60679775
-            | <(100,200),10> | (-10,0)    |  218.25424421
-            | <(100,200),10> | (-5,-12)   | 226.577682802
-(21 rows)
-
+ERROR:  failed to JIT: evalexpr.0.3

======================================================================

--- src/test/regress/expected/horology.out	2018-03-02 18:38:36.000000000 -0500
+++ src/test/regress/results/horology.out	2018-03-03 09:18:20.000000000 -0500
@@ -1044,237 +1044,11 @@
 SELECT t.f1 AS t, i.f1 AS i, t.f1 + i.f1 AS "add", t.f1 - i.f1 AS "subtract"
   FROM TIME_TBL t, INTERVAL_TBL i
   ORDER BY 1,2;
-      t      |               i               |     add     |  subtract   
--------------+-------------------------------+-------------+-------------
- 00:00:00    | @ 14 secs ago                 | 23:59:46    | 00:00:14
- 00:00:00    | @ 1 min                       | 00:01:00    | 23:59:00
- 00:00:00    | @ 5 hours                     | 05:00:00    | 19:00:00
- 00:00:00    | @ 1 day 2 hours 3 mins 4 secs | 02:03:04    | 21:56:56
- 00:00:00    | @ 10 days                     | 00:00:00    | 00:00:00
- 00:00:00    | @ 3 mons                      | 00:00:00    | 00:00:00
- 00:00:00    | @ 5 mons                      | 00:00:00    | 00:00:00
- 00:00:00    | @ 5 mons 12 hours             | 12:00:00    | 12:00:00
- 00:00:00    | @ 6 years                     | 00:00:00    | 00:00:00
- 00:00:00    | @ 34 years                    | 00:00:00    | 00:00:00
- 01:00:00    | @ 14 secs ago                 | 00:59:46    | 01:00:14
- 01:00:00    | @ 1 min                       | 01:01:00    | 00:59:00
- 01:00:00    | @ 5 hours                     | 06:00:00    | 20:00:00
- 01:00:00    | @ 1 day 2 hours 3 mins 4 secs | 03:03:04    | 22:56:56
- 01:00:00    | @ 10 days                     | 01:00:00    | 01:00:00
- 01:00:00    | @ 3 mons                      | 01:00:00    | 01:00:00
- 01:00:00    | @ 5 mons                      | 01:00:00    | 01:00:00
- 01:00:00    | @ 5 mons 12 hours             | 13:00:00    | 13:00:00
- 01:00:00    | @ 6 years                     | 01:00:00    | 01:00:00
- 01:00:00    | @ 34 years                    | 01:00:00    | 01:00:00
- 02:03:00    | @ 14 secs ago                 | 02:02:46    | 02:03:14
- 02:03:00    | @ 1 min                       | 02:04:00    | 02:02:00
- 02:03:00    | @ 5 hours                     | 07:03:00    | 21:03:00
- 02:03:00    | @ 1 day 2 hours 3 mins 4 secs | 04:06:04    | 23:59:56
- 02:03:00    | @ 10 days                     | 02:03:00    | 02:03:00
- 02:03:00    | @ 3 mons                      | 02:03:00    | 02:03:00
- 02:03:00    | @ 5 mons                      | 02:03:00    | 02:03:00
- 02:03:00    | @ 5 mons 12 hours             | 14:03:00    | 14:03:00
- 02:03:00    | @ 6 years                     | 02:03:00    | 02:03:00
- 02:03:00    | @ 34 years                    | 02:03:00    | 02:03:00
- 11:59:00    | @ 14 secs ago                 | 11:58:46    | 11:59:14
- 11:59:00    | @ 1 min                       | 12:00:00    | 11:58:00
- 11:59:00    | @ 5 hours                     | 16:59:00    | 06:59:00
- 11:59:00    | @ 1 day 2 hours 3 mins 4 secs | 14:02:04    | 09:55:56
- 11:59:00    | @ 10 days                     | 11:59:00    | 11:59:00
- 11:59:00    | @ 3 mons                      | 11:59:00    | 11:59:00
- 11:59:00    | @ 5 mons                      | 11:59:00    | 11:59:00
- 11:59:00    | @ 5 mons 12 hours             | 23:59:00    | 23:59:00
- 11:59:00    | @ 6 years                     | 11:59:00    | 11:59:00
- 11:59:00    | @ 34 years                    | 11:59:00    | 11:59:00
- 12:00:00    | @ 14 secs ago                 | 11:59:46    | 12:00:14
- 12:00:00    | @ 1 min                       | 12:01:00    | 11:59:00
- 12:00:00    | @ 5 hours                     | 17:00:00    | 07:00:00
- 12:00:00    | @ 1 day 2 hours 3 mins 4 secs | 14:03:04    | 09:56:56
- 12:00:00    | @ 10 days                     | 12:00:00    | 12:00:00
- 12:00:00    | @ 3 mons                      | 12:00:00    | 12:00:00
- 12:00:00    | @ 5 mons                      | 12:00:00    | 12:00:00
- 12:00:00    | @ 5 mons 12 hours             | 00:00:00    | 00:00:00
- 12:00:00    | @ 6 years                     | 12:00:00    | 12:00:00
- 12:00:00    | @ 34 years                    | 12:00:00    | 12:00:00
- 12:01:00    | @ 14 secs ago                 | 12:00:46    | 12:01:14
- 12:01:00    | @ 1 min                       | 12:02:00    | 12:00:00
- 12:01:00    | @ 5 hours                     | 17:01:00    | 07:01:00
- 12:01:00    | @ 1 day 2 hours 3 mins 4 secs | 14:04:04    | 09:57:56
- 12:01:00    | @ 10 days                     | 12:01:00    | 12:01:00
- 12:01:00    | @ 3 mons                      | 12:01:00    | 12:01:00
- 12:01:00    | @ 5 mons                      | 12:01:00    | 12:01:00
- 12:01:00    | @ 5 mons 12 hours             | 00:01:00    | 00:01:00
- 12:01:00    | @ 6 years                     | 12:01:00    | 12:01:00
- 12:01:00    | @ 34 years                    | 12:01:00    | 12:01:00
- 15:36:39    | @ 14 secs ago                 | 15:36:25    | 15:36:53
- 15:36:39    | @ 14 secs ago                 | 15:36:25    | 15:36:53
- 15:36:39    | @ 1 min                       | 15:37:39    | 15:35:39
- 15:36:39    | @ 1 min                       | 15:37:39    | 15:35:39
- 15:36:39    | @ 5 hours                     | 20:36:39    | 10:36:39
- 15:36:39    | @ 5 hours                     | 20:36:39    | 10:36:39
- 15:36:39    | @ 1 day 2 hours 3 mins 4 secs | 17:39:43    | 13:33:35
- 15:36:39    | @ 1 day 2 hours 3 mins 4 secs | 17:39:43    | 13:33:35
- 15:36:39    | @ 10 days                     | 15:36:39    | 15:36:39
- 15:36:39    | @ 10 days                     | 15:36:39    | 15:36:39
- 15:36:39    | @ 3 mons                      | 15:36:39    | 15:36:39
- 15:36:39    | @ 3 mons                      | 15:36:39    | 15:36:39
- 15:36:39    | @ 5 mons                      | 15:36:39    | 15:36:39
- 15:36:39    | @ 5 mons                      | 15:36:39    | 15:36:39
- 15:36:39    | @ 5 mons 12 hours             | 03:36:39    | 03:36:39
- 15:36:39    | @ 5 mons 12 hours             | 03:36:39    | 03:36:39
- 15:36:39    | @ 6 years                     | 15:36:39    | 15:36:39
- 15:36:39    | @ 6 years                     | 15:36:39    | 15:36:39
- 15:36:39    | @ 34 years                    | 15:36:39    | 15:36:39
- 15:36:39    | @ 34 years                    | 15:36:39    | 15:36:39
- 23:59:00    | @ 14 secs ago                 | 23:58:46    | 23:59:14
- 23:59:00    | @ 1 min                       | 00:00:00    | 23:58:00
- 23:59:00    | @ 5 hours                     | 04:59:00    | 18:59:00
- 23:59:00    | @ 1 day 2 hours 3 mins 4 secs | 02:02:04    | 21:55:56
- 23:59:00    | @ 10 days                     | 23:59:00    | 23:59:00
- 23:59:00    | @ 3 mons                      | 23:59:00    | 23:59:00
- 23:59:00    | @ 5 mons                      | 23:59:00    | 23:59:00
- 23:59:00    | @ 5 mons 12 hours             | 11:59:00    | 11:59:00
- 23:59:00    | @ 6 years                     | 23:59:00    | 23:59:00
- 23:59:00    | @ 34 years                    | 23:59:00    | 23:59:00
- 23:59:59.99 | @ 14 secs ago                 | 23:59:45.99 | 00:00:13.99
- 23:59:59.99 | @ 1 min                       | 00:00:59.99 | 23:58:59.99
- 23:59:59.99 | @ 5 hours                     | 04:59:59.99 | 18:59:59.99
- 23:59:59.99 | @ 1 day 2 hours 3 mins 4 secs | 02:03:03.99 | 21:56:55.99
- 23:59:59.99 | @ 10 days                     | 23:59:59.99 | 23:59:59.99
- 23:59:59.99 | @ 3 mons                      | 23:59:59.99 | 23:59:59.99
- 23:59:59.99 | @ 5 mons                      | 23:59:59.99 | 23:59:59.99
- 23:59:59.99 | @ 5 mons 12 hours             | 11:59:59.99 | 11:59:59.99
- 23:59:59.99 | @ 6 years                     | 23:59:59.99 | 23:59:59.99
- 23:59:59.99 | @ 34 years                    | 23:59:59.99 | 23:59:59.99
-(100 rows)
-
+ERROR:  failed to JIT: evalexpr.0.0
 SELECT t.f1 AS t, i.f1 AS i, t.f1 + i.f1 AS "add", t.f1 - i.f1 AS "subtract"
   FROM TIMETZ_TBL t, INTERVAL_TBL i
   ORDER BY 1,2;
-       t        |               i               |      add       |    subtract    
-----------------+-------------------------------+----------------+----------------
- 00:01:00-07    | @ 14 secs ago                 | 00:00:46-07    | 00:01:14-07
- 00:01:00-07    | @ 1 min                       | 00:02:00-07    | 00:00:00-07
- 00:01:00-07    | @ 5 hours                     | 05:01:00-07    | 19:01:00-07
- 00:01:00-07    | @ 1 day 2 hours 3 mins 4 secs | 02:04:04-07    | 21:57:56-07
- 00:01:00-07    | @ 10 days                     | 00:01:00-07    | 00:01:00-07
- 00:01:00-07    | @ 3 mons                      | 00:01:00-07    | 00:01:00-07
- 00:01:00-07    | @ 5 mons                      | 00:01:00-07    | 00:01:00-07
- 00:01:00-07    | @ 5 mons 12 hours             | 12:01:00-07    | 12:01:00-07
- 00:01:00-07    | @ 6 years                     | 00:01:00-07    | 00:01:00-07
- 00:01:00-07    | @ 34 years                    | 00:01:00-07    | 00:01:00-07
- 01:00:00-07    | @ 14 secs ago                 | 00:59:46-07    | 01:00:14-07
- 01:00:00-07    | @ 1 min                       | 01:01:00-07    | 00:59:00-07
- 01:00:00-07    | @ 5 hours                     | 06:00:00-07    | 20:00:00-07
- 01:00:00-07    | @ 1 day 2 hours 3 mins 4 secs | 03:03:04-07    | 22:56:56-07
- 01:00:00-07    | @ 10 days                     | 01:00:00-07    | 01:00:00-07
- 01:00:00-07    | @ 3 mons                      | 01:00:00-07    | 01:00:00-07
- 01:00:00-07    | @ 5 mons                      | 01:00:00-07    | 01:00:00-07
- 01:00:00-07    | @ 5 mons 12 hours             | 13:00:00-07    | 13:00:00-07
- 01:00:00-07    | @ 6 years                     | 01:00:00-07    | 01:00:00-07
- 01:00:00-07    | @ 34 years                    | 01:00:00-07    | 01:00:00-07
- 02:03:00-07    | @ 14 secs ago                 | 02:02:46-07    | 02:03:14-07
- 02:03:00-07    | @ 1 min                       | 02:04:00-07    | 02:02:00-07
- 02:03:00-07    | @ 5 hours                     | 07:03:00-07    | 21:03:00-07
- 02:03:00-07    | @ 1 day 2 hours 3 mins 4 secs | 04:06:04-07    | 23:59:56-07
- 02:03:00-07    | @ 10 days                     | 02:03:00-07    | 02:03:00-07
- 02:03:00-07    | @ 3 mons                      | 02:03:00-07    | 02:03:00-07
- 02:03:00-07    | @ 5 mons                      | 02:03:00-07    | 02:03:00-07
- 02:03:00-07    | @ 5 mons 12 hours             | 14:03:00-07    | 14:03:00-07
- 02:03:00-07    | @ 6 years                     | 02:03:00-07    | 02:03:00-07
- 02:03:00-07    | @ 34 years                    | 02:03:00-07    | 02:03:00-07
- 08:08:00-04    | @ 14 secs ago                 | 08:07:46-04    | 08:08:14-04
- 08:08:00-04    | @ 1 min                       | 08:09:00-04    | 08:07:00-04
- 08:08:00-04    | @ 5 hours                     | 13:08:00-04    | 03:08:00-04
- 08:08:00-04    | @ 1 day 2 hours 3 mins 4 secs | 10:11:04-04    | 06:04:56-04
- 08:08:00-04    | @ 10 days                     | 08:08:00-04    | 08:08:00-04
- 08:08:00-04    | @ 3 mons                      | 08:08:00-04    | 08:08:00-04
- 08:08:00-04    | @ 5 mons                      | 08:08:00-04    | 08:08:00-04
- 08:08:00-04    | @ 5 mons 12 hours             | 20:08:00-04    | 20:08:00-04
- 08:08:00-04    | @ 6 years                     | 08:08:00-04    | 08:08:00-04
- 08:08:00-04    | @ 34 years                    | 08:08:00-04    | 08:08:00-04
- 07:07:00-08    | @ 14 secs ago                 | 07:06:46-08    | 07:07:14-08
- 07:07:00-08    | @ 1 min                       | 07:08:00-08    | 07:06:00-08
- 07:07:00-08    | @ 5 hours                     | 12:07:00-08    | 02:07:00-08
- 07:07:00-08    | @ 1 day 2 hours 3 mins 4 secs | 09:10:04-08    | 05:03:56-08
- 07:07:00-08    | @ 10 days                     | 07:07:00-08    | 07:07:00-08
- 07:07:00-08    | @ 3 mons                      | 07:07:00-08    | 07:07:00-08
- 07:07:00-08    | @ 5 mons                      | 07:07:00-08    | 07:07:00-08
- 07:07:00-08    | @ 5 mons 12 hours             | 19:07:00-08    | 19:07:00-08
- 07:07:00-08    | @ 6 years                     | 07:07:00-08    | 07:07:00-08
- 07:07:00-08    | @ 34 years                    | 07:07:00-08    | 07:07:00-08
- 11:59:00-07    | @ 14 secs ago                 | 11:58:46-07    | 11:59:14-07
- 11:59:00-07    | @ 1 min                       | 12:00:00-07    | 11:58:00-07
- 11:59:00-07    | @ 5 hours                     | 16:59:00-07    | 06:59:00-07
- 11:59:00-07    | @ 1 day 2 hours 3 mins 4 secs | 14:02:04-07    | 09:55:56-07
- 11:59:00-07    | @ 10 days                     | 11:59:00-07    | 11:59:00-07
- 11:59:00-07    | @ 3 mons                      | 11:59:00-07    | 11:59:00-07
- 11:59:00-07    | @ 5 mons                      | 11:59:00-07    | 11:59:00-07
- 11:59:00-07    | @ 5 mons 12 hours             | 23:59:00-07    | 23:59:00-07
- 11:59:00-07    | @ 6 years                     | 11:59:00-07    | 11:59:00-07
- 11:59:00-07    | @ 34 years                    | 11:59:00-07    | 11:59:00-07
- 12:00:00-07    | @ 14 secs ago                 | 11:59:46-07    | 12:00:14-07
- 12:00:00-07    | @ 1 min                       | 12:01:00-07    | 11:59:00-07
- 12:00:00-07    | @ 5 hours                     | 17:00:00-07    | 07:00:00-07
- 12:00:00-07    | @ 1 day 2 hours 3 mins 4 secs | 14:03:04-07    | 09:56:56-07
- 12:00:00-07    | @ 10 days                     | 12:00:00-07    | 12:00:00-07
- 12:00:00-07    | @ 3 mons                      | 12:00:00-07    | 12:00:00-07
- 12:00:00-07    | @ 5 mons                      | 12:00:00-07    | 12:00:00-07
- 12:00:00-07    | @ 5 mons 12 hours             | 00:00:00-07    | 00:00:00-07
- 12:00:00-07    | @ 6 years                     | 12:00:00-07    | 12:00:00-07
- 12:00:00-07    | @ 34 years                    | 12:00:00-07    | 12:00:00-07
- 12:01:00-07    | @ 14 secs ago                 | 12:00:46-07    | 12:01:14-07
- 12:01:00-07    | @ 1 min                       | 12:02:00-07    | 12:00:00-07
- 12:01:00-07    | @ 5 hours                     | 17:01:00-07    | 07:01:00-07
- 12:01:00-07    | @ 1 day 2 hours 3 mins 4 secs | 14:04:04-07    | 09:57:56-07
- 12:01:00-07    | @ 10 days                     | 12:01:00-07    | 12:01:00-07
- 12:01:00-07    | @ 3 mons                      | 12:01:00-07    | 12:01:00-07
- 12:01:00-07    | @ 5 mons                      | 12:01:00-07    | 12:01:00-07
- 12:01:00-07    | @ 5 mons 12 hours             | 00:01:00-07    | 00:01:00-07
- 12:01:00-07    | @ 6 years                     | 12:01:00-07    | 12:01:00-07
- 12:01:00-07    | @ 34 years                    | 12:01:00-07    | 12:01:00-07
- 15:36:39-04    | @ 14 secs ago                 | 15:36:25-04    | 15:36:53-04
- 15:36:39-04    | @ 1 min                       | 15:37:39-04    | 15:35:39-04
- 15:36:39-04    | @ 5 hours                     | 20:36:39-04    | 10:36:39-04
- 15:36:39-04    | @ 1 day 2 hours 3 mins 4 secs | 17:39:43-04    | 13:33:35-04
- 15:36:39-04    | @ 10 days                     | 15:36:39-04    | 15:36:39-04
- 15:36:39-04    | @ 3 mons                      | 15:36:39-04    | 15:36:39-04
- 15:36:39-04    | @ 5 mons                      | 15:36:39-04    | 15:36:39-04
- 15:36:39-04    | @ 5 mons 12 hours             | 03:36:39-04    | 03:36:39-04
- 15:36:39-04    | @ 6 years                     | 15:36:39-04    | 15:36:39-04
- 15:36:39-04    | @ 34 years                    | 15:36:39-04    | 15:36:39-04
- 15:36:39-05    | @ 14 secs ago                 | 15:36:25-05    | 15:36:53-05
- 15:36:39-05    | @ 1 min                       | 15:37:39-05    | 15:35:39-05
- 15:36:39-05    | @ 5 hours                     | 20:36:39-05    | 10:36:39-05
- 15:36:39-05    | @ 1 day 2 hours 3 mins 4 secs | 17:39:43-05    | 13:33:35-05
- 15:36:39-05    | @ 10 days                     | 15:36:39-05    | 15:36:39-05
- 15:36:39-05    | @ 3 mons                      | 15:36:39-05    | 15:36:39-05
- 15:36:39-05    | @ 5 mons                      | 15:36:39-05    | 15:36:39-05
- 15:36:39-05    | @ 5 mons 12 hours             | 03:36:39-05    | 03:36:39-05
- 15:36:39-05    | @ 6 years                     | 15:36:39-05    | 15:36:39-05
- 15:36:39-05    | @ 34 years                    | 15:36:39-05    | 15:36:39-05
- 23:59:00-07    | @ 14 secs ago                 | 23:58:46-07    | 23:59:14-07
- 23:59:00-07    | @ 1 min                       | 00:00:00-07    | 23:58:00-07
- 23:59:00-07    | @ 5 hours                     | 04:59:00-07    | 18:59:00-07
- 23:59:00-07    | @ 1 day 2 hours 3 mins 4 secs | 02:02:04-07    | 21:55:56-07
- 23:59:00-07    | @ 10 days                     | 23:59:00-07    | 23:59:00-07
- 23:59:00-07    | @ 3 mons                      | 23:59:00-07    | 23:59:00-07
- 23:59:00-07    | @ 5 mons                      | 23:59:00-07    | 23:59:00-07
- 23:59:00-07    | @ 5 mons 12 hours             | 11:59:00-07    | 11:59:00-07
- 23:59:00-07    | @ 6 years                     | 23:59:00-07    | 23:59:00-07
- 23:59:00-07    | @ 34 years                    | 23:59:00-07    | 23:59:00-07
- 23:59:59.99-07 | @ 14 secs ago                 | 23:59:45.99-07 | 00:00:13.99-07
- 23:59:59.99-07 | @ 1 min                       | 00:00:59.99-07 | 23:58:59.99-07
- 23:59:59.99-07 | @ 5 hours                     | 04:59:59.99-07 | 18:59:59.99-07
- 23:59:59.99-07 | @ 1 day 2 hours 3 mins 4 secs | 02:03:03.99-07 | 21:56:55.99-07
- 23:59:59.99-07 | @ 10 days                     | 23:59:59.99-07 | 23:59:59.99-07
- 23:59:59.99-07 | @ 3 mons                      | 23:59:59.99-07 | 23:59:59.99-07
- 23:59:59.99-07 | @ 5 mons                      | 23:59:59.99-07 | 23:59:59.99-07
- 23:59:59.99-07 | @ 5 mons 12 hours             | 11:59:59.99-07 | 11:59:59.99-07
- 23:59:59.99-07 | @ 6 years                     | 23:59:59.99-07 | 23:59:59.99-07
- 23:59:59.99-07 | @ 34 years                    | 23:59:59.99-07 | 23:59:59.99-07
-(120 rows)
-
+ERROR:  failed to JIT: evalexpr.1.0
 -- SQL9x OVERLAPS operator
 -- test with time zone
 SELECT (timestamp with time zone '2000-11-27', timestamp with time zone '2000-11-28')
@@ -1426,338 +1200,12 @@
 SELECT '' AS "160", d.f1 AS "timestamp", t.f1 AS "interval", d.f1 + t.f1 AS plus
   FROM TEMP_TIMESTAMP d, INTERVAL_TBL t
   ORDER BY plus, "timestamp", "interval";
- 160 |          timestamp           |           interval            |             plus             
------+------------------------------+-------------------------------+------------------------------
-     | Thu Jan 01 00:00:00 1970 PST | @ 14 secs ago                 | Wed Dec 31 23:59:46 1969 PST
-     | Thu Jan 01 00:00:00 1970 PST | @ 1 min                       | Thu Jan 01 00:01:00 1970 PST
-     | Thu Jan 01 00:00:00 1970 PST | @ 5 hours                     | Thu Jan 01 05:00:00 1970 PST
-     | Thu Jan 01 00:00:00 1970 PST | @ 1 day 2 hours 3 mins 4 secs | Fri Jan 02 02:03:04 1970 PST
-     | Thu Jan 01 00:00:00 1970 PST | @ 10 days                     | Sun Jan 11 00:00:00 1970 PST
-     | Thu Jan 01 00:00:00 1970 PST | @ 3 mons                      | Wed Apr 01 00:00:00 1970 PST
-     | Thu Jan 01 00:00:00 1970 PST | @ 5 mons                      | Mon Jun 01 00:00:00 1970 PDT
-     | Thu Jan 01 00:00:00 1970 PST | @ 5 mons 12 hours             | Mon Jun 01 12:00:00 1970 PDT
-     | Thu Jan 01 00:00:00 1970 PST | @ 6 years                     | Thu Jan 01 00:00:00 1976 PST
-     | Wed Feb 28 17:32:01 1996 PST | @ 14 secs ago                 | Wed Feb 28 17:31:47 1996 PST
-     | Wed Feb 28 17:32:01 1996 PST | @ 1 min                       | Wed Feb 28 17:33:01 1996 PST
-     | Wed Feb 28 17:32:01 1996 PST | @ 5 hours                     | Wed Feb 28 22:32:01 1996 PST
-     | Thu Feb 29 17:32:01 1996 PST | @ 14 secs ago                 | Thu Feb 29 17:31:47 1996 PST
-     | Thu Feb 29 17:32:01 1996 PST | @ 1 min                       | Thu Feb 29 17:33:01 1996 PST
-     | Wed Feb 28 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Thu Feb 29 19:35:05 1996 PST
-     | Thu Feb 29 17:32:01 1996 PST | @ 5 hours                     | Thu Feb 29 22:32:01 1996 PST
-     | Fri Mar 01 17:32:01 1996 PST | @ 14 secs ago                 | Fri Mar 01 17:31:47 1996 PST
-     | Fri Mar 01 17:32:01 1996 PST | @ 1 min                       | Fri Mar 01 17:33:01 1996 PST
-     | Thu Feb 29 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Fri Mar 01 19:35:05 1996 PST
-     | Fri Mar 01 17:32:01 1996 PST | @ 5 hours                     | Fri Mar 01 22:32:01 1996 PST
-     | Fri Mar 01 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Sat Mar 02 19:35:05 1996 PST
-     | Wed Feb 28 17:32:01 1996 PST | @ 10 days                     | Sat Mar 09 17:32:01 1996 PST
-     | Thu Feb 29 17:32:01 1996 PST | @ 10 days                     | Sun Mar 10 17:32:01 1996 PST
-     | Fri Mar 01 17:32:01 1996 PST | @ 10 days                     | Mon Mar 11 17:32:01 1996 PST
-     | Wed Feb 28 17:32:01 1996 PST | @ 3 mons                      | Tue May 28 17:32:01 1996 PDT
-     | Thu Feb 29 17:32:01 1996 PST | @ 3 mons                      | Wed May 29 17:32:01 1996 PDT
-     | Fri Mar 01 17:32:01 1996 PST | @ 3 mons                      | Sat Jun 01 17:32:01 1996 PDT
-     | Wed Feb 28 17:32:01 1996 PST | @ 5 mons                      | Sun Jul 28 17:32:01 1996 PDT
-     | Wed Feb 28 17:32:01 1996 PST | @ 5 mons 12 hours             | Mon Jul 29 05:32:01 1996 PDT
-     | Thu Feb 29 17:32:01 1996 PST | @ 5 mons                      | Mon Jul 29 17:32:01 1996 PDT
-     | Thu Feb 29 17:32:01 1996 PST | @ 5 mons 12 hours             | Tue Jul 30 05:32:01 1996 PDT
-     | Fri Mar 01 17:32:01 1996 PST | @ 5 mons                      | Thu Aug 01 17:32:01 1996 PDT
-     | Fri Mar 01 17:32:01 1996 PST | @ 5 mons 12 hours             | Fri Aug 02 05:32:01 1996 PDT
-     | Mon Dec 30 17:32:01 1996 PST | @ 14 secs ago                 | Mon Dec 30 17:31:47 1996 PST
-     | Mon Dec 30 17:32:01 1996 PST | @ 1 min                       | Mon Dec 30 17:33:01 1996 PST
-     | Mon Dec 30 17:32:01 1996 PST | @ 5 hours                     | Mon Dec 30 22:32:01 1996 PST
-     | Tue Dec 31 17:32:01 1996 PST | @ 14 secs ago                 | Tue Dec 31 17:31:47 1996 PST
-     | Tue Dec 31 17:32:01 1996 PST | @ 1 min                       | Tue Dec 31 17:33:01 1996 PST
-     | Mon Dec 30 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Dec 31 19:35:05 1996 PST
-     | Tue Dec 31 17:32:01 1996 PST | @ 5 hours                     | Tue Dec 31 22:32:01 1996 PST
-     | Tue Dec 31 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Wed Jan 01 19:35:05 1997 PST
-     | Mon Dec 30 17:32:01 1996 PST | @ 10 days                     | Thu Jan 09 17:32:01 1997 PST
-     | Tue Dec 31 17:32:01 1996 PST | @ 10 days                     | Fri Jan 10 17:32:01 1997 PST
-     | Mon Dec 30 17:32:01 1996 PST | @ 3 mons                      | Sun Mar 30 17:32:01 1997 PST
-     | Tue Dec 31 17:32:01 1996 PST | @ 3 mons                      | Mon Mar 31 17:32:01 1997 PST
-     | Mon Dec 30 17:32:01 1996 PST | @ 5 mons                      | Fri May 30 17:32:01 1997 PDT
-     | Mon Dec 30 17:32:01 1996 PST | @ 5 mons 12 hours             | Sat May 31 05:32:01 1997 PDT
-     | Tue Dec 31 17:32:01 1996 PST | @ 5 mons                      | Sat May 31 17:32:01 1997 PDT
-     | Tue Dec 31 17:32:01 1996 PST | @ 5 mons 12 hours             | Sun Jun 01 05:32:01 1997 PDT
-     | Fri Dec 31 17:32:01 1999 PST | @ 14 secs ago                 | Fri Dec 31 17:31:47 1999 PST
-     | Fri Dec 31 17:32:01 1999 PST | @ 1 min                       | Fri Dec 31 17:33:01 1999 PST
-     | Fri Dec 31 17:32:01 1999 PST | @ 5 hours                     | Fri Dec 31 22:32:01 1999 PST
-     | Sat Jan 01 17:32:01 2000 PST | @ 14 secs ago                 | Sat Jan 01 17:31:47 2000 PST
-     | Sat Jan 01 17:32:01 2000 PST | @ 1 min                       | Sat Jan 01 17:33:01 2000 PST
-     | Fri Dec 31 17:32:01 1999 PST | @ 1 day 2 hours 3 mins 4 secs | Sat Jan 01 19:35:05 2000 PST
-     | Sat Jan 01 17:32:01 2000 PST | @ 5 hours                     | Sat Jan 01 22:32:01 2000 PST
-     | Sat Jan 01 17:32:01 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Sun Jan 02 19:35:05 2000 PST
-     | Fri Dec 31 17:32:01 1999 PST | @ 10 days                     | Mon Jan 10 17:32:01 2000 PST
-     | Sat Jan 01 17:32:01 2000 PST | @ 10 days                     | Tue Jan 11 17:32:01 2000 PST
-     | Wed Mar 15 02:14:05 2000 PST | @ 14 secs ago                 | Wed Mar 15 02:13:51 2000 PST
-     | Wed Mar 15 02:14:05 2000 PST | @ 1 min                       | Wed Mar 15 02:15:05 2000 PST
-     | Wed Mar 15 03:14:04 2000 PST | @ 14 secs ago                 | Wed Mar 15 03:13:50 2000 PST
-     | Wed Mar 15 03:14:04 2000 PST | @ 1 min                       | Wed Mar 15 03:15:04 2000 PST
-     | Wed Mar 15 02:14:05 2000 PST | @ 5 hours                     | Wed Mar 15 07:14:05 2000 PST
-     | Wed Mar 15 08:14:01 2000 PST | @ 14 secs ago                 | Wed Mar 15 08:13:47 2000 PST
-     | Wed Mar 15 03:14:04 2000 PST | @ 5 hours                     | Wed Mar 15 08:14:04 2000 PST
-     | Wed Mar 15 08:14:01 2000 PST | @ 1 min                       | Wed Mar 15 08:15:01 2000 PST
-     | Wed Mar 15 12:14:03 2000 PST | @ 14 secs ago                 | Wed Mar 15 12:13:49 2000 PST
-     | Wed Mar 15 12:14:03 2000 PST | @ 1 min                       | Wed Mar 15 12:15:03 2000 PST
-     | Wed Mar 15 13:14:02 2000 PST | @ 14 secs ago                 | Wed Mar 15 13:13:48 2000 PST
-     | Wed Mar 15 08:14:01 2000 PST | @ 5 hours                     | Wed Mar 15 13:14:01 2000 PST
-     | Wed Mar 15 13:14:02 2000 PST | @ 1 min                       | Wed Mar 15 13:15:02 2000 PST
-     | Wed Mar 15 12:14:03 2000 PST | @ 5 hours                     | Wed Mar 15 17:14:03 2000 PST
-     | Wed Mar 15 13:14:02 2000 PST | @ 5 hours                     | Wed Mar 15 18:14:02 2000 PST
-     | Wed Mar 15 02:14:05 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Thu Mar 16 04:17:09 2000 PST
-     | Wed Mar 15 03:14:04 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Thu Mar 16 05:17:08 2000 PST
-     | Wed Mar 15 08:14:01 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Thu Mar 16 10:17:05 2000 PST
-     | Wed Mar 15 12:14:03 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Thu Mar 16 14:17:07 2000 PST
-     | Wed Mar 15 13:14:02 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Thu Mar 16 15:17:06 2000 PST
-     | Wed Mar 15 02:14:05 2000 PST | @ 10 days                     | Sat Mar 25 02:14:05 2000 PST
-     | Wed Mar 15 03:14:04 2000 PST | @ 10 days                     | Sat Mar 25 03:14:04 2000 PST
-     | Wed Mar 15 08:14:01 2000 PST | @ 10 days                     | Sat Mar 25 08:14:01 2000 PST
-     | Wed Mar 15 12:14:03 2000 PST | @ 10 days                     | Sat Mar 25 12:14:03 2000 PST
-     | Wed Mar 15 13:14:02 2000 PST | @ 10 days                     | Sat Mar 25 13:14:02 2000 PST
-     | Fri Dec 31 17:32:01 1999 PST | @ 3 mons                      | Fri Mar 31 17:32:01 2000 PST
-     | Sat Jan 01 17:32:01 2000 PST | @ 3 mons                      | Sat Apr 01 17:32:01 2000 PST
-     | Fri Dec 31 17:32:01 1999 PST | @ 5 mons                      | Wed May 31 17:32:01 2000 PDT
-     | Fri Dec 31 17:32:01 1999 PST | @ 5 mons 12 hours             | Thu Jun 01 05:32:01 2000 PDT
-     | Sat Jan 01 17:32:01 2000 PST | @ 5 mons                      | Thu Jun 01 17:32:01 2000 PDT
-     | Sat Jan 01 17:32:01 2000 PST | @ 5 mons 12 hours             | Fri Jun 02 05:32:01 2000 PDT
-     | Wed Mar 15 02:14:05 2000 PST | @ 3 mons                      | Thu Jun 15 02:14:05 2000 PDT
-     | Wed Mar 15 03:14:04 2000 PST | @ 3 mons                      | Thu Jun 15 03:14:04 2000 PDT
-     | Wed Mar 15 08:14:01 2000 PST | @ 3 mons                      | Thu Jun 15 08:14:01 2000 PDT
-     | Wed Mar 15 12:14:03 2000 PST | @ 3 mons                      | Thu Jun 15 12:14:03 2000 PDT
-     | Wed Mar 15 13:14:02 2000 PST | @ 3 mons                      | Thu Jun 15 13:14:02 2000 PDT
-     | Wed Mar 15 02:14:05 2000 PST | @ 5 mons                      | Tue Aug 15 02:14:05 2000 PDT
-     | Wed Mar 15 03:14:04 2000 PST | @ 5 mons                      | Tue Aug 15 03:14:04 2000 PDT
-     | Wed Mar 15 08:14:01 2000 PST | @ 5 mons                      | Tue Aug 15 08:14:01 2000 PDT
-     | Wed Mar 15 12:14:03 2000 PST | @ 5 mons                      | Tue Aug 15 12:14:03 2000 PDT
-     | Wed Mar 15 13:14:02 2000 PST | @ 5 mons                      | Tue Aug 15 13:14:02 2000 PDT
-     | Wed Mar 15 02:14:05 2000 PST | @ 5 mons 12 hours             | Tue Aug 15 14:14:05 2000 PDT
-     | Wed Mar 15 03:14:04 2000 PST | @ 5 mons 12 hours             | Tue Aug 15 15:14:04 2000 PDT
-     | Wed Mar 15 08:14:01 2000 PST | @ 5 mons 12 hours             | Tue Aug 15 20:14:01 2000 PDT
-     | Wed Mar 15 12:14:03 2000 PST | @ 5 mons 12 hours             | Wed Aug 16 00:14:03 2000 PDT
-     | Wed Mar 15 13:14:02 2000 PST | @ 5 mons 12 hours             | Wed Aug 16 01:14:02 2000 PDT
-     | Sun Dec 31 17:32:01 2000 PST | @ 14 secs ago                 | Sun Dec 31 17:31:47 2000 PST
-     | Sun Dec 31 17:32:01 2000 PST | @ 1 min                       | Sun Dec 31 17:33:01 2000 PST
-     | Sun Dec 31 17:32:01 2000 PST | @ 5 hours                     | Sun Dec 31 22:32:01 2000 PST
-     | Mon Jan 01 17:32:01 2001 PST | @ 14 secs ago                 | Mon Jan 01 17:31:47 2001 PST
-     | Mon Jan 01 17:32:01 2001 PST | @ 1 min                       | Mon Jan 01 17:33:01 2001 PST
-     | Sun Dec 31 17:32:01 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Mon Jan 01 19:35:05 2001 PST
-     | Mon Jan 01 17:32:01 2001 PST | @ 5 hours                     | Mon Jan 01 22:32:01 2001 PST
-     | Mon Jan 01 17:32:01 2001 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Jan 02 19:35:05 2001 PST
-     | Sun Dec 31 17:32:01 2000 PST | @ 10 days                     | Wed Jan 10 17:32:01 2001 PST
-     | Mon Jan 01 17:32:01 2001 PST | @ 10 days                     | Thu Jan 11 17:32:01 2001 PST
-     | Sun Dec 31 17:32:01 2000 PST | @ 3 mons                      | Sat Mar 31 17:32:01 2001 PST
-     | Mon Jan 01 17:32:01 2001 PST | @ 3 mons                      | Sun Apr 01 17:32:01 2001 PDT
-     | Sun Dec 31 17:32:01 2000 PST | @ 5 mons                      | Thu May 31 17:32:01 2001 PDT
-     | Sun Dec 31 17:32:01 2000 PST | @ 5 mons 12 hours             | Fri Jun 01 05:32:01 2001 PDT
-     | Mon Jan 01 17:32:01 2001 PST | @ 5 mons                      | Fri Jun 01 17:32:01 2001 PDT
-     | Mon Jan 01 17:32:01 2001 PST | @ 5 mons 12 hours             | Sat Jun 02 05:32:01 2001 PDT
-     | Sat Sep 22 18:19:20 2001 PDT | @ 14 secs ago                 | Sat Sep 22 18:19:06 2001 PDT
-     | Sat Sep 22 18:19:20 2001 PDT | @ 1 min                       | Sat Sep 22 18:20:20 2001 PDT
-     | Sat Sep 22 18:19:20 2001 PDT | @ 5 hours                     | Sat Sep 22 23:19:20 2001 PDT
-     | Sat Sep 22 18:19:20 2001 PDT | @ 1 day 2 hours 3 mins 4 secs | Sun Sep 23 20:22:24 2001 PDT
-     | Sat Sep 22 18:19:20 2001 PDT | @ 10 days                     | Tue Oct 02 18:19:20 2001 PDT
-     | Sat Sep 22 18:19:20 2001 PDT | @ 3 mons                      | Sat Dec 22 18:19:20 2001 PST
-     | Sat Sep 22 18:19:20 2001 PDT | @ 5 mons                      | Fri Feb 22 18:19:20 2002 PST
-     | Sat Sep 22 18:19:20 2001 PDT | @ 5 mons 12 hours             | Sat Feb 23 06:19:20 2002 PST
-     | Wed Feb 28 17:32:01 1996 PST | @ 6 years                     | Thu Feb 28 17:32:01 2002 PST
-     | Thu Feb 29 17:32:01 1996 PST | @ 6 years                     | Thu Feb 28 17:32:01 2002 PST
-     | Fri Mar 01 17:32:01 1996 PST | @ 6 years                     | Fri Mar 01 17:32:01 2002 PST
-     | Mon Dec 30 17:32:01 1996 PST | @ 6 years                     | Mon Dec 30 17:32:01 2002 PST
-     | Tue Dec 31 17:32:01 1996 PST | @ 6 years                     | Tue Dec 31 17:32:01 2002 PST
-     | Thu Jan 01 00:00:00 1970 PST | @ 34 years                    | Thu Jan 01 00:00:00 2004 PST
-     | Fri Dec 31 17:32:01 1999 PST | @ 6 years                     | Sat Dec 31 17:32:01 2005 PST
-     | Sat Jan 01 17:32:01 2000 PST | @ 6 years                     | Sun Jan 01 17:32:01 2006 PST
-     | Wed Mar 15 02:14:05 2000 PST | @ 6 years                     | Wed Mar 15 02:14:05 2006 PST
-     | Wed Mar 15 03:14:04 2000 PST | @ 6 years                     | Wed Mar 15 03:14:04 2006 PST
-     | Wed Mar 15 08:14:01 2000 PST | @ 6 years                     | Wed Mar 15 08:14:01 2006 PST
-     | Wed Mar 15 12:14:03 2000 PST | @ 6 years                     | Wed Mar 15 12:14:03 2006 PST
-     | Wed Mar 15 13:14:02 2000 PST | @ 6 years                     | Wed Mar 15 13:14:02 2006 PST
-     | Sun Dec 31 17:32:01 2000 PST | @ 6 years                     | Sun Dec 31 17:32:01 2006 PST
-     | Mon Jan 01 17:32:01 2001 PST | @ 6 years                     | Mon Jan 01 17:32:01 2007 PST
-     | Sat Sep 22 18:19:20 2001 PDT | @ 6 years                     | Sat Sep 22 18:19:20 2007 PDT
-     | Wed Feb 28 17:32:01 1996 PST | @ 34 years                    | Thu Feb 28 17:32:01 2030 PST
-     | Thu Feb 29 17:32:01 1996 PST | @ 34 years                    | Thu Feb 28 17:32:01 2030 PST
-     | Fri Mar 01 17:32:01 1996 PST | @ 34 years                    | Fri Mar 01 17:32:01 2030 PST
-     | Mon Dec 30 17:32:01 1996 PST | @ 34 years                    | Mon Dec 30 17:32:01 2030 PST
-     | Tue Dec 31 17:32:01 1996 PST | @ 34 years                    | Tue Dec 31 17:32:01 2030 PST
-     | Fri Dec 31 17:32:01 1999 PST | @ 34 years                    | Sat Dec 31 17:32:01 2033 PST
-     | Sat Jan 01 17:32:01 2000 PST | @ 34 years                    | Sun Jan 01 17:32:01 2034 PST
-     | Wed Mar 15 02:14:05 2000 PST | @ 34 years                    | Wed Mar 15 02:14:05 2034 PDT
-     | Wed Mar 15 03:14:04 2000 PST | @ 34 years                    | Wed Mar 15 03:14:04 2034 PDT
-     | Wed Mar 15 08:14:01 2000 PST | @ 34 years                    | Wed Mar 15 08:14:01 2034 PDT
-     | Wed Mar 15 12:14:03 2000 PST | @ 34 years                    | Wed Mar 15 12:14:03 2034 PDT
-     | Wed Mar 15 13:14:02 2000 PST | @ 34 years                    | Wed Mar 15 13:14:02 2034 PDT
-     | Sun Dec 31 17:32:01 2000 PST | @ 34 years                    | Sun Dec 31 17:32:01 2034 PST
-     | Mon Jan 01 17:32:01 2001 PST | @ 34 years                    | Mon Jan 01 17:32:01 2035 PST
-     | Sat Sep 22 18:19:20 2001 PDT | @ 34 years                    | Sat Sep 22 18:19:20 2035 PDT
-(160 rows)
-
+ERROR:  failed to JIT: evalexpr.2.0
 SELECT '' AS "160", d.f1 AS "timestamp", t.f1 AS "interval", d.f1 - t.f1 AS minus
   FROM TEMP_TIMESTAMP d, INTERVAL_TBL t
   WHERE isfinite(d.f1)
   ORDER BY minus, "timestamp", "interval";
- 160 |          timestamp           |           interval            |            minus             
------+------------------------------+-------------------------------+------------------------------
-     | Thu Jan 01 00:00:00 1970 PST | @ 34 years                    | Wed Jan 01 00:00:00 1936 PST
-     | Wed Feb 28 17:32:01 1996 PST | @ 34 years                    | Wed Feb 28 17:32:01 1962 PST
-     | Thu Feb 29 17:32:01 1996 PST | @ 34 years                    | Wed Feb 28 17:32:01 1962 PST
-     | Fri Mar 01 17:32:01 1996 PST | @ 34 years                    | Thu Mar 01 17:32:01 1962 PST
-     | Mon Dec 30 17:32:01 1996 PST | @ 34 years                    | Sun Dec 30 17:32:01 1962 PST
-     | Tue Dec 31 17:32:01 1996 PST | @ 34 years                    | Mon Dec 31 17:32:01 1962 PST
-     | Thu Jan 01 00:00:00 1970 PST | @ 6 years                     | Wed Jan 01 00:00:00 1964 PST
-     | Fri Dec 31 17:32:01 1999 PST | @ 34 years                    | Fri Dec 31 17:32:01 1965 PST
-     | Sat Jan 01 17:32:01 2000 PST | @ 34 years                    | Sat Jan 01 17:32:01 1966 PST
-     | Wed Mar 15 02:14:05 2000 PST | @ 34 years                    | Tue Mar 15 02:14:05 1966 PST
-     | Wed Mar 15 03:14:04 2000 PST | @ 34 years                    | Tue Mar 15 03:14:04 1966 PST
-     | Wed Mar 15 08:14:01 2000 PST | @ 34 years                    | Tue Mar 15 08:14:01 1966 PST
-     | Wed Mar 15 12:14:03 2000 PST | @ 34 years                    | Tue Mar 15 12:14:03 1966 PST
-     | Wed Mar 15 13:14:02 2000 PST | @ 34 years                    | Tue Mar 15 13:14:02 1966 PST
-     | Sun Dec 31 17:32:01 2000 PST | @ 34 years                    | Sat Dec 31 17:32:01 1966 PST
-     | Mon Jan 01 17:32:01 2001 PST | @ 34 years                    | Sun Jan 01 17:32:01 1967 PST
-     | Sat Sep 22 18:19:20 2001 PDT | @ 34 years                    | Fri Sep 22 18:19:20 1967 PDT
-     | Thu Jan 01 00:00:00 1970 PST | @ 5 mons 12 hours             | Thu Jul 31 12:00:00 1969 PDT
-     | Thu Jan 01 00:00:00 1970 PST | @ 5 mons                      | Fri Aug 01 00:00:00 1969 PDT
-     | Thu Jan 01 00:00:00 1970 PST | @ 3 mons                      | Wed Oct 01 00:00:00 1969 PDT
-     | Thu Jan 01 00:00:00 1970 PST | @ 10 days                     | Mon Dec 22 00:00:00 1969 PST
-     | Thu Jan 01 00:00:00 1970 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Dec 30 21:56:56 1969 PST
-     | Thu Jan 01 00:00:00 1970 PST | @ 5 hours                     | Wed Dec 31 19:00:00 1969 PST
-     | Thu Jan 01 00:00:00 1970 PST | @ 1 min                       | Wed Dec 31 23:59:00 1969 PST
-     | Thu Jan 01 00:00:00 1970 PST | @ 14 secs ago                 | Thu Jan 01 00:00:14 1970 PST
-     | Wed Feb 28 17:32:01 1996 PST | @ 6 years                     | Wed Feb 28 17:32:01 1990 PST
-     | Thu Feb 29 17:32:01 1996 PST | @ 6 years                     | Wed Feb 28 17:32:01 1990 PST
-     | Fri Mar 01 17:32:01 1996 PST | @ 6 years                     | Thu Mar 01 17:32:01 1990 PST
-     | Mon Dec 30 17:32:01 1996 PST | @ 6 years                     | Sun Dec 30 17:32:01 1990 PST
-     | Tue Dec 31 17:32:01 1996 PST | @ 6 years                     | Mon Dec 31 17:32:01 1990 PST
-     | Fri Dec 31 17:32:01 1999 PST | @ 6 years                     | Fri Dec 31 17:32:01 1993 PST
-     | Sat Jan 01 17:32:01 2000 PST | @ 6 years                     | Sat Jan 01 17:32:01 1994 PST
-     | Wed Mar 15 02:14:05 2000 PST | @ 6 years                     | Tue Mar 15 02:14:05 1994 PST
-     | Wed Mar 15 03:14:04 2000 PST | @ 6 years                     | Tue Mar 15 03:14:04 1994 PST
-     | Wed Mar 15 08:14:01 2000 PST | @ 6 years                     | Tue Mar 15 08:14:01 1994 PST
-     | Wed Mar 15 12:14:03 2000 PST | @ 6 years                     | Tue Mar 15 12:14:03 1994 PST
-     | Wed Mar 15 13:14:02 2000 PST | @ 6 years                     | Tue Mar 15 13:14:02 1994 PST
-     | Sun Dec 31 17:32:01 2000 PST | @ 6 years                     | Sat Dec 31 17:32:01 1994 PST
-     | Mon Jan 01 17:32:01 2001 PST | @ 6 years                     | Sun Jan 01 17:32:01 1995 PST
-     | Sat Sep 22 18:19:20 2001 PDT | @ 6 years                     | Fri Sep 22 18:19:20 1995 PDT
-     | Wed Feb 28 17:32:01 1996 PST | @ 5 mons 12 hours             | Thu Sep 28 05:32:01 1995 PDT
-     | Wed Feb 28 17:32:01 1996 PST | @ 5 mons                      | Thu Sep 28 17:32:01 1995 PDT
-     | Thu Feb 29 17:32:01 1996 PST | @ 5 mons 12 hours             | Fri Sep 29 05:32:01 1995 PDT
-     | Thu Feb 29 17:32:01 1996 PST | @ 5 mons                      | Fri Sep 29 17:32:01 1995 PDT
-     | Fri Mar 01 17:32:01 1996 PST | @ 5 mons 12 hours             | Sun Oct 01 05:32:01 1995 PDT
-     | Fri Mar 01 17:32:01 1996 PST | @ 5 mons                      | Sun Oct 01 17:32:01 1995 PDT
-     | Wed Feb 28 17:32:01 1996 PST | @ 3 mons                      | Tue Nov 28 17:32:01 1995 PST
-     | Thu Feb 29 17:32:01 1996 PST | @ 3 mons                      | Wed Nov 29 17:32:01 1995 PST
-     | Fri Mar 01 17:32:01 1996 PST | @ 3 mons                      | Fri Dec 01 17:32:01 1995 PST
-     | Wed Feb 28 17:32:01 1996 PST | @ 10 days                     | Sun Feb 18 17:32:01 1996 PST
-     | Thu Feb 29 17:32:01 1996 PST | @ 10 days                     | Mon Feb 19 17:32:01 1996 PST
-     | Fri Mar 01 17:32:01 1996 PST | @ 10 days                     | Tue Feb 20 17:32:01 1996 PST
-     | Wed Feb 28 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Feb 27 15:28:57 1996 PST
-     | Wed Feb 28 17:32:01 1996 PST | @ 5 hours                     | Wed Feb 28 12:32:01 1996 PST
-     | Thu Feb 29 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Wed Feb 28 15:28:57 1996 PST
-     | Wed Feb 28 17:32:01 1996 PST | @ 1 min                       | Wed Feb 28 17:31:01 1996 PST
-     | Wed Feb 28 17:32:01 1996 PST | @ 14 secs ago                 | Wed Feb 28 17:32:15 1996 PST
-     | Thu Feb 29 17:32:01 1996 PST | @ 5 hours                     | Thu Feb 29 12:32:01 1996 PST
-     | Fri Mar 01 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Thu Feb 29 15:28:57 1996 PST
-     | Thu Feb 29 17:32:01 1996 PST | @ 1 min                       | Thu Feb 29 17:31:01 1996 PST
-     | Thu Feb 29 17:32:01 1996 PST | @ 14 secs ago                 | Thu Feb 29 17:32:15 1996 PST
-     | Fri Mar 01 17:32:01 1996 PST | @ 5 hours                     | Fri Mar 01 12:32:01 1996 PST
-     | Fri Mar 01 17:32:01 1996 PST | @ 1 min                       | Fri Mar 01 17:31:01 1996 PST
-     | Fri Mar 01 17:32:01 1996 PST | @ 14 secs ago                 | Fri Mar 01 17:32:15 1996 PST
-     | Mon Dec 30 17:32:01 1996 PST | @ 5 mons 12 hours             | Tue Jul 30 05:32:01 1996 PDT
-     | Mon Dec 30 17:32:01 1996 PST | @ 5 mons                      | Tue Jul 30 17:32:01 1996 PDT
-     | Tue Dec 31 17:32:01 1996 PST | @ 5 mons 12 hours             | Wed Jul 31 05:32:01 1996 PDT
-     | Tue Dec 31 17:32:01 1996 PST | @ 5 mons                      | Wed Jul 31 17:32:01 1996 PDT
-     | Mon Dec 30 17:32:01 1996 PST | @ 3 mons                      | Mon Sep 30 17:32:01 1996 PDT
-     | Tue Dec 31 17:32:01 1996 PST | @ 3 mons                      | Mon Sep 30 17:32:01 1996 PDT
-     | Mon Dec 30 17:32:01 1996 PST | @ 10 days                     | Fri Dec 20 17:32:01 1996 PST
-     | Tue Dec 31 17:32:01 1996 PST | @ 10 days                     | Sat Dec 21 17:32:01 1996 PST
-     | Mon Dec 30 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Sun Dec 29 15:28:57 1996 PST
-     | Mon Dec 30 17:32:01 1996 PST | @ 5 hours                     | Mon Dec 30 12:32:01 1996 PST
-     | Tue Dec 31 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Mon Dec 30 15:28:57 1996 PST
-     | Mon Dec 30 17:32:01 1996 PST | @ 1 min                       | Mon Dec 30 17:31:01 1996 PST
-     | Mon Dec 30 17:32:01 1996 PST | @ 14 secs ago                 | Mon Dec 30 17:32:15 1996 PST
-     | Tue Dec 31 17:32:01 1996 PST | @ 5 hours                     | Tue Dec 31 12:32:01 1996 PST
-     | Tue Dec 31 17:32:01 1996 PST | @ 1 min                       | Tue Dec 31 17:31:01 1996 PST
-     | Tue Dec 31 17:32:01 1996 PST | @ 14 secs ago                 | Tue Dec 31 17:32:15 1996 PST
-     | Fri Dec 31 17:32:01 1999 PST | @ 5 mons 12 hours             | Sat Jul 31 05:32:01 1999 PDT
-     | Fri Dec 31 17:32:01 1999 PST | @ 5 mons                      | Sat Jul 31 17:32:01 1999 PDT
-     | Sat Jan 01 17:32:01 2000 PST | @ 5 mons 12 hours             | Sun Aug 01 05:32:01 1999 PDT
-     | Sat Jan 01 17:32:01 2000 PST | @ 5 mons                      | Sun Aug 01 17:32:01 1999 PDT
-     | Fri Dec 31 17:32:01 1999 PST | @ 3 mons                      | Thu Sep 30 17:32:01 1999 PDT
-     | Sat Jan 01 17:32:01 2000 PST | @ 3 mons                      | Fri Oct 01 17:32:01 1999 PDT
-     | Wed Mar 15 02:14:05 2000 PST | @ 5 mons 12 hours             | Thu Oct 14 14:14:05 1999 PDT
-     | Wed Mar 15 03:14:04 2000 PST | @ 5 mons 12 hours             | Thu Oct 14 15:14:04 1999 PDT
-     | Wed Mar 15 08:14:01 2000 PST | @ 5 mons 12 hours             | Thu Oct 14 20:14:01 1999 PDT
-     | Wed Mar 15 12:14:03 2000 PST | @ 5 mons 12 hours             | Fri Oct 15 00:14:03 1999 PDT
-     | Wed Mar 15 13:14:02 2000 PST | @ 5 mons 12 hours             | Fri Oct 15 01:14:02 1999 PDT
-     | Wed Mar 15 02:14:05 2000 PST | @ 5 mons                      | Fri Oct 15 02:14:05 1999 PDT
-     | Wed Mar 15 03:14:04 2000 PST | @ 5 mons                      | Fri Oct 15 03:14:04 1999 PDT
-     | Wed Mar 15 08:14:01 2000 PST | @ 5 mons                      | Fri Oct 15 08:14:01 1999 PDT
-     | Wed Mar 15 12:14:03 2000 PST | @ 5 mons                      | Fri Oct 15 12:14:03 1999 PDT
-     | Wed Mar 15 13:14:02 2000 PST | @ 5 mons                      | Fri Oct 15 13:14:02 1999 PDT
-     | Wed Mar 15 02:14:05 2000 PST | @ 3 mons                      | Wed Dec 15 02:14:05 1999 PST
-     | Wed Mar 15 03:14:04 2000 PST | @ 3 mons                      | Wed Dec 15 03:14:04 1999 PST
-     | Wed Mar 15 08:14:01 2000 PST | @ 3 mons                      | Wed Dec 15 08:14:01 1999 PST
-     | Wed Mar 15 12:14:03 2000 PST | @ 3 mons                      | Wed Dec 15 12:14:03 1999 PST
-     | Wed Mar 15 13:14:02 2000 PST | @ 3 mons                      | Wed Dec 15 13:14:02 1999 PST
-     | Fri Dec 31 17:32:01 1999 PST | @ 10 days                     | Tue Dec 21 17:32:01 1999 PST
-     | Sat Jan 01 17:32:01 2000 PST | @ 10 days                     | Wed Dec 22 17:32:01 1999 PST
-     | Fri Dec 31 17:32:01 1999 PST | @ 1 day 2 hours 3 mins 4 secs | Thu Dec 30 15:28:57 1999 PST
-     | Fri Dec 31 17:32:01 1999 PST | @ 5 hours                     | Fri Dec 31 12:32:01 1999 PST
-     | Sat Jan 01 17:32:01 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Fri Dec 31 15:28:57 1999 PST
-     | Fri Dec 31 17:32:01 1999 PST | @ 1 min                       | Fri Dec 31 17:31:01 1999 PST
-     | Fri Dec 31 17:32:01 1999 PST | @ 14 secs ago                 | Fri Dec 31 17:32:15 1999 PST
-     | Sat Jan 01 17:32:01 2000 PST | @ 5 hours                     | Sat Jan 01 12:32:01 2000 PST
-     | Sat Jan 01 17:32:01 2000 PST | @ 1 min                       | Sat Jan 01 17:31:01 2000 PST
-     | Sat Jan 01 17:32:01 2000 PST | @ 14 secs ago                 | Sat Jan 01 17:32:15 2000 PST
-     | Wed Mar 15 02:14:05 2000 PST | @ 10 days                     | Sun Mar 05 02:14:05 2000 PST
-     | Wed Mar 15 03:14:04 2000 PST | @ 10 days                     | Sun Mar 05 03:14:04 2000 PST
-     | Wed Mar 15 08:14:01 2000 PST | @ 10 days                     | Sun Mar 05 08:14:01 2000 PST
-     | Wed Mar 15 12:14:03 2000 PST | @ 10 days                     | Sun Mar 05 12:14:03 2000 PST
-     | Wed Mar 15 13:14:02 2000 PST | @ 10 days                     | Sun Mar 05 13:14:02 2000 PST
-     | Wed Mar 15 02:14:05 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Mar 14 00:11:01 2000 PST
-     | Wed Mar 15 03:14:04 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Mar 14 01:11:00 2000 PST
-     | Wed Mar 15 08:14:01 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Mar 14 06:10:57 2000 PST
-     | Wed Mar 15 12:14:03 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Mar 14 10:10:59 2000 PST
-     | Wed Mar 15 13:14:02 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Mar 14 11:10:58 2000 PST
-     | Wed Mar 15 02:14:05 2000 PST | @ 5 hours                     | Tue Mar 14 21:14:05 2000 PST
-     | Wed Mar 15 03:14:04 2000 PST | @ 5 hours                     | Tue Mar 14 22:14:04 2000 PST
-     | Wed Mar 15 02:14:05 2000 PST | @ 1 min                       | Wed Mar 15 02:13:05 2000 PST
-     | Wed Mar 15 02:14:05 2000 PST | @ 14 secs ago                 | Wed Mar 15 02:14:19 2000 PST
-     | Wed Mar 15 03:14:04 2000 PST | @ 1 min                       | Wed Mar 15 03:13:04 2000 PST
-     | Wed Mar 15 08:14:01 2000 PST | @ 5 hours                     | Wed Mar 15 03:14:01 2000 PST
-     | Wed Mar 15 03:14:04 2000 PST | @ 14 secs ago                 | Wed Mar 15 03:14:18 2000 PST
-     | Wed Mar 15 12:14:03 2000 PST | @ 5 hours                     | Wed Mar 15 07:14:03 2000 PST
-     | Wed Mar 15 08:14:01 2000 PST | @ 1 min                       | Wed Mar 15 08:13:01 2000 PST
-     | Wed Mar 15 13:14:02 2000 PST | @ 5 hours                     | Wed Mar 15 08:14:02 2000 PST
-     | Wed Mar 15 08:14:01 2000 PST | @ 14 secs ago                 | Wed Mar 15 08:14:15 2000 PST
-     | Wed Mar 15 12:14:03 2000 PST | @ 1 min                       | Wed Mar 15 12:13:03 2000 PST
-     | Wed Mar 15 12:14:03 2000 PST | @ 14 secs ago                 | Wed Mar 15 12:14:17 2000 PST
-     | Wed Mar 15 13:14:02 2000 PST | @ 1 min                       | Wed Mar 15 13:13:02 2000 PST
-     | Wed Mar 15 13:14:02 2000 PST | @ 14 secs ago                 | Wed Mar 15 13:14:16 2000 PST
-     | Sun Dec 31 17:32:01 2000 PST | @ 5 mons 12 hours             | Mon Jul 31 05:32:01 2000 PDT
-     | Sun Dec 31 17:32:01 2000 PST | @ 5 mons                      | Mon Jul 31 17:32:01 2000 PDT
-     | Mon Jan 01 17:32:01 2001 PST | @ 5 mons 12 hours             | Tue Aug 01 05:32:01 2000 PDT
-     | Mon Jan 01 17:32:01 2001 PST | @ 5 mons                      | Tue Aug 01 17:32:01 2000 PDT
-     | Sun Dec 31 17:32:01 2000 PST | @ 3 mons                      | Sat Sep 30 17:32:01 2000 PDT
-     | Mon Jan 01 17:32:01 2001 PST | @ 3 mons                      | Sun Oct 01 17:32:01 2000 PDT
-     | Sun Dec 31 17:32:01 2000 PST | @ 10 days                     | Thu Dec 21 17:32:01 2000 PST
-     | Mon Jan 01 17:32:01 2001 PST | @ 10 days                     | Fri Dec 22 17:32:01 2000 PST
-     | Sun Dec 31 17:32:01 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Sat Dec 30 15:28:57 2000 PST
-     | Sun Dec 31 17:32:01 2000 PST | @ 5 hours                     | Sun Dec 31 12:32:01 2000 PST
-     | Mon Jan 01 17:32:01 2001 PST | @ 1 day 2 hours 3 mins 4 secs | Sun Dec 31 15:28:57 2000 PST
-     | Sun Dec 31 17:32:01 2000 PST | @ 1 min                       | Sun Dec 31 17:31:01 2000 PST
-     | Sun Dec 31 17:32:01 2000 PST | @ 14 secs ago                 | Sun Dec 31 17:32:15 2000 PST
-     | Mon Jan 01 17:32:01 2001 PST | @ 5 hours                     | Mon Jan 01 12:32:01 2001 PST
-     | Mon Jan 01 17:32:01 2001 PST | @ 1 min                       | Mon Jan 01 17:31:01 2001 PST
-     | Mon Jan 01 17:32:01 2001 PST | @ 14 secs ago                 | Mon Jan 01 17:32:15 2001 PST
-     | Sat Sep 22 18:19:20 2001 PDT | @ 5 mons 12 hours             | Sun Apr 22 06:19:20 2001 PDT
-     | Sat Sep 22 18:19:20 2001 PDT | @ 5 mons                      | Sun Apr 22 18:19:20 2001 PDT
-     | Sat Sep 22 18:19:20 2001 PDT | @ 3 mons                      | Fri Jun 22 18:19:20 2001 PDT
-     | Sat Sep 22 18:19:20 2001 PDT | @ 10 days                     | Wed Sep 12 18:19:20 2001 PDT
-     | Sat Sep 22 18:19:20 2001 PDT | @ 1 day 2 hours 3 mins 4 secs | Fri Sep 21 16:16:16 2001 PDT
-     | Sat Sep 22 18:19:20 2001 PDT | @ 5 hours                     | Sat Sep 22 13:19:20 2001 PDT
-     | Sat Sep 22 18:19:20 2001 PDT | @ 1 min                       | Sat Sep 22 18:18:20 2001 PDT
-     | Sat Sep 22 18:19:20 2001 PDT | @ 14 secs ago                 | Sat Sep 22 18:19:34 2001 PDT
-(160 rows)
-
+ERROR:  failed to JIT: evalexpr.3.0
 SELECT '' AS "16", d.f1 AS "timestamp",
    timestamp with time zone '1980-01-06 00:00 GMT' AS gpstime_zero,
    d.f1 - timestamp with time zone '1980-01-06 00:00 GMT' AS difference
@@ -1786,266 +1234,7 @@
 SELECT '' AS "226", d1.f1 AS timestamp1, d2.f1 AS timestamp2, d1.f1 - d2.f1 AS difference
   FROM TEMP_TIMESTAMP d1, TEMP_TIMESTAMP d2
   ORDER BY timestamp1, timestamp2, difference;
- 226 |          timestamp1          |          timestamp2          |                difference                 
------+------------------------------+------------------------------+-------------------------------------------
-     | Thu Jan 01 00:00:00 1970 PST | Thu Jan 01 00:00:00 1970 PST | @ 0
-     | Thu Jan 01 00:00:00 1970 PST | Wed Feb 28 17:32:01 1996 PST | @ 9554 days 17 hours 32 mins 1 sec ago
-     | Thu Jan 01 00:00:00 1970 PST | Thu Feb 29 17:32:01 1996 PST | @ 9555 days 17 hours 32 mins 1 sec ago
-     | Thu Jan 01 00:00:00 1970 PST | Fri Mar 01 17:32:01 1996 PST | @ 9556 days 17 hours 32 mins 1 sec ago
-     | Thu Jan 01 00:00:00 1970 PST | Mon Dec 30 17:32:01 1996 PST | @ 9860 days 17 hours 32 mins 1 sec ago
-     | Thu Jan 01 00:00:00 1970 PST | Tue Dec 31 17:32:01 1996 PST | @ 9861 days 17 hours 32 mins 1 sec ago
-     | Thu Jan 01 00:00:00 1970 PST | Fri Dec 31 17:32:01 1999 PST | @ 10956 days 17 hours 32 mins 1 sec ago
-     | Thu Jan 01 00:00:00 1970 PST | Sat Jan 01 17:32:01 2000 PST | @ 10957 days 17 hours 32 mins 1 sec ago
-     | Thu Jan 01 00:00:00 1970 PST | Wed Mar 15 02:14:05 2000 PST | @ 11031 days 2 hours 14 mins 5 secs ago
-     | Thu Jan 01 00:00:00 1970 PST | Wed Mar 15 03:14:04 2000 PST | @ 11031 days 3 hours 14 mins 4 secs ago
-     | Thu Jan 01 00:00:00 1970 PST | Wed Mar 15 08:14:01 2000 PST | @ 11031 days 8 hours 14 mins 1 sec ago
-     | Thu Jan 01 00:00:00 1970 PST | Wed Mar 15 12:14:03 2000 PST | @ 11031 days 12 hours 14 mins 3 secs ago
-     | Thu Jan 01 00:00:00 1970 PST | Wed Mar 15 13:14:02 2000 PST | @ 11031 days 13 hours 14 mins 2 secs ago
-     | Thu Jan 01 00:00:00 1970 PST | Sun Dec 31 17:32:01 2000 PST | @ 11322 days 17 hours 32 mins 1 sec ago
-     | Thu Jan 01 00:00:00 1970 PST | Mon Jan 01 17:32:01 2001 PST | @ 11323 days 17 hours 32 mins 1 sec ago
-     | Thu Jan 01 00:00:00 1970 PST | Sat Sep 22 18:19:20 2001 PDT | @ 11587 days 17 hours 19 mins 20 secs ago
-     | Wed Feb 28 17:32:01 1996 PST | Thu Jan 01 00:00:00 1970 PST | @ 9554 days 17 hours 32 mins 1 sec
-     | Wed Feb 28 17:32:01 1996 PST | Wed Feb 28 17:32:01 1996 PST | @ 0
-     | Wed Feb 28 17:32:01 1996 PST | Thu Feb 29 17:32:01 1996 PST | @ 1 day ago
-     | Wed Feb 28 17:32:01 1996 PST | Fri Mar 01 17:32:01 1996 PST | @ 2 days ago
-     | Wed Feb 28 17:32:01 1996 PST | Mon Dec 30 17:32:01 1996 PST | @ 306 days ago
-     | Wed Feb 28 17:32:01 1996 PST | Tue Dec 31 17:32:01 1996 PST | @ 307 days ago
-     | Wed Feb 28 17:32:01 1996 PST | Fri Dec 31 17:32:01 1999 PST | @ 1402 days ago
-     | Wed Feb 28 17:32:01 1996 PST | Sat Jan 01 17:32:01 2000 PST | @ 1403 days ago
-     | Wed Feb 28 17:32:01 1996 PST | Wed Mar 15 02:14:05 2000 PST | @ 1476 days 8 hours 42 mins 4 secs ago
-     | Wed Feb 28 17:32:01 1996 PST | Wed Mar 15 03:14:04 2000 PST | @ 1476 days 9 hours 42 mins 3 secs ago
-     | Wed Feb 28 17:32:01 1996 PST | Wed Mar 15 08:14:01 2000 PST | @ 1476 days 14 hours 42 mins ago
-     | Wed Feb 28 17:32:01 1996 PST | Wed Mar 15 12:14:03 2000 PST | @ 1476 days 18 hours 42 mins 2 secs ago
-     | Wed Feb 28 17:32:01 1996 PST | Wed Mar 15 13:14:02 2000 PST | @ 1476 days 19 hours 42 mins 1 sec ago
-     | Wed Feb 28 17:32:01 1996 PST | Sun Dec 31 17:32:01 2000 PST | @ 1768 days ago
-     | Wed Feb 28 17:32:01 1996 PST | Mon Jan 01 17:32:01 2001 PST | @ 1769 days ago
-     | Wed Feb 28 17:32:01 1996 PST | Sat Sep 22 18:19:20 2001 PDT | @ 2032 days 23 hours 47 mins 19 secs ago
-     | Thu Feb 29 17:32:01 1996 PST | Thu Jan 01 00:00:00 1970 PST | @ 9555 days 17 hours 32 mins 1 sec
-     | Thu Feb 29 17:32:01 1996 PST | Wed Feb 28 17:32:01 1996 PST | @ 1 day
-     | Thu Feb 29 17:32:01 1996 PST | Thu Feb 29 17:32:01 1996 PST | @ 0
-     | Thu Feb 29 17:32:01 1996 PST | Fri Mar 01 17:32:01 1996 PST | @ 1 day ago
-     | Thu Feb 29 17:32:01 1996 PST | Mon Dec 30 17:32:01 1996 PST | @ 305 days ago
-     | Thu Feb 29 17:32:01 1996 PST | Tue Dec 31 17:32:01 1996 PST | @ 306 days ago
-     | Thu Feb 29 17:32:01 1996 PST | Fri Dec 31 17:32:01 1999 PST | @ 1401 days ago
-     | Thu Feb 29 17:32:01 1996 PST | Sat Jan 01 17:32:01 2000 PST | @ 1402 days ago
-     | Thu Feb 29 17:32:01 1996 PST | Wed Mar 15 02:14:05 2000 PST | @ 1475 days 8 hours 42 mins 4 secs ago
-     | Thu Feb 29 17:32:01 1996 PST | Wed Mar 15 03:14:04 2000 PST | @ 1475 days 9 hours 42 mins 3 secs ago
-     | Thu Feb 29 17:32:01 1996 PST | Wed Mar 15 08:14:01 2000 PST | @ 1475 days 14 hours 42 mins ago
-     | Thu Feb 29 17:32:01 1996 PST | Wed Mar 15 12:14:03 2000 PST | @ 1475 days 18 hours 42 mins 2 secs ago
-     | Thu Feb 29 17:32:01 1996 PST | Wed Mar 15 13:14:02 2000 PST | @ 1475 days 19 hours 42 mins 1 sec ago
-     | Thu Feb 29 17:32:01 1996 PST | Sun Dec 31 17:32:01 2000 PST | @ 1767 days ago
-     | Thu Feb 29 17:32:01 1996 PST | Mon Jan 01 17:32:01 2001 PST | @ 1768 days ago
-     | Thu Feb 29 17:32:01 1996 PST | Sat Sep 22 18:19:20 2001 PDT | @ 2031 days 23 hours 47 mins 19 secs ago
-     | Fri Mar 01 17:32:01 1996 PST | Thu Jan 01 00:00:00 1970 PST | @ 9556 days 17 hours 32 mins 1 sec
-     | Fri Mar 01 17:32:01 1996 PST | Wed Feb 28 17:32:01 1996 PST | @ 2 days
-     | Fri Mar 01 17:32:01 1996 PST | Thu Feb 29 17:32:01 1996 PST | @ 1 day
-     | Fri Mar 01 17:32:01 1996 PST | Fri Mar 01 17:32:01 1996 PST | @ 0
-     | Fri Mar 01 17:32:01 1996 PST | Mon Dec 30 17:32:01 1996 PST | @ 304 days ago
-     | Fri Mar 01 17:32:01 1996 PST | Tue Dec 31 17:32:01 1996 PST | @ 305 days ago
-     | Fri Mar 01 17:32:01 1996 PST | Fri Dec 31 17:32:01 1999 PST | @ 1400 days ago
-     | Fri Mar 01 17:32:01 1996 PST | Sat Jan 01 17:32:01 2000 PST | @ 1401 days ago
-     | Fri Mar 01 17:32:01 1996 PST | Wed Mar 15 02:14:05 2000 PST | @ 1474 days 8 hours 42 mins 4 secs ago
-     | Fri Mar 01 17:32:01 1996 PST | Wed Mar 15 03:14:04 2000 PST | @ 1474 days 9 hours 42 mins 3 secs ago
-     | Fri Mar 01 17:32:01 1996 PST | Wed Mar 15 08:14:01 2000 PST | @ 1474 days 14 hours 42 mins ago
-     | Fri Mar 01 17:32:01 1996 PST | Wed Mar 15 12:14:03 2000 PST | @ 1474 days 18 hours 42 mins 2 secs ago
-     | Fri Mar 01 17:32:01 1996 PST | Wed Mar 15 13:14:02 2000 PST | @ 1474 days 19 hours 42 mins 1 sec ago
-     | Fri Mar 01 17:32:01 1996 PST | Sun Dec 31 17:32:01 2000 PST | @ 1766 days ago
-     | Fri Mar 01 17:32:01 1996 PST | Mon Jan 01 17:32:01 2001 PST | @ 1767 days ago
-     | Fri Mar 01 17:32:01 1996 PST | Sat Sep 22 18:19:20 2001 PDT | @ 2030 days 23 hours 47 mins 19 secs ago
-     | Mon Dec 30 17:32:01 1996 PST | Thu Jan 01 00:00:00 1970 PST | @ 9860 days 17 hours 32 mins 1 sec
-     | Mon Dec 30 17:32:01 1996 PST | Wed Feb 28 17:32:01 1996 PST | @ 306 days
-     | Mon Dec 30 17:32:01 1996 PST | Thu Feb 29 17:32:01 1996 PST | @ 305 days
-     | Mon Dec 30 17:32:01 1996 PST | Fri Mar 01 17:32:01 1996 PST | @ 304 days
-     | Mon Dec 30 17:32:01 1996 PST | Mon Dec 30 17:32:01 1996 PST | @ 0
-     | Mon Dec 30 17:32:01 1996 PST | Tue Dec 31 17:32:01 1996 PST | @ 1 day ago
-     | Mon Dec 30 17:32:01 1996 PST | Fri Dec 31 17:32:01 1999 PST | @ 1096 days ago
-     | Mon Dec 30 17:32:01 1996 PST | Sat Jan 01 17:32:01 2000 PST | @ 1097 days ago
-     | Mon Dec 30 17:32:01 1996 PST | Wed Mar 15 02:14:05 2000 PST | @ 1170 days 8 hours 42 mins 4 secs ago
-     | Mon Dec 30 17:32:01 1996 PST | Wed Mar 15 03:14:04 2000 PST | @ 1170 days 9 hours 42 mins 3 secs ago
-     | Mon Dec 30 17:32:01 1996 PST | Wed Mar 15 08:14:01 2000 PST | @ 1170 days 14 hours 42 mins ago
-     | Mon Dec 30 17:32:01 1996 PST | Wed Mar 15 12:14:03 2000 PST | @ 1170 days 18 hours 42 mins 2 secs ago
-     | Mon Dec 30 17:32:01 1996 PST | Wed Mar 15 13:14:02 2000 PST | @ 1170 days 19 hours 42 mins 1 sec ago
-     | Mon Dec 30 17:32:01 1996 PST | Sun Dec 31 17:32:01 2000 PST | @ 1462 days ago
-     | Mon Dec 30 17:32:01 1996 PST | Mon Jan 01 17:32:01 2001 PST | @ 1463 days ago
-     | Mon Dec 30 17:32:01 1996 PST | Sat Sep 22 18:19:20 2001 PDT | @ 1726 days 23 hours 47 mins 19 secs ago
-     | Tue Dec 31 17:32:01 1996 PST | Thu Jan 01 00:00:00 1970 PST | @ 9861 days 17 hours 32 mins 1 sec
-     | Tue Dec 31 17:32:01 1996 PST | Wed Feb 28 17:32:01 1996 PST | @ 307 days
-     | Tue Dec 31 17:32:01 1996 PST | Thu Feb 29 17:32:01 1996 PST | @ 306 days
-     | Tue Dec 31 17:32:01 1996 PST | Fri Mar 01 17:32:01 1996 PST | @ 305 days
-     | Tue Dec 31 17:32:01 1996 PST | Mon Dec 30 17:32:01 1996 PST | @ 1 day
-     | Tue Dec 31 17:32:01 1996 PST | Tue Dec 31 17:32:01 1996 PST | @ 0
-     | Tue Dec 31 17:32:01 1996 PST | Fri Dec 31 17:32:01 1999 PST | @ 1095 days ago
-     | Tue Dec 31 17:32:01 1996 PST | Sat Jan 01 17:32:01 2000 PST | @ 1096 days ago
-     | Tue Dec 31 17:32:01 1996 PST | Wed Mar 15 02:14:05 2000 PST | @ 1169 days 8 hours 42 mins 4 secs ago
-     | Tue Dec 31 17:32:01 1996 PST | Wed Mar 15 03:14:04 2000 PST | @ 1169 days 9 hours 42 mins 3 secs ago
-     | Tue Dec 31 17:32:01 1996 PST | Wed Mar 15 08:14:01 2000 PST | @ 1169 days 14 hours 42 mins ago
-     | Tue Dec 31 17:32:01 1996 PST | Wed Mar 15 12:14:03 2000 PST | @ 1169 days 18 hours 42 mins 2 secs ago
-     | Tue Dec 31 17:32:01 1996 PST | Wed Mar 15 13:14:02 2000 PST | @ 1169 days 19 hours 42 mins 1 sec ago
-     | Tue Dec 31 17:32:01 1996 PST | Sun Dec 31 17:32:01 2000 PST | @ 1461 days ago
-     | Tue Dec 31 17:32:01 1996 PST | Mon Jan 01 17:32:01 2001 PST | @ 1462 days ago
-     | Tue Dec 31 17:32:01 1996 PST | Sat Sep 22 18:19:20 2001 PDT | @ 1725 days 23 hours 47 mins 19 secs ago
-     | Fri Dec 31 17:32:01 1999 PST | Thu Jan 01 00:00:00 1970 PST | @ 10956 days 17 hours 32 mins 1 sec
-     | Fri Dec 31 17:32:01 1999 PST | Wed Feb 28 17:32:01 1996 PST | @ 1402 days
-     | Fri Dec 31 17:32:01 1999 PST | Thu Feb 29 17:32:01 1996 PST | @ 1401 days
-     | Fri Dec 31 17:32:01 1999 PST | Fri Mar 01 17:32:01 1996 PST | @ 1400 days
-     | Fri Dec 31 17:32:01 1999 PST | Mon Dec 30 17:32:01 1996 PST | @ 1096 days
-     | Fri Dec 31 17:32:01 1999 PST | Tue Dec 31 17:32:01 1996 PST | @ 1095 days
-     | Fri Dec 31 17:32:01 1999 PST | Fri Dec 31 17:32:01 1999 PST | @ 0
-     | Fri Dec 31 17:32:01 1999 PST | Sat Jan 01 17:32:01 2000 PST | @ 1 day ago
-     | Fri Dec 31 17:32:01 1999 PST | Wed Mar 15 02:14:05 2000 PST | @ 74 days 8 hours 42 mins 4 secs ago
-     | Fri Dec 31 17:32:01 1999 PST | Wed Mar 15 03:14:04 2000 PST | @ 74 days 9 hours 42 mins 3 secs ago
-     | Fri Dec 31 17:32:01 1999 PST | Wed Mar 15 08:14:01 2000 PST | @ 74 days 14 hours 42 mins ago
-     | Fri Dec 31 17:32:01 1999 PST | Wed Mar 15 12:14:03 2000 PST | @ 74 days 18 hours 42 mins 2 secs ago
-     | Fri Dec 31 17:32:01 1999 PST | Wed Mar 15 13:14:02 2000 PST | @ 74 days 19 hours 42 mins 1 sec ago
-     | Fri Dec 31 17:32:01 1999 PST | Sun Dec 31 17:32:01 2000 PST | @ 366 days ago
-     | Fri Dec 31 17:32:01 1999 PST | Mon Jan 01 17:32:01 2001 PST | @ 367 days ago
-     | Fri Dec 31 17:32:01 1999 PST | Sat Sep 22 18:19:20 2001 PDT | @ 630 days 23 hours 47 mins 19 secs ago
-     | Sat Jan 01 17:32:01 2000 PST | Thu Jan 01 00:00:00 1970 PST | @ 10957 days 17 hours 32 mins 1 sec
-     | Sat Jan 01 17:32:01 2000 PST | Wed Feb 28 17:32:01 1996 PST | @ 1403 days
-     | Sat Jan 01 17:32:01 2000 PST | Thu Feb 29 17:32:01 1996 PST | @ 1402 days
-     | Sat Jan 01 17:32:01 2000 PST | Fri Mar 01 17:32:01 1996 PST | @ 1401 days
-     | Sat Jan 01 17:32:01 2000 PST | Mon Dec 30 17:32:01 1996 PST | @ 1097 days
-     | Sat Jan 01 17:32:01 2000 PST | Tue Dec 31 17:32:01 1996 PST | @ 1096 days
-     | Sat Jan 01 17:32:01 2000 PST | Fri Dec 31 17:32:01 1999 PST | @ 1 day
-     | Sat Jan 01 17:32:01 2000 PST | Sat Jan 01 17:32:01 2000 PST | @ 0
-     | Sat Jan 01 17:32:01 2000 PST | Wed Mar 15 02:14:05 2000 PST | @ 73 days 8 hours 42 mins 4 secs ago
-     | Sat Jan 01 17:32:01 2000 PST | Wed Mar 15 03:14:04 2000 PST | @ 73 days 9 hours 42 mins 3 secs ago
-     | Sat Jan 01 17:32:01 2000 PST | Wed Mar 15 08:14:01 2000 PST | @ 73 days 14 hours 42 mins ago
-     | Sat Jan 01 17:32:01 2000 PST | Wed Mar 15 12:14:03 2000 PST | @ 73 days 18 hours 42 mins 2 secs ago
-     | Sat Jan 01 17:32:01 2000 PST | Wed Mar 15 13:14:02 2000 PST | @ 73 days 19 hours 42 mins 1 sec ago
-     | Sat Jan 01 17:32:01 2000 PST | Sun Dec 31 17:32:01 2000 PST | @ 365 days ago
-     | Sat Jan 01 17:32:01 2000 PST | Mon Jan 01 17:32:01 2001 PST | @ 366 days ago
-     | Sat Jan 01 17:32:01 2000 PST | Sat Sep 22 18:19:20 2001 PDT | @ 629 days 23 hours 47 mins 19 secs ago
-     | Wed Mar 15 02:14:05 2000 PST | Thu Jan 01 00:00:00 1970 PST | @ 11031 days 2 hours 14 mins 5 secs
-     | Wed Mar 15 02:14:05 2000 PST | Wed Feb 28 17:32:01 1996 PST | @ 1476 days 8 hours 42 mins 4 secs
-     | Wed Mar 15 02:14:05 2000 PST | Thu Feb 29 17:32:01 1996 PST | @ 1475 days 8 hours 42 mins 4 secs
-     | Wed Mar 15 02:14:05 2000 PST | Fri Mar 01 17:32:01 1996 PST | @ 1474 days 8 hours 42 mins 4 secs
-     | Wed Mar 15 02:14:05 2000 PST | Mon Dec 30 17:32:01 1996 PST | @ 1170 days 8 hours 42 mins 4 secs
-     | Wed Mar 15 02:14:05 2000 PST | Tue Dec 31 17:32:01 1996 PST | @ 1169 days 8 hours 42 mins 4 secs
-     | Wed Mar 15 02:14:05 2000 PST | Fri Dec 31 17:32:01 1999 PST | @ 74 days 8 hours 42 mins 4 secs
-     | Wed Mar 15 02:14:05 2000 PST | Sat Jan 01 17:32:01 2000 PST | @ 73 days 8 hours 42 mins 4 secs
-     | Wed Mar 15 02:14:05 2000 PST | Wed Mar 15 02:14:05 2000 PST | @ 0
-     | Wed Mar 15 02:14:05 2000 PST | Wed Mar 15 03:14:04 2000 PST | @ 59 mins 59 secs ago
-     | Wed Mar 15 02:14:05 2000 PST | Wed Mar 15 08:14:01 2000 PST | @ 5 hours 59 mins 56 secs ago
-     | Wed Mar 15 02:14:05 2000 PST | Wed Mar 15 12:14:03 2000 PST | @ 9 hours 59 mins 58 secs ago
-     | Wed Mar 15 02:14:05 2000 PST | Wed Mar 15 13:14:02 2000 PST | @ 10 hours 59 mins 57 secs ago
-     | Wed Mar 15 02:14:05 2000 PST | Sun Dec 31 17:32:01 2000 PST | @ 291 days 15 hours 17 mins 56 secs ago
-     | Wed Mar 15 02:14:05 2000 PST | Mon Jan 01 17:32:01 2001 PST | @ 292 days 15 hours 17 mins 56 secs ago
-     | Wed Mar 15 02:14:05 2000 PST | Sat Sep 22 18:19:20 2001 PDT | @ 556 days 15 hours 5 mins 15 secs ago
-     | Wed Mar 15 03:14:04 2000 PST | Thu Jan 01 00:00:00 1970 PST | @ 11031 days 3 hours 14 mins 4 secs
-     | Wed Mar 15 03:14:04 2000 PST | Wed Feb 28 17:32:01 1996 PST | @ 1476 days 9 hours 42 mins 3 secs
-     | Wed Mar 15 03:14:04 2000 PST | Thu Feb 29 17:32:01 1996 PST | @ 1475 days 9 hours 42 mins 3 secs
-     | Wed Mar 15 03:14:04 2000 PST | Fri Mar 01 17:32:01 1996 PST | @ 1474 days 9 hours 42 mins 3 secs
-     | Wed Mar 15 03:14:04 2000 PST | Mon Dec 30 17:32:01 1996 PST | @ 1170 days 9 hours 42 mins 3 secs
-     | Wed Mar 15 03:14:04 2000 PST | Tue Dec 31 17:32:01 1996 PST | @ 1169 days 9 hours 42 mins 3 secs
-     | Wed Mar 15 03:14:04 2000 PST | Fri Dec 31 17:32:01 1999 PST | @ 74 days 9 hours 42 mins 3 secs
-     | Wed Mar 15 03:14:04 2000 PST | Sat Jan 01 17:32:01 2000 PST | @ 73 days 9 hours 42 mins 3 secs
-     | Wed Mar 15 03:14:04 2000 PST | Wed Mar 15 02:14:05 2000 PST | @ 59 mins 59 secs
-     | Wed Mar 15 03:14:04 2000 PST | Wed Mar 15 03:14:04 2000 PST | @ 0
-     | Wed Mar 15 03:14:04 2000 PST | Wed Mar 15 08:14:01 2000 PST | @ 4 hours 59 mins 57 secs ago
-     | Wed Mar 15 03:14:04 2000 PST | Wed Mar 15 12:14:03 2000 PST | @ 8 hours 59 mins 59 secs ago
-     | Wed Mar 15 03:14:04 2000 PST | Wed Mar 15 13:14:02 2000 PST | @ 9 hours 59 mins 58 secs ago
-     | Wed Mar 15 03:14:04 2000 PST | Sun Dec 31 17:32:01 2000 PST | @ 291 days 14 hours 17 mins 57 secs ago
-     | Wed Mar 15 03:14:04 2000 PST | Mon Jan 01 17:32:01 2001 PST | @ 292 days 14 hours 17 mins 57 secs ago
-     | Wed Mar 15 03:14:04 2000 PST | Sat Sep 22 18:19:20 2001 PDT | @ 556 days 14 hours 5 mins 16 secs ago
-     | Wed Mar 15 08:14:01 2000 PST | Thu Jan 01 00:00:00 1970 PST | @ 11031 days 8 hours 14 mins 1 sec
-     | Wed Mar 15 08:14:01 2000 PST | Wed Feb 28 17:32:01 1996 PST | @ 1476 days 14 hours 42 mins
-     | Wed Mar 15 08:14:01 2000 PST | Thu Feb 29 17:32:01 1996 PST | @ 1475 days 14 hours 42 mins
-     | Wed Mar 15 08:14:01 2000 PST | Fri Mar 01 17:32:01 1996 PST | @ 1474 days 14 hours 42 mins
-     | Wed Mar 15 08:14:01 2000 PST | Mon Dec 30 17:32:01 1996 PST | @ 1170 days 14 hours 42 mins
-     | Wed Mar 15 08:14:01 2000 PST | Tue Dec 31 17:32:01 1996 PST | @ 1169 days 14 hours 42 mins
-     | Wed Mar 15 08:14:01 2000 PST | Fri Dec 31 17:32:01 1999 PST | @ 74 days 14 hours 42 mins
-     | Wed Mar 15 08:14:01 2000 PST | Sat Jan 01 17:32:01 2000 PST | @ 73 days 14 hours 42 mins
-     | Wed Mar 15 08:14:01 2000 PST | Wed Mar 15 02:14:05 2000 PST | @ 5 hours 59 mins 56 secs
-     | Wed Mar 15 08:14:01 2000 PST | Wed Mar 15 03:14:04 2000 PST | @ 4 hours 59 mins 57 secs
-     | Wed Mar 15 08:14:01 2000 PST | Wed Mar 15 08:14:01 2000 PST | @ 0
-     | Wed Mar 15 08:14:01 2000 PST | Wed Mar 15 12:14:03 2000 PST | @ 4 hours 2 secs ago
-     | Wed Mar 15 08:14:01 2000 PST | Wed Mar 15 13:14:02 2000 PST | @ 5 hours 1 sec ago
-     | Wed Mar 15 08:14:01 2000 PST | Sun Dec 31 17:32:01 2000 PST | @ 291 days 9 hours 18 mins ago
-     | Wed Mar 15 08:14:01 2000 PST | Mon Jan 01 17:32:01 2001 PST | @ 292 days 9 hours 18 mins ago
-     | Wed Mar 15 08:14:01 2000 PST | Sat Sep 22 18:19:20 2001 PDT | @ 556 days 9 hours 5 mins 19 secs ago
-     | Wed Mar 15 12:14:03 2000 PST | Thu Jan 01 00:00:00 1970 PST | @ 11031 days 12 hours 14 mins 3 secs
-     | Wed Mar 15 12:14:03 2000 PST | Wed Feb 28 17:32:01 1996 PST | @ 1476 days 18 hours 42 mins 2 secs
-     | Wed Mar 15 12:14:03 2000 PST | Thu Feb 29 17:32:01 1996 PST | @ 1475 days 18 hours 42 mins 2 secs
-     | Wed Mar 15 12:14:03 2000 PST | Fri Mar 01 17:32:01 1996 PST | @ 1474 days 18 hours 42 mins 2 secs
-     | Wed Mar 15 12:14:03 2000 PST | Mon Dec 30 17:32:01 1996 PST | @ 1170 days 18 hours 42 mins 2 secs
-     | Wed Mar 15 12:14:03 2000 PST | Tue Dec 31 17:32:01 1996 PST | @ 1169 days 18 hours 42 mins 2 secs
-     | Wed Mar 15 12:14:03 2000 PST | Fri Dec 31 17:32:01 1999 PST | @ 74 days 18 hours 42 mins 2 secs
-     | Wed Mar 15 12:14:03 2000 PST | Sat Jan 01 17:32:01 2000 PST | @ 73 days 18 hours 42 mins 2 secs
-     | Wed Mar 15 12:14:03 2000 PST | Wed Mar 15 02:14:05 2000 PST | @ 9 hours 59 mins 58 secs
-     | Wed Mar 15 12:14:03 2000 PST | Wed Mar 15 03:14:04 2000 PST | @ 8 hours 59 mins 59 secs
-     | Wed Mar 15 12:14:03 2000 PST | Wed Mar 15 08:14:01 2000 PST | @ 4 hours 2 secs
-     | Wed Mar 15 12:14:03 2000 PST | Wed Mar 15 12:14:03 2000 PST | @ 0
-     | Wed Mar 15 12:14:03 2000 PST | Wed Mar 15 13:14:02 2000 PST | @ 59 mins 59 secs ago
-     | Wed Mar 15 12:14:03 2000 PST | Sun Dec 31 17:32:01 2000 PST | @ 291 days 5 hours 17 mins 58 secs ago
-     | Wed Mar 15 12:14:03 2000 PST | Mon Jan 01 17:32:01 2001 PST | @ 292 days 5 hours 17 mins 58 secs ago
-     | Wed Mar 15 12:14:03 2000 PST | Sat Sep 22 18:19:20 2001 PDT | @ 556 days 5 hours 5 mins 17 secs ago
-     | Wed Mar 15 13:14:02 2000 PST | Thu Jan 01 00:00:00 1970 PST | @ 11031 days 13 hours 14 mins 2 secs
-     | Wed Mar 15 13:14:02 2000 PST | Wed Feb 28 17:32:01 1996 PST | @ 1476 days 19 hours 42 mins 1 sec
-     | Wed Mar 15 13:14:02 2000 PST | Thu Feb 29 17:32:01 1996 PST | @ 1475 days 19 hours 42 mins 1 sec
-     | Wed Mar 15 13:14:02 2000 PST | Fri Mar 01 17:32:01 1996 PST | @ 1474 days 19 hours 42 mins 1 sec
-     | Wed Mar 15 13:14:02 2000 PST | Mon Dec 30 17:32:01 1996 PST | @ 1170 days 19 hours 42 mins 1 sec
-     | Wed Mar 15 13:14:02 2000 PST | Tue Dec 31 17:32:01 1996 PST | @ 1169 days 19 hours 42 mins 1 sec
-     | Wed Mar 15 13:14:02 2000 PST | Fri Dec 31 17:32:01 1999 PST | @ 74 days 19 hours 42 mins 1 sec
-     | Wed Mar 15 13:14:02 2000 PST | Sat Jan 01 17:32:01 2000 PST | @ 73 days 19 hours 42 mins 1 sec
-     | Wed Mar 15 13:14:02 2000 PST | Wed Mar 15 02:14:05 2000 PST | @ 10 hours 59 mins 57 secs
-     | Wed Mar 15 13:14:02 2000 PST | Wed Mar 15 03:14:04 2000 PST | @ 9 hours 59 mins 58 secs
-     | Wed Mar 15 13:14:02 2000 PST | Wed Mar 15 08:14:01 2000 PST | @ 5 hours 1 sec
-     | Wed Mar 15 13:14:02 2000 PST | Wed Mar 15 12:14:03 2000 PST | @ 59 mins 59 secs
-     | Wed Mar 15 13:14:02 2000 PST | Wed Mar 15 13:14:02 2000 PST | @ 0
-     | Wed Mar 15 13:14:02 2000 PST | Sun Dec 31 17:32:01 2000 PST | @ 291 days 4 hours 17 mins 59 secs ago
-     | Wed Mar 15 13:14:02 2000 PST | Mon Jan 01 17:32:01 2001 PST | @ 292 days 4 hours 17 mins 59 secs ago
-     | Wed Mar 15 13:14:02 2000 PST | Sat Sep 22 18:19:20 2001 PDT | @ 556 days 4 hours 5 mins 18 secs ago
-     | Sun Dec 31 17:32:01 2000 PST | Thu Jan 01 00:00:00 1970 PST | @ 11322 days 17 hours 32 mins 1 sec
-     | Sun Dec 31 17:32:01 2000 PST | Wed Feb 28 17:32:01 1996 PST | @ 1768 days
-     | Sun Dec 31 17:32:01 2000 PST | Thu Feb 29 17:32:01 1996 PST | @ 1767 days
-     | Sun Dec 31 17:32:01 2000 PST | Fri Mar 01 17:32:01 1996 PST | @ 1766 days
-     | Sun Dec 31 17:32:01 2000 PST | Mon Dec 30 17:32:01 1996 PST | @ 1462 days
-     | Sun Dec 31 17:32:01 2000 PST | Tue Dec 31 17:32:01 1996 PST | @ 1461 days
-     | Sun Dec 31 17:32:01 2000 PST | Fri Dec 31 17:32:01 1999 PST | @ 366 days
-     | Sun Dec 31 17:32:01 2000 PST | Sat Jan 01 17:32:01 2000 PST | @ 365 days
-     | Sun Dec 31 17:32:01 2000 PST | Wed Mar 15 02:14:05 2000 PST | @ 291 days 15 hours 17 mins 56 secs
-     | Sun Dec 31 17:32:01 2000 PST | Wed Mar 15 03:14:04 2000 PST | @ 291 days 14 hours 17 mins 57 secs
-     | Sun Dec 31 17:32:01 2000 PST | Wed Mar 15 08:14:01 2000 PST | @ 291 days 9 hours 18 mins
-     | Sun Dec 31 17:32:01 2000 PST | Wed Mar 15 12:14:03 2000 PST | @ 291 days 5 hours 17 mins 58 secs
-     | Sun Dec 31 17:32:01 2000 PST | Wed Mar 15 13:14:02 2000 PST | @ 291 days 4 hours 17 mins 59 secs
-     | Sun Dec 31 17:32:01 2000 PST | Sun Dec 31 17:32:01 2000 PST | @ 0
-     | Sun Dec 31 17:32:01 2000 PST | Mon Jan 01 17:32:01 2001 PST | @ 1 day ago
-     | Sun Dec 31 17:32:01 2000 PST | Sat Sep 22 18:19:20 2001 PDT | @ 264 days 23 hours 47 mins 19 secs ago
-     | Mon Jan 01 17:32:01 2001 PST | Thu Jan 01 00:00:00 1970 PST | @ 11323 days 17 hours 32 mins 1 sec
-     | Mon Jan 01 17:32:01 2001 PST | Wed Feb 28 17:32:01 1996 PST | @ 1769 days
-     | Mon Jan 01 17:32:01 2001 PST | Thu Feb 29 17:32:01 1996 PST | @ 1768 days
-     | Mon Jan 01 17:32:01 2001 PST | Fri Mar 01 17:32:01 1996 PST | @ 1767 days
-     | Mon Jan 01 17:32:01 2001 PST | Mon Dec 30 17:32:01 1996 PST | @ 1463 days
-     | Mon Jan 01 17:32:01 2001 PST | Tue Dec 31 17:32:01 1996 PST | @ 1462 days
-     | Mon Jan 01 17:32:01 2001 PST | Fri Dec 31 17:32:01 1999 PST | @ 367 days
-     | Mon Jan 01 17:32:01 2001 PST | Sat Jan 01 17:32:01 2000 PST | @ 366 days
-     | Mon Jan 01 17:32:01 2001 PST | Wed Mar 15 02:14:05 2000 PST | @ 292 days 15 hours 17 mins 56 secs
-     | Mon Jan 01 17:32:01 2001 PST | Wed Mar 15 03:14:04 2000 PST | @ 292 days 14 hours 17 mins 57 secs
-     | Mon Jan 01 17:32:01 2001 PST | Wed Mar 15 08:14:01 2000 PST | @ 292 days 9 hours 18 mins
-     | Mon Jan 01 17:32:01 2001 PST | Wed Mar 15 12:14:03 2000 PST | @ 292 days 5 hours 17 mins 58 secs
-     | Mon Jan 01 17:32:01 2001 PST | Wed Mar 15 13:14:02 2000 PST | @ 292 days 4 hours 17 mins 59 secs
-     | Mon Jan 01 17:32:01 2001 PST | Sun Dec 31 17:32:01 2000 PST | @ 1 day
-     | Mon Jan 01 17:32:01 2001 PST | Mon Jan 01 17:32:01 2001 PST | @ 0
-     | Mon Jan 01 17:32:01 2001 PST | Sat Sep 22 18:19:20 2001 PDT | @ 263 days 23 hours 47 mins 19 secs ago
-     | Sat Sep 22 18:19:20 2001 PDT | Thu Jan 01 00:00:00 1970 PST | @ 11587 days 17 hours 19 mins 20 secs
-     | Sat Sep 22 18:19:20 2001 PDT | Wed Feb 28 17:32:01 1996 PST | @ 2032 days 23 hours 47 mins 19 secs
-     | Sat Sep 22 18:19:20 2001 PDT | Thu Feb 29 17:32:01 1996 PST | @ 2031 days 23 hours 47 mins 19 secs
-     | Sat Sep 22 18:19:20 2001 PDT | Fri Mar 01 17:32:01 1996 PST | @ 2030 days 23 hours 47 mins 19 secs
-     | Sat Sep 22 18:19:20 2001 PDT | Mon Dec 30 17:32:01 1996 PST | @ 1726 days 23 hours 47 mins 19 secs
-     | Sat Sep 22 18:19:20 2001 PDT | Tue Dec 31 17:32:01 1996 PST | @ 1725 days 23 hours 47 mins 19 secs
-     | Sat Sep 22 18:19:20 2001 PDT | Fri Dec 31 17:32:01 1999 PST | @ 630 days 23 hours 47 mins 19 secs
-     | Sat Sep 22 18:19:20 2001 PDT | Sat Jan 01 17:32:01 2000 PST | @ 629 days 23 hours 47 mins 19 secs
-     | Sat Sep 22 18:19:20 2001 PDT | Wed Mar 15 02:14:05 2000 PST | @ 556 days 15 hours 5 mins 15 secs
-     | Sat Sep 22 18:19:20 2001 PDT | Wed Mar 15 03:14:04 2000 PST | @ 556 days 14 hours 5 mins 16 secs
-     | Sat Sep 22 18:19:20 2001 PDT | Wed Mar 15 08:14:01 2000 PST | @ 556 days 9 hours 5 mins 19 secs
-     | Sat Sep 22 18:19:20 2001 PDT | Wed Mar 15 12:14:03 2000 PST | @ 556 days 5 hours 5 mins 17 secs
-     | Sat Sep 22 18:19:20 2001 PDT | Wed Mar 15 13:14:02 2000 PST | @ 556 days 4 hours 5 mins 18 secs
-     | Sat Sep 22 18:19:20 2001 PDT | Sun Dec 31 17:32:01 2000 PST | @ 264 days 23 hours 47 mins 19 secs
-     | Sat Sep 22 18:19:20 2001 PDT | Mon Jan 01 17:32:01 2001 PST | @ 263 days 23 hours 47 mins 19 secs
-     | Sat Sep 22 18:19:20 2001 PDT | Sat Sep 22 18:19:20 2001 PDT | @ 0
-(256 rows)
-
+ERROR:  failed to JIT: evalexpr.4.0
 --
 -- abstime, reltime arithmetic
 --
@@ -2053,20 +1242,7 @@
     FROM ABSTIME_TBL, RELTIME_TBL
    WHERE (ABSTIME_TBL.f1 + RELTIME_TBL.f1) < abstime 'Jan 14 14:00:00 1971'
    ORDER BY abstime, reltime;
- ten |           abstime            |    reltime    
------+------------------------------+---------------
-     | Sat May 10 23:59:12 1947 PST | @ 14 secs ago
-     | Sat May 10 23:59:12 1947 PST | @ 1 min
-     | Sat May 10 23:59:12 1947 PST | @ 5 hours
-     | Sat May 10 23:59:12 1947 PST | @ 10 days
-     | Sat May 10 23:59:12 1947 PST | @ 3 mons
-     | Wed Dec 31 16:00:00 1969 PST | @ 14 secs ago
-     | Wed Dec 31 16:00:00 1969 PST | @ 1 min
-     | Wed Dec 31 16:00:00 1969 PST | @ 5 hours
-     | Wed Dec 31 16:00:00 1969 PST | @ 10 days
-     | Wed Dec 31 16:00:00 1969 PST | @ 3 mons
-(10 rows)
-
+ERROR:  failed to JIT: evalexpr.5.3
 -- these four queries should return the same answer
 -- the "infinity" and "-infinity" tuples in ABSTIME_TBL cannot be added and
 -- therefore, should not show up in the results.

======================================================================

--- src/test/regress/expected/create_index.out	2018-03-02 18:38:36.000000000 -0500
+++ src/test/regress/results/create_index.out	2018-03-03 09:18:25.000000000 -0500
@@ -1999,27 +1999,13 @@
 (1 row)
 
 SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno;
- seqno |   i    |   t    
--------+--------+--------
-   102 | {NULL} | {NULL}
-(1 row)
-
+ERROR:  failed to JIT: evalexpr.0.0
 SELECT * FROM array_op_test WHERE i @> '{NULL}' ORDER BY seqno;
- seqno | i | t 
--------+---+---
-(0 rows)
-
+ERROR:  failed to JIT: evalexpr.1.0
 SELECT * FROM array_op_test WHERE i && '{NULL}' ORDER BY seqno;
- seqno | i | t 
--------+---+---
-(0 rows)
-
+ERROR:  failed to JIT: evalexpr.2.0
 SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
- seqno | i  | t  
--------+----+----
-   101 | {} | {}
-(1 row)
-
+ERROR:  failed to JIT: evalexpr.3.0
 CREATE INDEX textarrayidx ON array_index_op_test USING gin (t);
 explain (costs off)
 SELECT * FROM array_index_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno;
@@ -2290,17 +2276,9 @@
 (1 row)
 
 SELECT * FROM array_op_test WHERE i = '{NULL}' ORDER BY seqno;
- seqno |   i    |   t    
--------+--------+--------
-   102 | {NULL} | {NULL}
-(1 row)
-
+ERROR:  failed to JIT: evalexpr.4.0
 SELECT * FROM array_op_test WHERE i <@ '{NULL}' ORDER BY seqno;
- seqno | i  | t  
--------+----+----
-   101 | {} | {}
-(1 row)
-
+ERROR:  failed to JIT: evalexpr.5.0
 RESET enable_seqscan;
 RESET enable_indexscan;
 RESET enable_bitmapscan;

======================================================================

--- src/test/regress/expected/inherit.out	2018-03-02 18:38:36.000000000 -0500
+++ src/test/regress/results/inherit.out	2018-03-03 09:18:27.000000000 -0500
@@ -1424,16 +1424,7 @@
 (13 rows)
 
 select * from matest0 order by 1-id;
- id |  name  
-----+--------
-  6 | Test 6
-  5 | Test 5
-  4 | Test 4
-  3 | Test 3
-  2 | Test 2
-  1 | Test 1
-(6 rows)
-
+ERROR:  failed to JIT: evalexpr.1.2
 explain (verbose, costs off) select min(1-id) from matest0;
                                 QUERY PLAN                                
 --------------------------------------------------------------------------
@@ -1650,13 +1641,7 @@
     ) f(i)
     ORDER BY f.i LIMIT 10)
 FROM generate_series(1, 3) g(i);
-            array             
-------------------------------
- {1,5,6,8,11,11,14,16,17,20}
- {2,6,7,9,12,12,15,17,18,21}
- {3,7,8,10,13,13,16,18,19,22}
-(3 rows)
-
+ERROR:  failed to JIT: evalexpr.3.11
 reset enable_seqscan;
 reset enable_indexscan;
 reset enable_bitmapscan;

======================================================================

--- src/test/regress/expected/select.out	2018-03-02 18:38:36.000000000 -0500
+++ src/test/regress/results/select.out	2018-03-03 09:18:29.000000000 -0500
@@ -926,24 +926,12 @@
 (4 rows)
 
 select sillysrf(-1) order by 1;
- sillysrf 
-----------
-       -1
-        1
-        2
-       10
-(4 rows)
-
+ERROR:  failed to JIT: evalexpr.0.0
 drop function sillysrf(int);
 -- X = X isn't a no-op, it's effectively X IS NOT NULL assuming = is strict
 -- (see bug #5084)
 select * from (values (2),(null),(1)) v(k) where k = k order by k;
- k 
----
- 1
- 2
-(2 rows)
-
+ERROR:  failed to JIT: evalexpr.1.0
 select * from (values (2),(null),(1)) v(k) where k = k;
  k 
 ---

======================================================================

--- src/test/regress/expected/join.out	2018-03-02 18:38:36.000000000 -0500
+++ src/test/regress/results/join.out	2018-03-03 09:18:32.000000000 -0500
@@ -659,901 +659,7 @@
 
 SELECT '' AS "xxx", *
   FROM J1_TBL CROSS JOIN J2_TBL a CROSS JOIN J2_TBL b;
- xxx | i | j |   t   | i | k  | i | k  
------+---+---+-------+---+----+---+----
-     | 1 | 4 | one   | 1 | -1 | 1 | -1
-     | 1 | 4 | one   | 1 | -1 | 2 |  2
-     | 1 | 4 | one   | 1 | -1 | 3 | -3
-     | 1 | 4 | one   | 1 | -1 | 2 |  4
-     | 1 | 4 | one   | 1 | -1 | 5 | -5
-     | 1 | 4 | one   | 1 | -1 | 5 | -5
-     | 1 | 4 | one   | 1 | -1 | 0 |   
-     | 1 | 4 | one   | 1 | -1 |   |   
-     | 1 | 4 | one   | 1 | -1 |   |  0
-     | 2 | 3 | two   | 1 | -1 | 1 | -1
-     | 2 | 3 | two   | 1 | -1 | 2 |  2
-     | 2 | 3 | two   | 1 | -1 | 3 | -3
-     | 2 | 3 | two   | 1 | -1 | 2 |  4
-     | 2 | 3 | two   | 1 | -1 | 5 | -5
-     | 2 | 3 | two   | 1 | -1 | 5 | -5
-     | 2 | 3 | two   | 1 | -1 | 0 |   
-     | 2 | 3 | two   | 1 | -1 |   |   
-     | 2 | 3 | two   | 1 | -1 |   |  0
-     | 3 | 2 | three | 1 | -1 | 1 | -1
-     | 3 | 2 | three | 1 | -1 | 2 |  2
-     | 3 | 2 | three | 1 | -1 | 3 | -3
-     | 3 | 2 | three | 1 | -1 | 2 |  4
-     | 3 | 2 | three | 1 | -1 | 5 | -5
-     | 3 | 2 | three | 1 | -1 | 5 | -5
-     | 3 | 2 | three | 1 | -1 | 0 |   
-     | 3 | 2 | three | 1 | -1 |   |   
-     | 3 | 2 | three | 1 | -1 |   |  0
-     | 4 | 1 | four  | 1 | -1 | 1 | -1
-     | 4 | 1 | four  | 1 | -1 | 2 |  2
-     | 4 | 1 | four  | 1 | -1 | 3 | -3
-     | 4 | 1 | four  | 1 | -1 | 2 |  4
-     | 4 | 1 | four  | 1 | -1 | 5 | -5
-     | 4 | 1 | four  | 1 | -1 | 5 | -5
-     | 4 | 1 | four  | 1 | -1 | 0 |   
-     | 4 | 1 | four  | 1 | -1 |   |   
-     | 4 | 1 | four  | 1 | -1 |   |  0
-     | 5 | 0 | five  | 1 | -1 | 1 | -1
-     | 5 | 0 | five  | 1 | -1 | 2 |  2
-     | 5 | 0 | five  | 1 | -1 | 3 | -3
-     | 5 | 0 | five  | 1 | -1 | 2 |  4
-     | 5 | 0 | five  | 1 | -1 | 5 | -5
-     | 5 | 0 | five  | 1 | -1 | 5 | -5
-     | 5 | 0 | five  | 1 | -1 | 0 |   
-     | 5 | 0 | five  | 1 | -1 |   |   
-     | 5 | 0 | five  | 1 | -1 |   |  0
-     | 6 | 6 | six   | 1 | -1 | 1 | -1
-     | 6 | 6 | six   | 1 | -1 | 2 |  2
-     | 6 | 6 | six   | 1 | -1 | 3 | -3
-     | 6 | 6 | six   | 1 | -1 | 2 |  4
-     | 6 | 6 | six   | 1 | -1 | 5 | -5
-     | 6 | 6 | six   | 1 | -1 | 5 | -5
-     | 6 | 6 | six   | 1 | -1 | 0 |   
-     | 6 | 6 | six   | 1 | -1 |   |   
-     | 6 | 6 | six   | 1 | -1 |   |  0
-     | 7 | 7 | seven | 1 | -1 | 1 | -1
-     | 7 | 7 | seven | 1 | -1 | 2 |  2
-     | 7 | 7 | seven | 1 | -1 | 3 | -3
-     | 7 | 7 | seven | 1 | -1 | 2 |  4
-     | 7 | 7 | seven | 1 | -1 | 5 | -5
-     | 7 | 7 | seven | 1 | -1 | 5 | -5
-     | 7 | 7 | seven | 1 | -1 | 0 |   
-     | 7 | 7 | seven | 1 | -1 |   |   
-     | 7 | 7 | seven | 1 | -1 |   |  0
-     | 8 | 8 | eight | 1 | -1 | 1 | -1
-     | 8 | 8 | eight | 1 | -1 | 2 |  2
-     | 8 | 8 | eight | 1 | -1 | 3 | -3
-     | 8 | 8 | eight | 1 | -1 | 2 |  4
-     | 8 | 8 | eight | 1 | -1 | 5 | -5
-     | 8 | 8 | eight | 1 | -1 | 5 | -5
-     | 8 | 8 | eight | 1 | -1 | 0 |   
-     | 8 | 8 | eight | 1 | -1 |   |   
-     | 8 | 8 | eight | 1 | -1 |   |  0
-     | 0 |   | zero  | 1 | -1 | 1 | -1
-     | 0 |   | zero  | 1 | -1 | 2 |  2
-     | 0 |   | zero  | 1 | -1 | 3 | -3
-     | 0 |   | zero  | 1 | -1 | 2 |  4
-     | 0 |   | zero  | 1 | -1 | 5 | -5
-     | 0 |   | zero  | 1 | -1 | 5 | -5
-     | 0 |   | zero  | 1 | -1 | 0 |   
-     | 0 |   | zero  | 1 | -1 |   |   
-     | 0 |   | zero  | 1 | -1 |   |  0
-     |   |   | null  | 1 | -1 | 1 | -1
-     |   |   | null  | 1 | -1 | 2 |  2
-     |   |   | null  | 1 | -1 | 3 | -3
-     |   |   | null  | 1 | -1 | 2 |  4
-     |   |   | null  | 1 | -1 | 5 | -5
-     |   |   | null  | 1 | -1 | 5 | -5
-     |   |   | null  | 1 | -1 | 0 |   
-     |   |   | null  | 1 | -1 |   |   
-     |   |   | null  | 1 | -1 |   |  0
-     |   | 0 | zero  | 1 | -1 | 1 | -1
-     |   | 0 | zero  | 1 | -1 | 2 |  2
-     |   | 0 | zero  | 1 | -1 | 3 | -3
-     |   | 0 | zero  | 1 | -1 | 2 |  4
-     |   | 0 | zero  | 1 | -1 | 5 | -5
-     |   | 0 | zero  | 1 | -1 | 5 | -5
-     |   | 0 | zero  | 1 | -1 | 0 |   
-     |   | 0 | zero  | 1 | -1 |   |   
-     |   | 0 | zero  | 1 | -1 |   |  0
-     | 1 | 4 | one   | 2 |  2 | 1 | -1
-     | 1 | 4 | one   | 2 |  2 | 2 |  2
-     | 1 | 4 | one   | 2 |  2 | 3 | -3
-     | 1 | 4 | one   | 2 |  2 | 2 |  4
-     | 1 | 4 | one   | 2 |  2 | 5 | -5
-     | 1 | 4 | one   | 2 |  2 | 5 | -5
-     | 1 | 4 | one   | 2 |  2 | 0 |   
-     | 1 | 4 | one   | 2 |  2 |   |   
-     | 1 | 4 | one   | 2 |  2 |   |  0
-     | 2 | 3 | two   | 2 |  2 | 1 | -1
-     | 2 | 3 | two   | 2 |  2 | 2 |  2
-     | 2 | 3 | two   | 2 |  2 | 3 | -3
-     | 2 | 3 | two   | 2 |  2 | 2 |  4
-     | 2 | 3 | two   | 2 |  2 | 5 | -5
-     | 2 | 3 | two   | 2 |  2 | 5 | -5
-     | 2 | 3 | two   | 2 |  2 | 0 |   
-     | 2 | 3 | two   | 2 |  2 |   |   
-     | 2 | 3 | two   | 2 |  2 |   |  0
-     | 3 | 2 | three | 2 |  2 | 1 | -1
-     | 3 | 2 | three | 2 |  2 | 2 |  2
-     | 3 | 2 | three | 2 |  2 | 3 | -3
-     | 3 | 2 | three | 2 |  2 | 2 |  4
-     | 3 | 2 | three | 2 |  2 | 5 | -5
-     | 3 | 2 | three | 2 |  2 | 5 | -5
-     | 3 | 2 | three | 2 |  2 | 0 |   
-     | 3 | 2 | three | 2 |  2 |   |   
-     | 3 | 2 | three | 2 |  2 |   |  0
-     | 4 | 1 | four  | 2 |  2 | 1 | -1
-     | 4 | 1 | four  | 2 |  2 | 2 |  2
-     | 4 | 1 | four  | 2 |  2 | 3 | -3
-     | 4 | 1 | four  | 2 |  2 | 2 |  4
-     | 4 | 1 | four  | 2 |  2 | 5 | -5
-     | 4 | 1 | four  | 2 |  2 | 5 | -5
-     | 4 | 1 | four  | 2 |  2 | 0 |   
-     | 4 | 1 | four  | 2 |  2 |   |   
-     | 4 | 1 | four  | 2 |  2 |   |  0
-     | 5 | 0 | five  | 2 |  2 | 1 | -1
-     | 5 | 0 | five  | 2 |  2 | 2 |  2
-     | 5 | 0 | five  | 2 |  2 | 3 | -3
-     | 5 | 0 | five  | 2 |  2 | 2 |  4
-     | 5 | 0 | five  | 2 |  2 | 5 | -5
-     | 5 | 0 | five  | 2 |  2 | 5 | -5
-     | 5 | 0 | five  | 2 |  2 | 0 |   
-     | 5 | 0 | five  | 2 |  2 |   |   
-     | 5 | 0 | five  | 2 |  2 |   |  0
-     | 6 | 6 | six   | 2 |  2 | 1 | -1
-     | 6 | 6 | six   | 2 |  2 | 2 |  2
-     | 6 | 6 | six   | 2 |  2 | 3 | -3
-     | 6 | 6 | six   | 2 |  2 | 2 |  4
-     | 6 | 6 | six   | 2 |  2 | 5 | -5
-     | 6 | 6 | six   | 2 |  2 | 5 | -5
-     | 6 | 6 | six   | 2 |  2 | 0 |   
-     | 6 | 6 | six   | 2 |  2 |   |   
-     | 6 | 6 | six   | 2 |  2 |   |  0
-     | 7 | 7 | seven | 2 |  2 | 1 | -1
-     | 7 | 7 | seven | 2 |  2 | 2 |  2
-     | 7 | 7 | seven | 2 |  2 | 3 | -3
-     | 7 | 7 | seven | 2 |  2 | 2 |  4
-     | 7 | 7 | seven | 2 |  2 | 5 | -5
-     | 7 | 7 | seven | 2 |  2 | 5 | -5
-     | 7 | 7 | seven | 2 |  2 | 0 |   
-     | 7 | 7 | seven | 2 |  2 |   |   
-     | 7 | 7 | seven | 2 |  2 |   |  0
-     | 8 | 8 | eight | 2 |  2 | 1 | -1
-     | 8 | 8 | eight | 2 |  2 | 2 |  2
-     | 8 | 8 | eight | 2 |  2 | 3 | -3
-     | 8 | 8 | eight | 2 |  2 | 2 |  4
-     | 8 | 8 | eight | 2 |  2 | 5 | -5
-     | 8 | 8 | eight | 2 |  2 | 5 | -5
-     | 8 | 8 | eight | 2 |  2 | 0 |   
-     | 8 | 8 | eight | 2 |  2 |   |   
-     | 8 | 8 | eight | 2 |  2 |   |  0
-     | 0 |   | zero  | 2 |  2 | 1 | -1
-     | 0 |   | zero  | 2 |  2 | 2 |  2
-     | 0 |   | zero  | 2 |  2 | 3 | -3
-     | 0 |   | zero  | 2 |  2 | 2 |  4
-     | 0 |   | zero  | 2 |  2 | 5 | -5
-     | 0 |   | zero  | 2 |  2 | 5 | -5
-     | 0 |   | zero  | 2 |  2 | 0 |   
-     | 0 |   | zero  | 2 |  2 |   |   
-     | 0 |   | zero  | 2 |  2 |   |  0
-     |   |   | null  | 2 |  2 | 1 | -1
-     |   |   | null  | 2 |  2 | 2 |  2
-     |   |   | null  | 2 |  2 | 3 | -3
-     |   |   | null  | 2 |  2 | 2 |  4
-     |   |   | null  | 2 |  2 | 5 | -5
-     |   |   | null  | 2 |  2 | 5 | -5
-     |   |   | null  | 2 |  2 | 0 |   
-     |   |   | null  | 2 |  2 |   |   
-     |   |   | null  | 2 |  2 |   |  0
-     |   | 0 | zero  | 2 |  2 | 1 | -1
-     |   | 0 | zero  | 2 |  2 | 2 |  2
-     |   | 0 | zero  | 2 |  2 | 3 | -3
-     |   | 0 | zero  | 2 |  2 | 2 |  4
-     |   | 0 | zero  | 2 |  2 | 5 | -5
-     |   | 0 | zero  | 2 |  2 | 5 | -5
-     |   | 0 | zero  | 2 |  2 | 0 |   
-     |   | 0 | zero  | 2 |  2 |   |   
-     |   | 0 | zero  | 2 |  2 |   |  0
-     | 1 | 4 | one   | 3 | -3 | 1 | -1
-     | 1 | 4 | one   | 3 | -3 | 2 |  2
-     | 1 | 4 | one   | 3 | -3 | 3 | -3
-     | 1 | 4 | one   | 3 | -3 | 2 |  4
-     | 1 | 4 | one   | 3 | -3 | 5 | -5
-     | 1 | 4 | one   | 3 | -3 | 5 | -5
-     | 1 | 4 | one   | 3 | -3 | 0 |   
-     | 1 | 4 | one   | 3 | -3 |   |   
-     | 1 | 4 | one   | 3 | -3 |   |  0
-     | 2 | 3 | two   | 3 | -3 | 1 | -1
-     | 2 | 3 | two   | 3 | -3 | 2 |  2
-     | 2 | 3 | two   | 3 | -3 | 3 | -3
-     | 2 | 3 | two   | 3 | -3 | 2 |  4
-     | 2 | 3 | two   | 3 | -3 | 5 | -5
-     | 2 | 3 | two   | 3 | -3 | 5 | -5
-     | 2 | 3 | two   | 3 | -3 | 0 |   
-     | 2 | 3 | two   | 3 | -3 |   |   
-     | 2 | 3 | two   | 3 | -3 |   |  0
-     | 3 | 2 | three | 3 | -3 | 1 | -1
-     | 3 | 2 | three | 3 | -3 | 2 |  2
-     | 3 | 2 | three | 3 | -3 | 3 | -3
-     | 3 | 2 | three | 3 | -3 | 2 |  4
-     | 3 | 2 | three | 3 | -3 | 5 | -5
-     | 3 | 2 | three | 3 | -3 | 5 | -5
-     | 3 | 2 | three | 3 | -3 | 0 |   
-     | 3 | 2 | three | 3 | -3 |   |   
-     | 3 | 2 | three | 3 | -3 |   |  0
-     | 4 | 1 | four  | 3 | -3 | 1 | -1
-     | 4 | 1 | four  | 3 | -3 | 2 |  2
-     | 4 | 1 | four  | 3 | -3 | 3 | -3
-     | 4 | 1 | four  | 3 | -3 | 2 |  4
-     | 4 | 1 | four  | 3 | -3 | 5 | -5
-     | 4 | 1 | four  | 3 | -3 | 5 | -5
-     | 4 | 1 | four  | 3 | -3 | 0 |   
-     | 4 | 1 | four  | 3 | -3 |   |   
-     | 4 | 1 | four  | 3 | -3 |   |  0
-     | 5 | 0 | five  | 3 | -3 | 1 | -1
-     | 5 | 0 | five  | 3 | -3 | 2 |  2
-     | 5 | 0 | five  | 3 | -3 | 3 | -3
-     | 5 | 0 | five  | 3 | -3 | 2 |  4
-     | 5 | 0 | five  | 3 | -3 | 5 | -5
-     | 5 | 0 | five  | 3 | -3 | 5 | -5
-     | 5 | 0 | five  | 3 | -3 | 0 |   
-     | 5 | 0 | five  | 3 | -3 |   |   
-     | 5 | 0 | five  | 3 | -3 |   |  0
-     | 6 | 6 | six   | 3 | -3 | 1 | -1
-     | 6 | 6 | six   | 3 | -3 | 2 |  2
-     | 6 | 6 | six   | 3 | -3 | 3 | -3
-     | 6 | 6 | six   | 3 | -3 | 2 |  4
-     | 6 | 6 | six   | 3 | -3 | 5 | -5
-     | 6 | 6 | six   | 3 | -3 | 5 | -5
-     | 6 | 6 | six   | 3 | -3 | 0 |   
-     | 6 | 6 | six   | 3 | -3 |   |   
-     | 6 | 6 | six   | 3 | -3 |   |  0
-     | 7 | 7 | seven | 3 | -3 | 1 | -1
-     | 7 | 7 | seven | 3 | -3 | 2 |  2
-     | 7 | 7 | seven | 3 | -3 | 3 | -3
-     | 7 | 7 | seven | 3 | -3 | 2 |  4
-     | 7 | 7 | seven | 3 | -3 | 5 | -5
-     | 7 | 7 | seven | 3 | -3 | 5 | -5
-     | 7 | 7 | seven | 3 | -3 | 0 |   
-     | 7 | 7 | seven | 3 | -3 |   |   
-     | 7 | 7 | seven | 3 | -3 |   |  0
-     | 8 | 8 | eight | 3 | -3 | 1 | -1
-     | 8 | 8 | eight | 3 | -3 | 2 |  2
-     | 8 | 8 | eight | 3 | -3 | 3 | -3
-     | 8 | 8 | eight | 3 | -3 | 2 |  4
-     | 8 | 8 | eight | 3 | -3 | 5 | -5
-     | 8 | 8 | eight | 3 | -3 | 5 | -5
-     | 8 | 8 | eight | 3 | -3 | 0 |   
-     | 8 | 8 | eight | 3 | -3 |   |   
-     | 8 | 8 | eight | 3 | -3 |   |  0
-     | 0 |   | zero  | 3 | -3 | 1 | -1
-     | 0 |   | zero  | 3 | -3 | 2 |  2
-     | 0 |   | zero  | 3 | -3 | 3 | -3
-     | 0 |   | zero  | 3 | -3 | 2 |  4
-     | 0 |   | zero  | 3 | -3 | 5 | -5
-     | 0 |   | zero  | 3 | -3 | 5 | -5
-     | 0 |   | zero  | 3 | -3 | 0 |   
-     | 0 |   | zero  | 3 | -3 |   |   
-     | 0 |   | zero  | 3 | -3 |   |  0
-     |   |   | null  | 3 | -3 | 1 | -1
-     |   |   | null  | 3 | -3 | 2 |  2
-     |   |   | null  | 3 | -3 | 3 | -3
-     |   |   | null  | 3 | -3 | 2 |  4
-     |   |   | null  | 3 | -3 | 5 | -5
-     |   |   | null  | 3 | -3 | 5 | -5
-     |   |   | null  | 3 | -3 | 0 |   
-     |   |   | null  | 3 | -3 |   |   
-     |   |   | null  | 3 | -3 |   |  0
-     |   | 0 | zero  | 3 | -3 | 1 | -1
-     |   | 0 | zero  | 3 | -3 | 2 |  2
-     |   | 0 | zero  | 3 | -3 | 3 | -3
-     |   | 0 | zero  | 3 | -3 | 2 |  4
-     |   | 0 | zero  | 3 | -3 | 5 | -5
-     |   | 0 | zero  | 3 | -3 | 5 | -5
-     |   | 0 | zero  | 3 | -3 | 0 |   
-     |   | 0 | zero  | 3 | -3 |   |   
-     |   | 0 | zero  | 3 | -3 |   |  0
-     | 1 | 4 | one   | 2 |  4 | 1 | -1
-     | 1 | 4 | one   | 2 |  4 | 2 |  2
-     | 1 | 4 | one   | 2 |  4 | 3 | -3
-     | 1 | 4 | one   | 2 |  4 | 2 |  4
-     | 1 | 4 | one   | 2 |  4 | 5 | -5
-     | 1 | 4 | one   | 2 |  4 | 5 | -5
-     | 1 | 4 | one   | 2 |  4 | 0 |   
-     | 1 | 4 | one   | 2 |  4 |   |   
-     | 1 | 4 | one   | 2 |  4 |   |  0
-     | 2 | 3 | two   | 2 |  4 | 1 | -1
-     | 2 | 3 | two   | 2 |  4 | 2 |  2
-     | 2 | 3 | two   | 2 |  4 | 3 | -3
-     | 2 | 3 | two   | 2 |  4 | 2 |  4
-     | 2 | 3 | two   | 2 |  4 | 5 | -5
-     | 2 | 3 | two   | 2 |  4 | 5 | -5
-     | 2 | 3 | two   | 2 |  4 | 0 |   
-     | 2 | 3 | two   | 2 |  4 |   |   
-     | 2 | 3 | two   | 2 |  4 |   |  0
-     | 3 | 2 | three | 2 |  4 | 1 | -1
-     | 3 | 2 | three | 2 |  4 | 2 |  2
-     | 3 | 2 | three | 2 |  4 | 3 | -3
-     | 3 | 2 | three | 2 |  4 | 2 |  4
-     | 3 | 2 | three | 2 |  4 | 5 | -5
-     | 3 | 2 | three | 2 |  4 | 5 | -5
-     | 3 | 2 | three | 2 |  4 | 0 |   
-     | 3 | 2 | three | 2 |  4 |   |   
-     | 3 | 2 | three | 2 |  4 |   |  0
-     | 4 | 1 | four  | 2 |  4 | 1 | -1
-     | 4 | 1 | four  | 2 |  4 | 2 |  2
-     | 4 | 1 | four  | 2 |  4 | 3 | -3
-     | 4 | 1 | four  | 2 |  4 | 2 |  4
-     | 4 | 1 | four  | 2 |  4 | 5 | -5
-     | 4 | 1 | four  | 2 |  4 | 5 | -5
-     | 4 | 1 | four  | 2 |  4 | 0 |   
-     | 4 | 1 | four  | 2 |  4 |   |   
-     | 4 | 1 | four  | 2 |  4 |   |  0
-     | 5 | 0 | five  | 2 |  4 | 1 | -1
-     | 5 | 0 | five  | 2 |  4 | 2 |  2
-     | 5 | 0 | five  | 2 |  4 | 3 | -3
-     | 5 | 0 | five  | 2 |  4 | 2 |  4
-     | 5 | 0 | five  | 2 |  4 | 5 | -5
-     | 5 | 0 | five  | 2 |  4 | 5 | -5
-     | 5 | 0 | five  | 2 |  4 | 0 |   
-     | 5 | 0 | five  | 2 |  4 |   |   
-     | 5 | 0 | five  | 2 |  4 |   |  0
-     | 6 | 6 | six   | 2 |  4 | 1 | -1
-     | 6 | 6 | six   | 2 |  4 | 2 |  2
-     | 6 | 6 | six   | 2 |  4 | 3 | -3
-     | 6 | 6 | six   | 2 |  4 | 2 |  4
-     | 6 | 6 | six   | 2 |  4 | 5 | -5
-     | 6 | 6 | six   | 2 |  4 | 5 | -5
-     | 6 | 6 | six   | 2 |  4 | 0 |   
-     | 6 | 6 | six   | 2 |  4 |   |   
-     | 6 | 6 | six   | 2 |  4 |   |  0
-     | 7 | 7 | seven | 2 |  4 | 1 | -1
-     | 7 | 7 | seven | 2 |  4 | 2 |  2
-     | 7 | 7 | seven | 2 |  4 | 3 | -3
-     | 7 | 7 | seven | 2 |  4 | 2 |  4
-     | 7 | 7 | seven | 2 |  4 | 5 | -5
-     | 7 | 7 | seven | 2 |  4 | 5 | -5
-     | 7 | 7 | seven | 2 |  4 | 0 |   
-     | 7 | 7 | seven | 2 |  4 |   |   
-     | 7 | 7 | seven | 2 |  4 |   |  0
-     | 8 | 8 | eight | 2 |  4 | 1 | -1
-     | 8 | 8 | eight | 2 |  4 | 2 |  2
-     | 8 | 8 | eight | 2 |  4 | 3 | -3
-     | 8 | 8 | eight | 2 |  4 | 2 |  4
-     | 8 | 8 | eight | 2 |  4 | 5 | -5
-     | 8 | 8 | eight | 2 |  4 | 5 | -5
-     | 8 | 8 | eight | 2 |  4 | 0 |   
-     | 8 | 8 | eight | 2 |  4 |   |   
-     | 8 | 8 | eight | 2 |  4 |   |  0
-     | 0 |   | zero  | 2 |  4 | 1 | -1
-     | 0 |   | zero  | 2 |  4 | 2 |  2
-     | 0 |   | zero  | 2 |  4 | 3 | -3
-     | 0 |   | zero  | 2 |  4 | 2 |  4
-     | 0 |   | zero  | 2 |  4 | 5 | -5
-     | 0 |   | zero  | 2 |  4 | 5 | -5
-     | 0 |   | zero  | 2 |  4 | 0 |   
-     | 0 |   | zero  | 2 |  4 |   |   
-     | 0 |   | zero  | 2 |  4 |   |  0
-     |   |   | null  | 2 |  4 | 1 | -1
-     |   |   | null  | 2 |  4 | 2 |  2
-     |   |   | null  | 2 |  4 | 3 | -3
-     |   |   | null  | 2 |  4 | 2 |  4
-     |   |   | null  | 2 |  4 | 5 | -5
-     |   |   | null  | 2 |  4 | 5 | -5
-     |   |   | null  | 2 |  4 | 0 |   
-     |   |   | null  | 2 |  4 |   |   
-     |   |   | null  | 2 |  4 |   |  0
-     |   | 0 | zero  | 2 |  4 | 1 | -1
-     |   | 0 | zero  | 2 |  4 | 2 |  2
-     |   | 0 | zero  | 2 |  4 | 3 | -3
-     |   | 0 | zero  | 2 |  4 | 2 |  4
-     |   | 0 | zero  | 2 |  4 | 5 | -5
-     |   | 0 | zero  | 2 |  4 | 5 | -5
-     |   | 0 | zero  | 2 |  4 | 0 |   
-     |   | 0 | zero  | 2 |  4 |   |   
-     |   | 0 | zero  | 2 |  4 |   |  0
-     | 1 | 4 | one   | 5 | -5 | 1 | -1
-     | 1 | 4 | one   | 5 | -5 | 2 |  2
-     | 1 | 4 | one   | 5 | -5 | 3 | -3
-     | 1 | 4 | one   | 5 | -5 | 2 |  4
-     | 1 | 4 | one   | 5 | -5 | 5 | -5
-     | 1 | 4 | one   | 5 | -5 | 5 | -5
-     | 1 | 4 | one   | 5 | -5 | 0 |   
-     | 1 | 4 | one   | 5 | -5 |   |   
-     | 1 | 4 | one   | 5 | -5 |   |  0
-     | 2 | 3 | two   | 5 | -5 | 1 | -1
-     | 2 | 3 | two   | 5 | -5 | 2 |  2
-     | 2 | 3 | two   | 5 | -5 | 3 | -3
-     | 2 | 3 | two   | 5 | -5 | 2 |  4
-     | 2 | 3 | two   | 5 | -5 | 5 | -5
-     | 2 | 3 | two   | 5 | -5 | 5 | -5
-     | 2 | 3 | two   | 5 | -5 | 0 |   
-     | 2 | 3 | two   | 5 | -5 |   |   
-     | 2 | 3 | two   | 5 | -5 |   |  0
-     | 3 | 2 | three | 5 | -5 | 1 | -1
-     | 3 | 2 | three | 5 | -5 | 2 |  2
-     | 3 | 2 | three | 5 | -5 | 3 | -3
-     | 3 | 2 | three | 5 | -5 | 2 |  4
-     | 3 | 2 | three | 5 | -5 | 5 | -5
-     | 3 | 2 | three | 5 | -5 | 5 | -5
-     | 3 | 2 | three | 5 | -5 | 0 |   
-     | 3 | 2 | three | 5 | -5 |   |   
-     | 3 | 2 | three | 5 | -5 |   |  0
-     | 4 | 1 | four  | 5 | -5 | 1 | -1
-     | 4 | 1 | four  | 5 | -5 | 2 |  2
-     | 4 | 1 | four  | 5 | -5 | 3 | -3
-     | 4 | 1 | four  | 5 | -5 | 2 |  4
-     | 4 | 1 | four  | 5 | -5 | 5 | -5
-     | 4 | 1 | four  | 5 | -5 | 5 | -5
-     | 4 | 1 | four  | 5 | -5 | 0 |   
-     | 4 | 1 | four  | 5 | -5 |   |   
-     | 4 | 1 | four  | 5 | -5 |   |  0
-     | 5 | 0 | five  | 5 | -5 | 1 | -1
-     | 5 | 0 | five  | 5 | -5 | 2 |  2
-     | 5 | 0 | five  | 5 | -5 | 3 | -3
-     | 5 | 0 | five  | 5 | -5 | 2 |  4
-     | 5 | 0 | five  | 5 | -5 | 5 | -5
-     | 5 | 0 | five  | 5 | -5 | 5 | -5
-     | 5 | 0 | five  | 5 | -5 | 0 |   
-     | 5 | 0 | five  | 5 | -5 |   |   
-     | 5 | 0 | five  | 5 | -5 |   |  0
-     | 6 | 6 | six   | 5 | -5 | 1 | -1
-     | 6 | 6 | six   | 5 | -5 | 2 |  2
-     | 6 | 6 | six   | 5 | -5 | 3 | -3
-     | 6 | 6 | six   | 5 | -5 | 2 |  4
-     | 6 | 6 | six   | 5 | -5 | 5 | -5
-     | 6 | 6 | six   | 5 | -5 | 5 | -5
-     | 6 | 6 | six   | 5 | -5 | 0 |   
-     | 6 | 6 | six   | 5 | -5 |   |   
-     | 6 | 6 | six   | 5 | -5 |   |  0
-     | 7 | 7 | seven | 5 | -5 | 1 | -1
-     | 7 | 7 | seven | 5 | -5 | 2 |  2
-     | 7 | 7 | seven | 5 | -5 | 3 | -3
-     | 7 | 7 | seven | 5 | -5 | 2 |  4
-     | 7 | 7 | seven | 5 | -5 | 5 | -5
-     | 7 | 7 | seven | 5 | -5 | 5 | -5
-     | 7 | 7 | seven | 5 | -5 | 0 |   
-     | 7 | 7 | seven | 5 | -5 |   |   
-     | 7 | 7 | seven | 5 | -5 |   |  0
-     | 8 | 8 | eight | 5 | -5 | 1 | -1
-     | 8 | 8 | eight | 5 | -5 | 2 |  2
-     | 8 | 8 | eight | 5 | -5 | 3 | -3
-     | 8 | 8 | eight | 5 | -5 | 2 |  4
-     | 8 | 8 | eight | 5 | -5 | 5 | -5
-     | 8 | 8 | eight | 5 | -5 | 5 | -5
-     | 8 | 8 | eight | 5 | -5 | 0 |   
-     | 8 | 8 | eight | 5 | -5 |   |   
-     | 8 | 8 | eight | 5 | -5 |   |  0
-     | 0 |   | zero  | 5 | -5 | 1 | -1
-     | 0 |   | zero  | 5 | -5 | 2 |  2
-     | 0 |   | zero  | 5 | -5 | 3 | -3
-     | 0 |   | zero  | 5 | -5 | 2 |  4
-     | 0 |   | zero  | 5 | -5 | 5 | -5
-     | 0 |   | zero  | 5 | -5 | 5 | -5
-     | 0 |   | zero  | 5 | -5 | 0 |   
-     | 0 |   | zero  | 5 | -5 |   |   
-     | 0 |   | zero  | 5 | -5 |   |  0
-     |   |   | null  | 5 | -5 | 1 | -1
-     |   |   | null  | 5 | -5 | 2 |  2
-     |   |   | null  | 5 | -5 | 3 | -3
-     |   |   | null  | 5 | -5 | 2 |  4
-     |   |   | null  | 5 | -5 | 5 | -5
-     |   |   | null  | 5 | -5 | 5 | -5
-     |   |   | null  | 5 | -5 | 0 |   
-     |   |   | null  | 5 | -5 |   |   
-     |   |   | null  | 5 | -5 |   |  0
-     |   | 0 | zero  | 5 | -5 | 1 | -1
-     |   | 0 | zero  | 5 | -5 | 2 |  2
-     |   | 0 | zero  | 5 | -5 | 3 | -3
-     |   | 0 | zero  | 5 | -5 | 2 |  4
-     |   | 0 | zero  | 5 | -5 | 5 | -5
-     |   | 0 | zero  | 5 | -5 | 5 | -5
-     |   | 0 | zero  | 5 | -5 | 0 |   
-     |   | 0 | zero  | 5 | -5 |   |   
-     |   | 0 | zero  | 5 | -5 |   |  0
-     | 1 | 4 | one   | 5 | -5 | 1 | -1
-     | 1 | 4 | one   | 5 | -5 | 2 |  2
-     | 1 | 4 | one   | 5 | -5 | 3 | -3
-     | 1 | 4 | one   | 5 | -5 | 2 |  4
-     | 1 | 4 | one   | 5 | -5 | 5 | -5
-     | 1 | 4 | one   | 5 | -5 | 5 | -5
-     | 1 | 4 | one   | 5 | -5 | 0 |   
-     | 1 | 4 | one   | 5 | -5 |   |   
-     | 1 | 4 | one   | 5 | -5 |   |  0
-     | 2 | 3 | two   | 5 | -5 | 1 | -1
-     | 2 | 3 | two   | 5 | -5 | 2 |  2
-     | 2 | 3 | two   | 5 | -5 | 3 | -3
-     | 2 | 3 | two   | 5 | -5 | 2 |  4
-     | 2 | 3 | two   | 5 | -5 | 5 | -5
-     | 2 | 3 | two   | 5 | -5 | 5 | -5
-     | 2 | 3 | two   | 5 | -5 | 0 |   
-     | 2 | 3 | two   | 5 | -5 |   |   
-     | 2 | 3 | two   | 5 | -5 |   |  0
-     | 3 | 2 | three | 5 | -5 | 1 | -1
-     | 3 | 2 | three | 5 | -5 | 2 |  2
-     | 3 | 2 | three | 5 | -5 | 3 | -3
-     | 3 | 2 | three | 5 | -5 | 2 |  4
-     | 3 | 2 | three | 5 | -5 | 5 | -5
-     | 3 | 2 | three | 5 | -5 | 5 | -5
-     | 3 | 2 | three | 5 | -5 | 0 |   
-     | 3 | 2 | three | 5 | -5 |   |   
-     | 3 | 2 | three | 5 | -5 |   |  0
-     | 4 | 1 | four  | 5 | -5 | 1 | -1
-     | 4 | 1 | four  | 5 | -5 | 2 |  2
-     | 4 | 1 | four  | 5 | -5 | 3 | -3
-     | 4 | 1 | four  | 5 | -5 | 2 |  4
-     | 4 | 1 | four  | 5 | -5 | 5 | -5
-     | 4 | 1 | four  | 5 | -5 | 5 | -5
-     | 4 | 1 | four  | 5 | -5 | 0 |   
-     | 4 | 1 | four  | 5 | -5 |   |   
-     | 4 | 1 | four  | 5 | -5 |   |  0
-     | 5 | 0 | five  | 5 | -5 | 1 | -1
-     | 5 | 0 | five  | 5 | -5 | 2 |  2
-     | 5 | 0 | five  | 5 | -5 | 3 | -3
-     | 5 | 0 | five  | 5 | -5 | 2 |  4
-     | 5 | 0 | five  | 5 | -5 | 5 | -5
-     | 5 | 0 | five  | 5 | -5 | 5 | -5
-     | 5 | 0 | five  | 5 | -5 | 0 |   
-     | 5 | 0 | five  | 5 | -5 |   |   
-     | 5 | 0 | five  | 5 | -5 |   |  0
-     | 6 | 6 | six   | 5 | -5 | 1 | -1
-     | 6 | 6 | six   | 5 | -5 | 2 |  2
-     | 6 | 6 | six   | 5 | -5 | 3 | -3
-     | 6 | 6 | six   | 5 | -5 | 2 |  4
-     | 6 | 6 | six   | 5 | -5 | 5 | -5
-     | 6 | 6 | six   | 5 | -5 | 5 | -5
-     | 6 | 6 | six   | 5 | -5 | 0 |   
-     | 6 | 6 | six   | 5 | -5 |   |   
-     | 6 | 6 | six   | 5 | -5 |   |  0
-     | 7 | 7 | seven | 5 | -5 | 1 | -1
-     | 7 | 7 | seven | 5 | -5 | 2 |  2
-     | 7 | 7 | seven | 5 | -5 | 3 | -3
-     | 7 | 7 | seven | 5 | -5 | 2 |  4
-     | 7 | 7 | seven | 5 | -5 | 5 | -5
-     | 7 | 7 | seven | 5 | -5 | 5 | -5
-     | 7 | 7 | seven | 5 | -5 | 0 |   
-     | 7 | 7 | seven | 5 | -5 |   |   
-     | 7 | 7 | seven | 5 | -5 |   |  0
-     | 8 | 8 | eight | 5 | -5 | 1 | -1
-     | 8 | 8 | eight | 5 | -5 | 2 |  2
-     | 8 | 8 | eight | 5 | -5 | 3 | -3
-     | 8 | 8 | eight | 5 | -5 | 2 |  4
-     | 8 | 8 | eight | 5 | -5 | 5 | -5
-     | 8 | 8 | eight | 5 | -5 | 5 | -5
-     | 8 | 8 | eight | 5 | -5 | 0 |   
-     | 8 | 8 | eight | 5 | -5 |   |   
-     | 8 | 8 | eight | 5 | -5 |   |  0
-     | 0 |   | zero  | 5 | -5 | 1 | -1
-     | 0 |   | zero  | 5 | -5 | 2 |  2
-     | 0 |   | zero  | 5 | -5 | 3 | -3
-     | 0 |   | zero  | 5 | -5 | 2 |  4
-     | 0 |   | zero  | 5 | -5 | 5 | -5
-     | 0 |   | zero  | 5 | -5 | 5 | -5
-     | 0 |   | zero  | 5 | -5 | 0 |   
-     | 0 |   | zero  | 5 | -5 |   |   
-     | 0 |   | zero  | 5 | -5 |   |  0
-     |   |   | null  | 5 | -5 | 1 | -1
-     |   |   | null  | 5 | -5 | 2 |  2
-     |   |   | null  | 5 | -5 | 3 | -3
-     |   |   | null  | 5 | -5 | 2 |  4
-     |   |   | null  | 5 | -5 | 5 | -5
-     |   |   | null  | 5 | -5 | 5 | -5
-     |   |   | null  | 5 | -5 | 0 |   
-     |   |   | null  | 5 | -5 |   |   
-     |   |   | null  | 5 | -5 |   |  0
-     |   | 0 | zero  | 5 | -5 | 1 | -1
-     |   | 0 | zero  | 5 | -5 | 2 |  2
-     |   | 0 | zero  | 5 | -5 | 3 | -3
-     |   | 0 | zero  | 5 | -5 | 2 |  4
-     |   | 0 | zero  | 5 | -5 | 5 | -5
-     |   | 0 | zero  | 5 | -5 | 5 | -5
-     |   | 0 | zero  | 5 | -5 | 0 |   
-     |   | 0 | zero  | 5 | -5 |   |   
-     |   | 0 | zero  | 5 | -5 |   |  0
-     | 1 | 4 | one   | 0 |    | 1 | -1
-     | 1 | 4 | one   | 0 |    | 2 |  2
-     | 1 | 4 | one   | 0 |    | 3 | -3
-     | 1 | 4 | one   | 0 |    | 2 |  4
-     | 1 | 4 | one   | 0 |    | 5 | -5
-     | 1 | 4 | one   | 0 |    | 5 | -5
-     | 1 | 4 | one   | 0 |    | 0 |   
-     | 1 | 4 | one   | 0 |    |   |   
-     | 1 | 4 | one   | 0 |    |   |  0
-     | 2 | 3 | two   | 0 |    | 1 | -1
-     | 2 | 3 | two   | 0 |    | 2 |  2
-     | 2 | 3 | two   | 0 |    | 3 | -3
-     | 2 | 3 | two   | 0 |    | 2 |  4
-     | 2 | 3 | two   | 0 |    | 5 | -5
-     | 2 | 3 | two   | 0 |    | 5 | -5
-     | 2 | 3 | two   | 0 |    | 0 |   
-     | 2 | 3 | two   | 0 |    |   |   
-     | 2 | 3 | two   | 0 |    |   |  0
-     | 3 | 2 | three | 0 |    | 1 | -1
-     | 3 | 2 | three | 0 |    | 2 |  2
-     | 3 | 2 | three | 0 |    | 3 | -3
-     | 3 | 2 | three | 0 |    | 2 |  4
-     | 3 | 2 | three | 0 |    | 5 | -5
-     | 3 | 2 | three | 0 |    | 5 | -5
-     | 3 | 2 | three | 0 |    | 0 |   
-     | 3 | 2 | three | 0 |    |   |   
-     | 3 | 2 | three | 0 |    |   |  0
-     | 4 | 1 | four  | 0 |    | 1 | -1
-     | 4 | 1 | four  | 0 |    | 2 |  2
-     | 4 | 1 | four  | 0 |    | 3 | -3
-     | 4 | 1 | four  | 0 |    | 2 |  4
-     | 4 | 1 | four  | 0 |    | 5 | -5
-     | 4 | 1 | four  | 0 |    | 5 | -5
-     | 4 | 1 | four  | 0 |    | 0 |   
-     | 4 | 1 | four  | 0 |    |   |   
-     | 4 | 1 | four  | 0 |    |   |  0
-     | 5 | 0 | five  | 0 |    | 1 | -1
-     | 5 | 0 | five  | 0 |    | 2 |  2
-     | 5 | 0 | five  | 0 |    | 3 | -3
-     | 5 | 0 | five  | 0 |    | 2 |  4
-     | 5 | 0 | five  | 0 |    | 5 | -5
-     | 5 | 0 | five  | 0 |    | 5 | -5
-     | 5 | 0 | five  | 0 |    | 0 |   
-     | 5 | 0 | five  | 0 |    |   |   
-     | 5 | 0 | five  | 0 |    |   |  0
-     | 6 | 6 | six   | 0 |    | 1 | -1
-     | 6 | 6 | six   | 0 |    | 2 |  2
-     | 6 | 6 | six   | 0 |    | 3 | -3
-     | 6 | 6 | six   | 0 |    | 2 |  4
-     | 6 | 6 | six   | 0 |    | 5 | -5
-     | 6 | 6 | six   | 0 |    | 5 | -5
-     | 6 | 6 | six   | 0 |    | 0 |   
-     | 6 | 6 | six   | 0 |    |   |   
-     | 6 | 6 | six   | 0 |    |   |  0
-     | 7 | 7 | seven | 0 |    | 1 | -1
-     | 7 | 7 | seven | 0 |    | 2 |  2
-     | 7 | 7 | seven | 0 |    | 3 | -3
-     | 7 | 7 | seven | 0 |    | 2 |  4
-     | 7 | 7 | seven | 0 |    | 5 | -5
-     | 7 | 7 | seven | 0 |    | 5 | -5
-     | 7 | 7 | seven | 0 |    | 0 |   
-     | 7 | 7 | seven | 0 |    |   |   
-     | 7 | 7 | seven | 0 |    |   |  0
-     | 8 | 8 | eight | 0 |    | 1 | -1
-     | 8 | 8 | eight | 0 |    | 2 |  2
-     | 8 | 8 | eight | 0 |    | 3 | -3
-     | 8 | 8 | eight | 0 |    | 2 |  4
-     | 8 | 8 | eight | 0 |    | 5 | -5
-     | 8 | 8 | eight | 0 |    | 5 | -5
-     | 8 | 8 | eight | 0 |    | 0 |   
-     | 8 | 8 | eight | 0 |    |   |   
-     | 8 | 8 | eight | 0 |    |   |  0
-     | 0 |   | zero  | 0 |    | 1 | -1
-     | 0 |   | zero  | 0 |    | 2 |  2
-     | 0 |   | zero  | 0 |    | 3 | -3
-     | 0 |   | zero  | 0 |    | 2 |  4
-     | 0 |   | zero  | 0 |    | 5 | -5
-     | 0 |   | zero  | 0 |    | 5 | -5
-     | 0 |   | zero  | 0 |    | 0 |   
-     | 0 |   | zero  | 0 |    |   |   
-     | 0 |   | zero  | 0 |    |   |  0
-     |   |   | null  | 0 |    | 1 | -1
-     |   |   | null  | 0 |    | 2 |  2
-     |   |   | null  | 0 |    | 3 | -3
-     |   |   | null  | 0 |    | 2 |  4
-     |   |   | null  | 0 |    | 5 | -5
-     |   |   | null  | 0 |    | 5 | -5
-     |   |   | null  | 0 |    | 0 |   
-     |   |   | null  | 0 |    |   |   
-     |   |   | null  | 0 |    |   |  0
-     |   | 0 | zero  | 0 |    | 1 | -1
-     |   | 0 | zero  | 0 |    | 2 |  2
-     |   | 0 | zero  | 0 |    | 3 | -3
-     |   | 0 | zero  | 0 |    | 2 |  4
-     |   | 0 | zero  | 0 |    | 5 | -5
-     |   | 0 | zero  | 0 |    | 5 | -5
-     |   | 0 | zero  | 0 |    | 0 |   
-     |   | 0 | zero  | 0 |    |   |   
-     |   | 0 | zero  | 0 |    |   |  0
-     | 1 | 4 | one   |   |    | 1 | -1
-     | 1 | 4 | one   |   |    | 2 |  2
-     | 1 | 4 | one   |   |    | 3 | -3
-     | 1 | 4 | one   |   |    | 2 |  4
-     | 1 | 4 | one   |   |    | 5 | -5
-     | 1 | 4 | one   |   |    | 5 | -5
-     | 1 | 4 | one   |   |    | 0 |   
-     | 1 | 4 | one   |   |    |   |   
-     | 1 | 4 | one   |   |    |   |  0
-     | 2 | 3 | two   |   |    | 1 | -1
-     | 2 | 3 | two   |   |    | 2 |  2
-     | 2 | 3 | two   |   |    | 3 | -3
-     | 2 | 3 | two   |   |    | 2 |  4
-     | 2 | 3 | two   |   |    | 5 | -5
-     | 2 | 3 | two   |   |    | 5 | -5
-     | 2 | 3 | two   |   |    | 0 |   
-     | 2 | 3 | two   |   |    |   |   
-     | 2 | 3 | two   |   |    |   |  0
-     | 3 | 2 | three |   |    | 1 | -1
-     | 3 | 2 | three |   |    | 2 |  2
-     | 3 | 2 | three |   |    | 3 | -3
-     | 3 | 2 | three |   |    | 2 |  4
-     | 3 | 2 | three |   |    | 5 | -5
-     | 3 | 2 | three |   |    | 5 | -5
-     | 3 | 2 | three |   |    | 0 |   
-     | 3 | 2 | three |   |    |   |   
-     | 3 | 2 | three |   |    |   |  0
-     | 4 | 1 | four  |   |    | 1 | -1
-     | 4 | 1 | four  |   |    | 2 |  2
-     | 4 | 1 | four  |   |    | 3 | -3
-     | 4 | 1 | four  |   |    | 2 |  4
-     | 4 | 1 | four  |   |    | 5 | -5
-     | 4 | 1 | four  |   |    | 5 | -5
-     | 4 | 1 | four  |   |    | 0 |   
-     | 4 | 1 | four  |   |    |   |   
-     | 4 | 1 | four  |   |    |   |  0
-     | 5 | 0 | five  |   |    | 1 | -1
-     | 5 | 0 | five  |   |    | 2 |  2
-     | 5 | 0 | five  |   |    | 3 | -3
-     | 5 | 0 | five  |   |    | 2 |  4
-     | 5 | 0 | five  |   |    | 5 | -5
-     | 5 | 0 | five  |   |    | 5 | -5
-     | 5 | 0 | five  |   |    | 0 |   
-     | 5 | 0 | five  |   |    |   |   
-     | 5 | 0 | five  |   |    |   |  0
-     | 6 | 6 | six   |   |    | 1 | -1
-     | 6 | 6 | six   |   |    | 2 |  2
-     | 6 | 6 | six   |   |    | 3 | -3
-     | 6 | 6 | six   |   |    | 2 |  4
-     | 6 | 6 | six   |   |    | 5 | -5
-     | 6 | 6 | six   |   |    | 5 | -5
-     | 6 | 6 | six   |   |    | 0 |   
-     | 6 | 6 | six   |   |    |   |   
-     | 6 | 6 | six   |   |    |   |  0
-     | 7 | 7 | seven |   |    | 1 | -1
-     | 7 | 7 | seven |   |    | 2 |  2
-     | 7 | 7 | seven |   |    | 3 | -3
-     | 7 | 7 | seven |   |    | 2 |  4
-     | 7 | 7 | seven |   |    | 5 | -5
-     | 7 | 7 | seven |   |    | 5 | -5
-     | 7 | 7 | seven |   |    | 0 |   
-     | 7 | 7 | seven |   |    |   |   
-     | 7 | 7 | seven |   |    |   |  0
-     | 8 | 8 | eight |   |    | 1 | -1
-     | 8 | 8 | eight |   |    | 2 |  2
-     | 8 | 8 | eight |   |    | 3 | -3
-     | 8 | 8 | eight |   |    | 2 |  4
-     | 8 | 8 | eight |   |    | 5 | -5
-     | 8 | 8 | eight |   |    | 5 | -5
-     | 8 | 8 | eight |   |    | 0 |   
-     | 8 | 8 | eight |   |    |   |   
-     | 8 | 8 | eight |   |    |   |  0
-     | 0 |   | zero  |   |    | 1 | -1
-     | 0 |   | zero  |   |    | 2 |  2
-     | 0 |   | zero  |   |    | 3 | -3
-     | 0 |   | zero  |   |    | 2 |  4
-     | 0 |   | zero  |   |    | 5 | -5
-     | 0 |   | zero  |   |    | 5 | -5
-     | 0 |   | zero  |   |    | 0 |   
-     | 0 |   | zero  |   |    |   |   
-     | 0 |   | zero  |   |    |   |  0
-     |   |   | null  |   |    | 1 | -1
-     |   |   | null  |   |    | 2 |  2
-     |   |   | null  |   |    | 3 | -3
-     |   |   | null  |   |    | 2 |  4
-     |   |   | null  |   |    | 5 | -5
-     |   |   | null  |   |    | 5 | -5
-     |   |   | null  |   |    | 0 |   
-     |   |   | null  |   |    |   |   
-     |   |   | null  |   |    |   |  0
-     |   | 0 | zero  |   |    | 1 | -1
-     |   | 0 | zero  |   |    | 2 |  2
-     |   | 0 | zero  |   |    | 3 | -3
-     |   | 0 | zero  |   |    | 2 |  4
-     |   | 0 | zero  |   |    | 5 | -5
-     |   | 0 | zero  |   |    | 5 | -5
-     |   | 0 | zero  |   |    | 0 |   
-     |   | 0 | zero  |   |    |   |   
-     |   | 0 | zero  |   |    |   |  0
-     | 1 | 4 | one   |   |  0 | 1 | -1
-     | 1 | 4 | one   |   |  0 | 2 |  2
-     | 1 | 4 | one   |   |  0 | 3 | -3
-     | 1 | 4 | one   |   |  0 | 2 |  4
-     | 1 | 4 | one   |   |  0 | 5 | -5
-     | 1 | 4 | one   |   |  0 | 5 | -5
-     | 1 | 4 | one   |   |  0 | 0 |   
-     | 1 | 4 | one   |   |  0 |   |   
-     | 1 | 4 | one   |   |  0 |   |  0
-     | 2 | 3 | two   |   |  0 | 1 | -1
-     | 2 | 3 | two   |   |  0 | 2 |  2
-     | 2 | 3 | two   |   |  0 | 3 | -3
-     | 2 | 3 | two   |   |  0 | 2 |  4
-     | 2 | 3 | two   |   |  0 | 5 | -5
-     | 2 | 3 | two   |   |  0 | 5 | -5
-     | 2 | 3 | two   |   |  0 | 0 |   
-     | 2 | 3 | two   |   |  0 |   |   
-     | 2 | 3 | two   |   |  0 |   |  0
-     | 3 | 2 | three |   |  0 | 1 | -1
-     | 3 | 2 | three |   |  0 | 2 |  2
-     | 3 | 2 | three |   |  0 | 3 | -3
-     | 3 | 2 | three |   |  0 | 2 |  4
-     | 3 | 2 | three |   |  0 | 5 | -5
-     | 3 | 2 | three |   |  0 | 5 | -5
-     | 3 | 2 | three |   |  0 | 0 |   
-     | 3 | 2 | three |   |  0 |   |   
-     | 3 | 2 | three |   |  0 |   |  0
-     | 4 | 1 | four  |   |  0 | 1 | -1
-     | 4 | 1 | four  |   |  0 | 2 |  2
-     | 4 | 1 | four  |   |  0 | 3 | -3
-     | 4 | 1 | four  |   |  0 | 2 |  4
-     | 4 | 1 | four  |   |  0 | 5 | -5
-     | 4 | 1 | four  |   |  0 | 5 | -5
-     | 4 | 1 | four  |   |  0 | 0 |   
-     | 4 | 1 | four  |   |  0 |   |   
-     | 4 | 1 | four  |   |  0 |   |  0
-     | 5 | 0 | five  |   |  0 | 1 | -1
-     | 5 | 0 | five  |   |  0 | 2 |  2
-     | 5 | 0 | five  |   |  0 | 3 | -3
-     | 5 | 0 | five  |   |  0 | 2 |  4
-     | 5 | 0 | five  |   |  0 | 5 | -5
-     | 5 | 0 | five  |   |  0 | 5 | -5
-     | 5 | 0 | five  |   |  0 | 0 |   
-     | 5 | 0 | five  |   |  0 |   |   
-     | 5 | 0 | five  |   |  0 |   |  0
-     | 6 | 6 | six   |   |  0 | 1 | -1
-     | 6 | 6 | six   |   |  0 | 2 |  2
-     | 6 | 6 | six   |   |  0 | 3 | -3
-     | 6 | 6 | six   |   |  0 | 2 |  4
-     | 6 | 6 | six   |   |  0 | 5 | -5
-     | 6 | 6 | six   |   |  0 | 5 | -5
-     | 6 | 6 | six   |   |  0 | 0 |   
-     | 6 | 6 | six   |   |  0 |   |   
-     | 6 | 6 | six   |   |  0 |   |  0
-     | 7 | 7 | seven |   |  0 | 1 | -1
-     | 7 | 7 | seven |   |  0 | 2 |  2
-     | 7 | 7 | seven |   |  0 | 3 | -3
-     | 7 | 7 | seven |   |  0 | 2 |  4
-     | 7 | 7 | seven |   |  0 | 5 | -5
-     | 7 | 7 | seven |   |  0 | 5 | -5
-     | 7 | 7 | seven |   |  0 | 0 |   
-     | 7 | 7 | seven |   |  0 |   |   
-     | 7 | 7 | seven |   |  0 |   |  0
-     | 8 | 8 | eight |   |  0 | 1 | -1
-     | 8 | 8 | eight |   |  0 | 2 |  2
-     | 8 | 8 | eight |   |  0 | 3 | -3
-     | 8 | 8 | eight |   |  0 | 2 |  4
-     | 8 | 8 | eight |   |  0 | 5 | -5
-     | 8 | 8 | eight |   |  0 | 5 | -5
-     | 8 | 8 | eight |   |  0 | 0 |   
-     | 8 | 8 | eight |   |  0 |   |   
-     | 8 | 8 | eight |   |  0 |   |  0
-     | 0 |   | zero  |   |  0 | 1 | -1
-     | 0 |   | zero  |   |  0 | 2 |  2
-     | 0 |   | zero  |   |  0 | 3 | -3
-     | 0 |   | zero  |   |  0 | 2 |  4
-     | 0 |   | zero  |   |  0 | 5 | -5
-     | 0 |   | zero  |   |  0 | 5 | -5
-     | 0 |   | zero  |   |  0 | 0 |   
-     | 0 |   | zero  |   |  0 |   |   
-     | 0 |   | zero  |   |  0 |   |  0
-     |   |   | null  |   |  0 | 1 | -1
-     |   |   | null  |   |  0 | 2 |  2
-     |   |   | null  |   |  0 | 3 | -3
-     |   |   | null  |   |  0 | 2 |  4
-     |   |   | null  |   |  0 | 5 | -5
-     |   |   | null  |   |  0 | 5 | -5
-     |   |   | null  |   |  0 | 0 |   
-     |   |   | null  |   |  0 |   |   
-     |   |   | null  |   |  0 |   |  0
-     |   | 0 | zero  |   |  0 | 1 | -1
-     |   | 0 | zero  |   |  0 | 2 |  2
-     |   | 0 | zero  |   |  0 | 3 | -3
-     |   | 0 | zero  |   |  0 | 2 |  4
-     |   | 0 | zero  |   |  0 | 5 | -5
-     |   | 0 | zero  |   |  0 | 5 | -5
-     |   | 0 | zero  |   |  0 | 0 |   
-     |   | 0 | zero  |   |  0 |   |   
-     |   | 0 | zero  |   |  0 |   |  0
-(891 rows)
-
+ERROR:  failed to JIT: evalexpr.0.0
 --
 --
 -- Inner joins (equi-joins)
@@ -2402,12 +1508,14 @@
 (3 rows)
 
 DELETE FROM t3 USING t1 JOIN t2 USING (a) WHERE t3.x > t1.a;
+ERROR:  failed to JIT: evalexpr.1.0
 SELECT * FROM t3;
- x | y 
----+---
- 6 | 7
- 7 | 8
-(2 rows)
+  x  |  y  
+-----+-----
+   6 |   7
+   7 |   8
+ 500 | 100
+(3 rows)
 
 DELETE FROM t3 USING t3 t3_other WHERE t3.x = t3_other.x AND t3.y = t3_other.y;
 SELECT * FROM t3;
@@ -4498,11 +3606,7 @@
 
 -- lateral with function in FROM
 select count(*) from tenk1 a, lateral generate_series(1,two) g;
- count 
--------
-  5000
-(1 row)
-
+ERROR:  failed to JIT: evalexpr.2.0
 explain (costs off)
   select count(*) from tenk1 a, lateral generate_series(1,two) g;
                    QUERY PLAN                   
@@ -6480,11 +5584,8 @@
 select count(*) from foo
   left join (select b1.id, b1.t from bar b1 join bar b2 using (id)) ss
   on foo.id < ss.id + 1 and foo.id > ss.id - 1;
- count 
--------
-     3
-(1 row)
-
+ERROR:  failed to JIT: evalexpr.0.0
+CONTEXT:  parallel worker
 select final > 1 as multibatch
   from hash_join_batches(
 $$
@@ -6492,11 +5593,7 @@
     left join (select b1.id, b1.t from bar b1 join bar b2 using (id)) ss
     on foo.id < ss.id + 1 and foo.id > ss.id - 1;
 $$);
- multibatch 
-------------
- t
-(1 row)
-
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 rollback to settings;
 -- single-batch with rescan, parallel-oblivious
 savepoint settings;
@@ -6531,11 +5628,8 @@
 select count(*) from foo
   left join (select b1.id, b1.t from bar b1 join bar b2 using (id)) ss
   on foo.id < ss.id + 1 and foo.id > ss.id - 1;
- count 
--------
-     3
-(1 row)
-
+ERROR:  failed to JIT: evalexpr.0.0
+CONTEXT:  parallel worker
 select final > 1 as multibatch
   from hash_join_batches(
 $$
@@ -6543,11 +5637,7 @@
     left join (select b1.id, b1.t from bar b1 join bar b2 using (id)) ss
     on foo.id < ss.id + 1 and foo.id > ss.id - 1;
 $$);
- multibatch 
-------------
- f
-(1 row)
-
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 rollback to settings;
 -- multi-batch with rescan, parallel-aware
 savepoint settings;
@@ -6582,11 +5672,8 @@
 select count(*) from foo
   left join (select b1.id, b1.t from bar b1 join bar b2 using (id)) ss
   on foo.id < ss.id + 1 and foo.id > ss.id - 1;
- count 
--------
-     3
-(1 row)
-
+ERROR:  failed to JIT: evalexpr.0.2
+CONTEXT:  parallel worker
 select final > 1 as multibatch
   from hash_join_batches(
 $$
@@ -6594,11 +5681,7 @@
     left join (select b1.id, b1.t from bar b1 join bar b2 using (id)) ss
     on foo.id < ss.id + 1 and foo.id > ss.id - 1;
 $$);
- multibatch 
-------------
- t
-(1 row)
-
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 rollback to settings;
 -- single-batch with rescan, parallel-aware
 savepoint settings;
@@ -6633,11 +5716,8 @@
 select count(*) from foo
   left join (select b1.id, b1.t from bar b1 join bar b2 using (id)) ss
   on foo.id < ss.id + 1 and foo.id > ss.id - 1;
- count 
--------
-     3
-(1 row)
-
+ERROR:  failed to JIT: evalexpr.0.0
+CONTEXT:  parallel worker
 select final > 1 as multibatch
   from hash_join_batches(
 $$
@@ -6645,11 +5725,7 @@
     left join (select b1.id, b1.t from bar b1 join bar b2 using (id)) ss
     on foo.id < ss.id + 1 and foo.id > ss.id - 1;
 $$);
- multibatch 
-------------
- f
-(1 row)
-
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 rollback to settings;
 -- A full outer join where every record is matched.
 -- non-parallel

======================================================================

--- src/test/regress/expected/collate.out	2018-03-02 18:38:36.000000000 -0500
+++ src/test/regress/results/collate.out	2018-03-03 09:18:36.000000000 -0500
@@ -599,7 +599,10 @@
 ERROR:  insert or update on table "collate_test22" violates foreign key constraint "collate_test22_f2_fkey"
 DETAIL:  Key (f2)=(baz) is not present in table "collate_test20".
 DELETE FROM collate_test22 WHERE f2 = 'baz';
+ERROR:  failed to JIT: evalexpr.0.1
 ALTER TABLE collate_test22 ADD FOREIGN KEY (f2) REFERENCES collate_test20;
+ERROR:  insert or update on table "collate_test22" violates foreign key constraint "collate_test22_f2_fkey"
+DETAIL:  Key (f2)=(baz) is not present in table "collate_test20".
 RESET enable_seqscan;
 RESET enable_hashjoin;
 RESET enable_nestloop;

======================================================================

--- src/test/regress/expected/groupingsets.out	2018-03-02 18:38:36.000000000 -0500
+++ src/test/regress/results/groupingsets.out	2018-03-03 09:18:37.000000000 -0500
@@ -305,11 +305,7 @@
 -- empty input with joins tests some important code paths
 select t1.a, t2.b, sum(t1.v), count(*) from gstest_empty t1, gstest_empty t2
  group by grouping sets ((t1.a,t2.b),());
- a | b | sum | count 
----+---+-----+-------
-   |   |     |     0
-(1 row)
-
+ERROR:  failed to JIT: evalexpr.0.5
 -- simple joins, var resolution, GROUPING on join vars
 select t1.a, t2.b, grouping(t1.a, t2.b), sum(t1.v), max(t2.a)
   from gstest1 t1, gstest2 t2

======================================================================

--- src/test/regress/expected/misc.out	2018-03-03 09:18:14.000000000 -0500
+++ src/test/regress/results/misc.out	2018-03-03 09:18:38.000000000 -0500
@@ -508,72 +508,24 @@
 -- everyone else is fine.
 --
 SELECT p.name, name(p.hobbies), name(equipment(p.hobbies)) FROM ONLY person p;
- name  |    name     |     name      
--------+-------------+---------------
- mike  | posthacking | advil
- mike  | posthacking | peet's coffee
- joe   | basketball  | hightops
- sally | basketball  | hightops
-(4 rows)
-
+ERROR:  failed to JIT: evalexpr.0.0
 --
 -- as above, but jeff needs advil and peet's coffee as well.
 --
 SELECT p.name, name(p.hobbies), name(equipment(p.hobbies)) FROM person* p;
- name  |    name     |     name      
--------+-------------+---------------
- mike  | posthacking | advil
- mike  | posthacking | peet's coffee
- joe   | basketball  | hightops
- sally | basketball  | hightops
- jeff  | posthacking | advil
- jeff  | posthacking | peet's coffee
-(6 rows)
-
+ERROR:  failed to JIT: evalexpr.1.0
 --
 -- just like the last two, but make sure that the target list fixup and
 -- unflattening is being done correctly.
 --
 SELECT name(equipment(p.hobbies)), p.name, name(p.hobbies) FROM ONLY person p;
-     name      | name  |    name     
----------------+-------+-------------
- advil         | mike  | posthacking
- peet's coffee | mike  | posthacking
- hightops      | joe   | basketball
- hightops      | sally | basketball
-(4 rows)
-
+ERROR:  failed to JIT: evalexpr.2.0
 SELECT (p.hobbies).equipment.name, p.name, name(p.hobbies) FROM person* p;
-     name      | name  |    name     
----------------+-------+-------------
- advil         | mike  | posthacking
- peet's coffee | mike  | posthacking
- hightops      | joe   | basketball
- hightops      | sally | basketball
- advil         | jeff  | posthacking
- peet's coffee | jeff  | posthacking
-(6 rows)
-
+ERROR:  failed to JIT: evalexpr.3.0
 SELECT (p.hobbies).equipment.name, name(p.hobbies), p.name FROM ONLY person p;
-     name      |    name     | name  
----------------+-------------+-------
- advil         | posthacking | mike
- peet's coffee | posthacking | mike
- hightops      | basketball  | joe
- hightops      | basketball  | sally
-(4 rows)
-
+ERROR:  failed to JIT: evalexpr.4.0
 SELECT name(equipment(p.hobbies)), name(p.hobbies), p.name FROM person* p;
-     name      |    name     | name  
----------------+-------------+-------
- advil         | posthacking | mike
- peet's coffee | posthacking | mike
- hightops      | basketball  | joe
- hightops      | basketball  | sally
- advil         | posthacking | jeff
- peet's coffee | posthacking | jeff
-(6 rows)
-
+ERROR:  failed to JIT: evalexpr.5.0
 SELECT name(equipment(hobby_construct(text 'skywalking', text 'mer')));
  name 
 ------

======================================================================

--- src/test/regress/expected/tsrf.out	2018-03-02 18:38:36.000000000 -0500
+++ src/test/regress/results/tsrf.out	2018-03-03 09:18:39.000000000 -0500
@@ -100,48 +100,12 @@
 
 -- but SRFs can be referenced in sort
 SELECT few.id, generate_series(1,3) g FROM few ORDER BY id, g DESC;
- id | g 
-----+---
-  1 | 3
-  1 | 2
-  1 | 1
-  2 | 3
-  2 | 2
-  2 | 1
-  3 | 3
-  3 | 2
-  3 | 1
-(9 rows)
-
+ERROR:  failed to JIT: evalexpr.0.0
 SELECT few.id, generate_series(1,3) g FROM few ORDER BY id, generate_series(1,3) DESC;
- id | g 
-----+---
-  1 | 3
-  1 | 2
-  1 | 1
-  2 | 3
-  2 | 2
-  2 | 1
-  3 | 3
-  3 | 2
-  3 | 1
-(9 rows)
-
+ERROR:  failed to JIT: evalexpr.1.0
 -- it's weird to have ORDER BYs that increase the number of results
 SELECT few.id FROM few ORDER BY id, generate_series(1,3) DESC;
- id 
-----
-  1
-  1
-  1
-  2
-  2
-  2
-  3
-  3
-  3
-(9 rows)
-
+ERROR:  failed to JIT: evalexpr.2.0
 -- SRFs are computed after aggregation
 SET enable_hashagg TO 0; -- stable output order
 SELECT few.dataa, count(*), min(id), max(id), unnest('{1,1,3}'::int[]) FROM few WHERE few.id = 1 GROUP BY few.dataa;
@@ -176,11 +140,7 @@
 (1 row)
 
 SELECT dataa, generate_series(1,1), count(*) FROM few GROUP BY 1, 2 HAVING count(*) > 1;
- dataa | generate_series | count 
--------+-----------------+-------
- a     |               1 |     2
-(1 row)
-
+ERROR:  failed to JIT: evalexpr.3.0
 -- it's weird to have GROUP BYs that increase the number of results
 SELECT few.dataa, count(*) FROM few WHERE dataa = 'a' GROUP BY few.dataa ORDER BY 2;
  dataa | count 
@@ -334,92 +294,11 @@
 (16 rows)
 
 SELECT dataa, datab b, generate_series(1,2) g, count(*) FROM few GROUP BY CUBE(dataa, datab, g);
- dataa |  b  | g | count 
--------+-----+---+-------
- a     | bar | 1 |     1
- a     | bar | 2 |     1
- a     | bar |   |     2
- a     | foo | 1 |     1
- a     | foo | 2 |     1
- a     | foo |   |     2
- a     |     |   |     4
- b     | bar | 1 |     1
- b     | bar | 2 |     1
- b     | bar |   |     2
- b     |     |   |     2
-       |     |   |     6
-       | bar | 1 |     2
-       | bar | 2 |     2
-       | bar |   |     4
-       | foo | 1 |     1
-       | foo | 2 |     1
-       | foo |   |     2
- a     |     | 1 |     2
- b     |     | 1 |     1
-       |     | 1 |     3
- a     |     | 2 |     2
- b     |     | 2 |     1
-       |     | 2 |     3
-(24 rows)
-
+ERROR:  failed to JIT: evalexpr.4.0
 SELECT dataa, datab b, generate_series(1,2) g, count(*) FROM few GROUP BY CUBE(dataa, datab, g) ORDER BY dataa;
- dataa |  b  | g | count 
--------+-----+---+-------
- a     | foo |   |     2
- a     |     |   |     4
- a     |     | 2 |     2
- a     | bar | 1 |     1
- a     | bar | 2 |     1
- a     | bar |   |     2
- a     | foo | 1 |     1
- a     | foo | 2 |     1
- a     |     | 1 |     2
- b     | bar | 1 |     1
- b     |     |   |     2
- b     |     | 1 |     1
- b     | bar | 2 |     1
- b     | bar |   |     2
- b     |     | 2 |     1
-       |     | 2 |     3
-       |     |   |     6
-       | bar | 1 |     2
-       | bar | 2 |     2
-       | bar |   |     4
-       | foo | 1 |     1
-       | foo | 2 |     1
-       | foo |   |     2
-       |     | 1 |     3
-(24 rows)
-
+ERROR:  failed to JIT: evalexpr.5.0
 SELECT dataa, datab b, generate_series(1,2) g, count(*) FROM few GROUP BY CUBE(dataa, datab, g) ORDER BY g;
- dataa |  b  | g | count 
--------+-----+---+-------
- a     | bar | 1 |     1
- a     | foo | 1 |     1
- b     | bar | 1 |     1
-       | bar | 1 |     2
-       | foo | 1 |     1
- a     |     | 1 |     2
- b     |     | 1 |     1
-       |     | 1 |     3
- a     |     | 2 |     2
- b     |     | 2 |     1
-       | bar | 2 |     2
-       |     | 2 |     3
-       | foo | 2 |     1
- a     | bar | 2 |     1
- a     | foo | 2 |     1
- b     | bar | 2 |     1
- a     |     |   |     4
- b     | bar |   |     2
- b     |     |   |     2
-       |     |   |     6
- a     | foo |   |     2
- a     | bar |   |     2
-       | bar |   |     4
-       | foo |   |     2
-(24 rows)
-
+ERROR:  failed to JIT: evalexpr.6.0
 reset enable_hashagg;
 -- data modification
 CREATE TABLE fewmore AS SELECT generate_series(1,3) AS data;

======================================================================

--- src/test/regress/expected/select_parallel.out	2018-03-02 18:38:36.000000000 -0500
+++ src/test/regress/results/select_parallel.out	2018-03-03 09:18:42.000000000 -0500
@@ -462,43 +462,28 @@
 (10 rows)
 
 select count(*) from tenk1, tenk2 where tenk1.hundred > 1 and tenk2.thousand=0;
- count 
--------
- 98000
-(1 row)
-
+ERROR:  failed to JIT: evalexpr.1.0
 create table bmscantest (a int, t text);
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 insert into bmscantest select r, 'fooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo' FROM generate_series(1,100000) r;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 create index i_bmtest ON bmscantest(a);
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 select count(*) from bmscantest where a>1;
- count 
--------
- 99999
-(1 row)
-
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 -- test accumulation of stats for parallel nodes
 reset enable_seqscan;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 alter table tenk2 set (parallel_workers = 0);
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 explain (analyze, timing off, summary off, costs off)
    select count(*) from tenk1, tenk2 where tenk1.hundred > 1
         and tenk2.thousand=0;
-                                QUERY PLAN                                
---------------------------------------------------------------------------
- Aggregate (actual rows=1 loops=1)
-   ->  Nested Loop (actual rows=98000 loops=1)
-         ->  Seq Scan on tenk2 (actual rows=10 loops=1)
-               Filter: (thousand = 0)
-               Rows Removed by Filter: 9990
-         ->  Gather (actual rows=9800 loops=10)
-               Workers Planned: 4
-               Workers Launched: 4
-               ->  Parallel Seq Scan on tenk1 (actual rows=1960 loops=50)
-                     Filter: (hundred > 1)
-                     Rows Removed by Filter: 40
-(11 rows)
-
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 alter table tenk2 reset (parallel_workers);
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 reset work_mem;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 create function explain_parallel_sort_stats() returns setof text
 language plpgsql as
 $$
@@ -515,99 +500,45 @@
     end loop;
 end;
 $$;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 select * from explain_parallel_sort_stats();
-                       explain_parallel_sort_stats                        
---------------------------------------------------------------------------
- Nested Loop Left Join (actual rows=30000 loops=1)
-   ->  Values Scan on "*VALUES*" (actual rows=3 loops=1)
-   ->  Gather Merge (actual rows=10000 loops=3)
-         Workers Planned: 4
-         Workers Launched: 4
-         ->  Sort (actual rows=2000 loops=15)
-               Sort Key: tenk1.ten
-               Sort Method: quicksort  Memory: xxx
-               Worker 0:  Sort Method: quicksort  Memory: xxx
-               Worker 1:  Sort Method: quicksort  Memory: xxx
-               Worker 2:  Sort Method: quicksort  Memory: xxx
-               Worker 3:  Sort Method: quicksort  Memory: xxx
-               ->  Parallel Seq Scan on tenk1 (actual rows=2000 loops=15)
-                     Filter: (ten < 100)
-(14 rows)
-
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 reset enable_indexscan;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 reset enable_hashjoin;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 reset enable_mergejoin;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 reset enable_material;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 reset effective_io_concurrency;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 drop table bmscantest;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 drop function explain_parallel_sort_stats();
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 -- test parallel merge join path.
 set enable_hashjoin to off;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 set enable_nestloop to off;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 explain (costs off)
 	select  count(*) from tenk1, tenk2 where tenk1.unique1 = tenk2.unique1;
-                                  QUERY PLAN                                   
--------------------------------------------------------------------------------
- Finalize Aggregate
-   ->  Gather
-         Workers Planned: 4
-         ->  Partial Aggregate
-               ->  Merge Join
-                     Merge Cond: (tenk1.unique1 = tenk2.unique1)
-                     ->  Parallel Index Only Scan using tenk1_unique1 on tenk1
-                     ->  Index Only Scan using tenk2_unique1 on tenk2
-(8 rows)
-
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 select  count(*) from tenk1, tenk2 where tenk1.unique1 = tenk2.unique1;
- count 
--------
- 10000
-(1 row)
-
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 reset enable_hashjoin;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 reset enable_nestloop;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 -- test gather merge
 set enable_hashagg = false;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 explain (costs off)
    select count(*) from tenk1 group by twenty;
-                     QUERY PLAN                     
-----------------------------------------------------
- Finalize GroupAggregate
-   Group Key: twenty
-   ->  Gather Merge
-         Workers Planned: 4
-         ->  Partial GroupAggregate
-               Group Key: twenty
-               ->  Sort
-                     Sort Key: twenty
-                     ->  Parallel Seq Scan on tenk1
-(9 rows)
-
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 select count(*) from tenk1 group by twenty;
- count 
--------
-   500
-   500
-   500
-   500
-   500
-   500
-   500
-   500
-   500
-   500
-   500
-   500
-   500
-   500
-   500
-   500
-   500
-   500
-   500
-   500
-(20 rows)
-
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 --test expressions in targetlist are pushed down for gather merge
 create or replace function simple_func(var1 integer) returns integer
 as $$
@@ -615,217 +546,83 @@
         return var1 + 10;
 end;
 $$ language plpgsql PARALLEL SAFE;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 explain (costs off, verbose)
     select ten, simple_func(ten) from tenk1 where ten < 100 order by ten;
-                     QUERY PLAN                      
------------------------------------------------------
- Gather Merge
-   Output: ten, (simple_func(ten))
-   Workers Planned: 4
-   ->  Result
-         Output: ten, simple_func(ten)
-         ->  Sort
-               Output: ten
-               Sort Key: tenk1.ten
-               ->  Parallel Seq Scan on public.tenk1
-                     Output: ten
-                     Filter: (tenk1.ten < 100)
-(11 rows)
-
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 drop function simple_func(integer);
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 -- test gather merge with parallel leader participation disabled
 set parallel_leader_participation = off;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 explain (costs off)
    select count(*) from tenk1 group by twenty;
-                     QUERY PLAN                     
-----------------------------------------------------
- Finalize GroupAggregate
-   Group Key: twenty
-   ->  Gather Merge
-         Workers Planned: 4
-         ->  Partial GroupAggregate
-               Group Key: twenty
-               ->  Sort
-                     Sort Key: twenty
-                     ->  Parallel Seq Scan on tenk1
-(9 rows)
-
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 select count(*) from tenk1 group by twenty;
- count 
--------
-   500
-   500
-   500
-   500
-   500
-   500
-   500
-   500
-   500
-   500
-   500
-   500
-   500
-   500
-   500
-   500
-   500
-   500
-   500
-   500
-(20 rows)
-
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 reset parallel_leader_participation;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 --test rescan behavior of gather merge
 set enable_material = false;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 explain (costs off)
 select * from
   (select string4, count(unique2)
    from tenk1 group by string4 order by string4) ss
   right join (values (1),(2),(3)) v(x) on true;
-                        QUERY PLAN                        
-----------------------------------------------------------
- Nested Loop Left Join
-   ->  Values Scan on "*VALUES*"
-   ->  Finalize GroupAggregate
-         Group Key: tenk1.string4
-         ->  Gather Merge
-               Workers Planned: 4
-               ->  Partial GroupAggregate
-                     Group Key: tenk1.string4
-                     ->  Sort
-                           Sort Key: tenk1.string4
-                           ->  Parallel Seq Scan on tenk1
-(11 rows)
-
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 select * from
   (select string4, count(unique2)
    from tenk1 group by string4 order by string4) ss
   right join (values (1),(2),(3)) v(x) on true;
- string4 | count | x 
----------+-------+---
- AAAAxx  |  2500 | 1
- HHHHxx  |  2500 | 1
- OOOOxx  |  2500 | 1
- VVVVxx  |  2500 | 1
- AAAAxx  |  2500 | 2
- HHHHxx  |  2500 | 2
- OOOOxx  |  2500 | 2
- VVVVxx  |  2500 | 2
- AAAAxx  |  2500 | 3
- HHHHxx  |  2500 | 3
- OOOOxx  |  2500 | 3
- VVVVxx  |  2500 | 3
-(12 rows)
-
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 reset enable_material;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 reset enable_hashagg;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 -- check parallelized int8 aggregate (bug #14897)
 explain (costs off)
 select avg(unique1::int8) from tenk1;
-                               QUERY PLAN                                
--------------------------------------------------------------------------
- Finalize Aggregate
-   ->  Gather
-         Workers Planned: 4
-         ->  Partial Aggregate
-               ->  Parallel Index Only Scan using tenk1_unique1 on tenk1
-(5 rows)
-
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 select avg(unique1::int8) from tenk1;
-          avg          
------------------------
- 4999.5000000000000000
-(1 row)
-
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 -- gather merge test with a LIMIT
 explain (costs off)
   select fivethous from tenk1 order by fivethous limit 4;
-                  QUERY PLAN                  
-----------------------------------------------
- Limit
-   ->  Gather Merge
-         Workers Planned: 4
-         ->  Sort
-               Sort Key: fivethous
-               ->  Parallel Seq Scan on tenk1
-(6 rows)
-
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 select fivethous from tenk1 order by fivethous limit 4;
- fivethous 
------------
-         0
-         0
-         1
-         1
-(4 rows)
-
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 -- gather merge test with 0 worker
 set max_parallel_workers = 0;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 explain (costs off)
    select string4 from tenk1 order by string4 limit 5;
-                  QUERY PLAN                  
-----------------------------------------------
- Limit
-   ->  Gather Merge
-         Workers Planned: 4
-         ->  Sort
-               Sort Key: string4
-               ->  Parallel Seq Scan on tenk1
-(6 rows)
-
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 select string4 from tenk1 order by string4 limit 5;
- string4 
----------
- AAAAxx
- AAAAxx
- AAAAxx
- AAAAxx
- AAAAxx
-(5 rows)
-
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 -- gather merge test with 0 workers, with parallel leader
 -- participation disabled (the leader will have to run the plan
 -- despite the setting)
 set parallel_leader_participation = off;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 explain (costs off)
    select string4 from tenk1 order by string4 limit 5;
-                  QUERY PLAN                  
-----------------------------------------------
- Limit
-   ->  Gather Merge
-         Workers Planned: 4
-         ->  Sort
-               Sort Key: string4
-               ->  Parallel Seq Scan on tenk1
-(6 rows)
-
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 select string4 from tenk1 order by string4 limit 5;
- string4 
----------
- AAAAxx
- AAAAxx
- AAAAxx
- AAAAxx
- AAAAxx
-(5 rows)
-
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 reset parallel_leader_participation;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 reset max_parallel_workers;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 SAVEPOINT settings;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 SET LOCAL force_parallel_mode = 1;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 explain (costs off)
   select stringu1::int2 from tenk1 where unique1 = 1;
-                  QUERY PLAN                   
------------------------------------------------
- Gather
-   Workers Planned: 1
-   Single Copy: true
-   ->  Index Scan using tenk1_unique1 on tenk1
-         Index Cond: (unique1 = 1)
-(5 rows)
-
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 ROLLBACK TO SAVEPOINT settings;
+ERROR:  no such savepoint
 -- exercise record typmod remapping between backends
 CREATE OR REPLACE FUNCTION make_record(n int)
   RETURNS RECORD LANGUAGE plpgsql PARALLEL SAFE AS
@@ -840,54 +637,52 @@
          END;
 END;
 $$;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 SAVEPOINT settings;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 SET LOCAL force_parallel_mode = 1;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 SELECT make_record(x) FROM (SELECT generate_series(1, 5) x) ss ORDER BY x;
- make_record 
--------------
- (1)
- (1,2)
- (1,2,3)
- (1,2,3,4)
- (1,2,3,4,5)
-(5 rows)
-
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 ROLLBACK TO SAVEPOINT settings;
+ERROR:  no such savepoint
 DROP function make_record(n int);
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 -- test the sanity of parallel query after the active role is dropped.
 drop role if exists regress_parallel_worker;
-NOTICE:  role "regress_parallel_worker" does not exist, skipping
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 create role regress_parallel_worker;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 set role regress_parallel_worker;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 reset session authorization;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 drop role regress_parallel_worker;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 set force_parallel_mode = 1;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 select count(*) from tenk1;
- count 
--------
- 10000
-(1 row)
-
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 reset force_parallel_mode;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 reset role;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 -- to increase the parallel query test coverage
 SAVEPOINT settings;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 SET LOCAL force_parallel_mode = 1;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 EXPLAIN (analyze, timing off, summary off, costs off) SELECT * FROM tenk1;
-                         QUERY PLAN                          
--------------------------------------------------------------
- Gather (actual rows=10000 loops=1)
-   Workers Planned: 4
-   Workers Launched: 4
-   ->  Parallel Seq Scan on tenk1 (actual rows=2000 loops=5)
-(4 rows)
-
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 ROLLBACK TO SAVEPOINT settings;
+ERROR:  no such savepoint
 -- provoke error in worker
 SAVEPOINT settings;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 SET LOCAL force_parallel_mode = 1;
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 select stringu1::int2 from tenk1 where unique1 = 1;
-ERROR:  invalid input syntax for integer: "BAAAAA"
-CONTEXT:  parallel worker
+ERROR:  current transaction is aborted, commands ignored until end of transaction block
 ROLLBACK TO SAVEPOINT settings;
+ERROR:  no such savepoint
 rollback;

======================================================================

--- src/test/regress/expected/tsearch.out	2018-03-02 18:38:36.000000000 -0500
+++ src/test/regress/results/tsearch.out	2018-03-03 09:18:44.000000000 -0500
@@ -171,11 +171,7 @@
 (1 row)
 
 SELECT count(*) FROM test_tsvector WHERE a @@ any ('{wr,qh}');
- count 
--------
-   158
-(1 row)
-
+ERROR:  failed to JIT: evalexpr.0.0
 SELECT count(*) FROM test_tsvector WHERE a @@ 'no_such_lexeme';
  count 
 -------

======================================================================

--- src/test/regress/expected/rangefuncs.out	2018-03-02 18:38:36.000000000 -0500
+++ src/test/regress/results/rangefuncs.out	2018-03-03 09:18:50.000000000 -0500
@@ -1139,23 +1139,7 @@
 (1 row)
 
 SELECT * FROM generate_series(1,2) r1, generate_series(r1,3) r2, ROWS FROM( foo_sql(10+r1,13), foo_mat(10+r2,13) );
- r1 | r2 | i  | s  | i  | s 
-----+----+----+----+----+---
-  1 |  1 | 11 |  1 | 11 | 1
-  1 |  1 | 12 |  2 | 12 | 2
-  1 |  1 | 13 |  3 | 13 | 3
-  1 |  2 | 11 |  4 | 12 | 4
-  1 |  2 | 12 |  5 | 13 | 5
-  1 |  2 | 13 |  6 |    |  
-  1 |  3 | 11 |  7 | 13 | 6
-  1 |  3 | 12 |  8 |    |  
-  1 |  3 | 13 |  9 |    |  
-  2 |  2 | 12 | 10 | 12 | 7
-  2 |  2 | 13 | 11 | 13 | 8
-  2 |  3 | 12 | 12 | 13 | 9
-  2 |  3 | 13 | 13 |    |  
-(13 rows)
-
+ERROR:  failed to JIT: evalexpr.0.0
 SELECT * FROM (VALUES (1),(2),(3)) v(r), generate_series(10+r,20-r) f(i);
  r | i  
 ---+----

======================================================================

--- src/test/regress/expected/with.out	2018-03-02 18:38:36.000000000 -0500
+++ src/test/regress/results/with.out	2018-03-03 09:18:52.000000000 -0500
@@ -428,42 +428,7 @@
        select * from x)
     )
 select * from q limit 32;
- id | parent_department | name 
-----+-------------------+------
-  0 |                   | ROOT
-  1 |                 0 | A
-  2 |                 1 | B
-  3 |                 2 | C
-  4 |                 2 | D
-  5 |                 0 | E
-  6 |                 4 | F
-  7 |                 5 | G
-  0 |                   | ROOT
-  1 |                 0 | A
-  2 |                 1 | B
-  3 |                 2 | C
-  4 |                 2 | D
-  5 |                 0 | E
-  6 |                 4 | F
-  7 |                 5 | G
-  0 |                   | ROOT
-  1 |                 0 | A
-  2 |                 1 | B
-  3 |                 2 | C
-  4 |                 2 | D
-  5 |                 0 | E
-  6 |                 4 | F
-  7 |                 5 | G
-  0 |                   | ROOT
-  1 |                 0 | A
-  2 |                 1 | B
-  3 |                 2 | C
-  4 |                 2 | D
-  5 |                 0 | E
-  6 |                 4 | F
-  7 |                 5 | G
-(32 rows)
-
+ERROR:  failed to JIT: evalexpr.0.0
 -- recursive term has sub-UNION
 WITH RECURSIVE t(i,j) AS (
 	VALUES (1,2)

======================================================================

#148Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#147)
Re: JIT compiling with LLVM v11

Hi,

On 2018-03-03 09:37:35 -0500, Peter Eisentraut wrote:

On 3/2/18 19:29, Andres Freund wrote:

Using my standard set of CC=gcc-7 and CXX=g++-7, the build fails with

g++-7: error: unrecognized command line option '-stdlib=libc++'

It's actually already filtered, I just added -std*, because of selecting
the c++ standard, I guess I need to filter more aggressively. This is
fairly fairly annoying.

I see you already filter llvm-config --cflags by picking only -I and -D.
Why not do the same for --cxxflags? Any other options that we need
like -f* should be discovered using the normal
does-the-compiler-support-this-option tests.

Well, some -f obtions are ABI / behaviour influencing. You can't, to my
knowledge, mix/match code build with -fno-rtti with code built with it
(influences symbol names). LLVM builds without rtti by default, but a
lot of distros enable it...

I narrowed the filter to -std= (from -std), which should take care of
the -stdlib bit. I also dropped -fno-exceptions being copied since that
should not conflict.

It seems that it was intended that way anyway, since llvmjit.h contains
its own provisions for extern C.

Hrmpf, yea, I broke that the third time now. I'm actually inclined to
add an appropriate #ifdef ... #error so it's not repeated, what do you
think?

Not sure. Why not just move the line and not move it again? ;-)

Heh, done ;). Let's see how long it takes...

Does putting an
override COMPILER = $(CXX) $(CFLAGS)

into src/backend/jit/llvm/Makefile work? It does force the use of CXX
for all important platforms if I see it correctly. Verified that it
works on linux.

Your latest HEAD builds out of the box for me now using the system compiler.

Cool.

configure didn't find any of the LLVMOrc* symbols it was looking for.
Is that a problem? They seem to be for some debugging support.

That's not a problem, except that the symbols won't be registered with
the debugger, which is a bit annoying for backtraces. I tried to have
configure throw errors in cases llvm is too old or such.

Where does one get those then? I have LLVM 5.0.1. Is there something
even newer?

I've submitted them upstream, but they're not yet released.

Hm, I'll switch them on in the development branch. Independent of the
final decision that's definitely the right thing for now. The "full
capability" of the patchset is used if you turn on these three GUCs:

-c jit_expressions=1
-c jit_tuple_deforming=1
-c jit_perform_inlining=1

The last one doesn't seem to exist anymore.

Yup, as discussed in the earlier reply to you, I decided it's not
particularly useful to have. As also threatened in that reply, I've
switched the defaults so you shouldn't have to change them anymore.

If I turn on either of the first two, then make installcheck fails. See
attached diff.

Hm, so there's definitely something going on here that I don't yet
understand. I've pushed something that I've a slight hunch about
(dropping the dots from the symbol names, some tooling doesn't seem to
like that).

I'd to rebase to fix a few issues, but I've left the changes made since
the last push as separate commits.

Could you run something like:
regression[18425][1]=# set jit_above_cost = 0;
SET
regression[18425][1]=# set client_min_messages=debug2;
SET
regression[18425][1]=# SELECT pg_jit_available();
DEBUG: 00000: probing availability of llvm for JIT at /home/andres/build/postgres/dev-assert/install/lib/llvmjit.so
LOCATION: provider_init, jit.c:83
DEBUG: 00000: successfully loaded LLVM in current session
LOCATION: provider_init, jit.c:107
DEBUG: 00000: time to opt: 0.001s
LOCATION: llvm_compile_module, llvmjit.c:435
DEBUG: 00000: time to emit: 0.014s
LOCATION: llvm_compile_module, llvmjit.c:481
┌──────────────────┐
│ pg_jit_available │
├──────────────────┤
│ t │
└──────────────────┘
(1 row)

regression[18425][1]=# select now();
DEBUG: 00000: time to opt: 0.001s
LOCATION: llvm_compile_module, llvmjit.c:435
DEBUG: 00000: time to emit: 0.008s
LOCATION: llvm_compile_module, llvmjit.c:481
┌───────────────────────────────┐
│ now │
├───────────────────────────────┤
│ 2018-03-03 11:33:13.776947-08 │
└───────────────────────────────┘
(1 row)

regression[18425][1]=# SET jit_dump_bitcode = 1;
SET
regression[18425][1]=# select now();
DEBUG: 00000: time to opt: 0.002s
LOCATION: llvm_compile_module, llvmjit.c:435
DEBUG: 00000: time to emit: 0.018s
LOCATION: llvm_compile_module, llvmjit.c:481
┌───────────────────────────────┐
│ now │
├───────────────────────────────┤
│ 2018-03-03 11:33:23.508875-08 │
└───────────────────────────────┘
(1 row)

The last command should have dumped something into your data directory,
even if it failed like your regression test output showed. Could attach
the two files something like
ls -lstr /srv/dev/pgdev-dev/*.b
would show if /srv/dev/pgdev-dev/ is your test directory?

If my random hunch or this doesn't bear fruit, I'm going to have to get
access to an OSX machine somehow :(

Independent of this, I'm working to make the code pgindent
compliant. Given the typical coding patterns when emitting IR (nested
function calls) that's painful because pgindent insists on indenting
everything a lot. I've started adding a few small wrapper functions to
make that bearable...

Greetings,

Andres Freund

#149Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Andres Freund (#148)
Re: JIT compiling with LLVM v11

On Sun, Mar 4, 2018 at 8:39 AM, Andres Freund <andres@anarazel.de> wrote:

On 2018-03-03 09:37:35 -0500, Peter Eisentraut wrote:

[discussion of making this work on a Mac]

I tried out your "jit" branch on my macOS 10.13.3 system. Vendor "cc"
and "c++" are version "Apple LLVM version 9.0.0 (clang-900.0.39.2)".
I used MacPorts (whereas Peter E is using HomeBrew) to install LLVM
with "sudo port install llvm-5.0".

First, I built it like this:

./configure
--prefix=$HOME/install/postgres \
--enable-debug --enable-cassert --enable-depend --with-llvm --with-openssl \
--enable-tap-tests \
--with-includes="/opt/local/include" --with-libraries="/opt/local/lib" \
CC="ccache cc" CXX="ccache c++" LLVM_CONFIG=/opt/local/bin/llvm-config-mp-5.0

The build succeeded, initdb ran, the server started up, and then I
tried the sequence Andres showed:

set jit_above_cost = 0;
set client_min_messages=debug2;
SELECT pg_jit_available();

On that last command I got:

DEBUG: probing availability of llvm for JIT at
/Users/munro/install/postgres/lib/llvmjit.so
DEBUG: successfully loaded LLVM in current session
DEBUG: time to opt: 0.001s
DEBUG: time to emit: 0.034s
ERROR: failed to JIT: evalexpr_0_0

Looking at the server output I saw:

warning: ignoring debug info with an invalid version (700000003) in
/Users/munro/install/postgres/lib/llvmjit_types.bc
2018-03-05 16:50:05.888 NZDT [14797] ERROR: failed to JIT: evalexpr_0_0
2018-03-05 16:50:05.888 NZDT [14797] STATEMENT: SELECT pg_jit_available();

I could see that llvmjit_types.bc had been produced by this command:

/usr/bin/clang -Wno-ignored-attributes -Wno-unknown-warning-option
-Wno-ignored-optimization-argument -Wall -Wmissing-prototypes
-Wpointer-arith -Wdeclaration-after-statement -Wendif-labels
-Wmissing-format-attribute -Wformat-security -fno-strict-aliasing
-fwrapv -Wno-unused-command-line-argument -g -O0 -Wall -Werror -O1
-I../../../../src/include -I/opt/local/include -flto=thin -emit-llvm
-c -o pseudotypes.bc pseudotypes.c

So I tried installing a later clang with "sudo port install clang-5.0"
and setting CLANG=/pt/local/bin/clang-mp-5.0. It builds and uses that
clang to generate the .bc files, but gives the same error, this time
without the "warning" message.

Looking at llvm_get_function(), the function that raises that error, I
see that there are a few different paths here. I don't have
HAVE_DECL_LLVMORCGETSYMBOLADDRESSIN defined, and I don't have LLVM <
5, so I should be getting the symbol address with
LLVMOrcGetSymbolAddress(llvm_opt0_orc, &addr, mangled) or
LLVMOrcGetSymbolAddress(llvm_opt3_orc, &addr, mangled), but clearly
those are returning NULL.

Not sure what's happening yet...

--
Thomas Munro
http://www.enterprisedb.com

#150Andres Freund
andres@anarazel.de
In reply to: Thomas Munro (#149)
Re: JIT compiling with LLVM v11

Hi,

On 2018-03-05 17:32:09 +1300, Thomas Munro wrote:

I tried out your "jit" branch on my macOS 10.13.3 system. Vendor "cc"
and "c++" are version "Apple LLVM version 9.0.0 (clang-900.0.39.2)".
I used MacPorts (whereas Peter E is using HomeBrew) to install LLVM
with "sudo port install llvm-5.0".

Thanks for checking!

warning: ignoring debug info with an invalid version (700000003) in
/Users/munro/install/postgres/lib/llvmjit_types.bc

That's harmless, log output aside. Should strip the debug info there, to
remove the potential for that issue.

Looking at llvm_get_function(), the function that raises that error, I
see that there are a few different paths here. I don't have
HAVE_DECL_LLVMORCGETSYMBOLADDRESSIN defined, and I don't have LLVM <
5, so I should be getting the symbol address with
LLVMOrcGetSymbolAddress(llvm_opt0_orc, &addr, mangled) or
LLVMOrcGetSymbolAddress(llvm_opt3_orc, &addr, mangled), but clearly
those are returning NULL.

Yep. I wonder if this is some symbol naming issue or such, because
emitting and relocating the object worked without an error.

Not sure what's happening yet...

Hm. :/

Greetings,

Andres Freund

#151Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#150)
Re: JIT compiling with LLVM v11

Hi,

On 2018-03-04 21:00:06 -0800, Andres Freund wrote:

Looking at llvm_get_function(), the function that raises that error, I
see that there are a few different paths here. I don't have
HAVE_DECL_LLVMORCGETSYMBOLADDRESSIN defined, and I don't have LLVM <
5, so I should be getting the symbol address with
LLVMOrcGetSymbolAddress(llvm_opt0_orc, &addr, mangled) or
LLVMOrcGetSymbolAddress(llvm_opt3_orc, &addr, mangled), but clearly
those are returning NULL.

Yep. I wonder if this is some symbol naming issue or such, because
emitting and relocating the object worked without an error.

Thanks to Thomas helping get access to an OSX machine I was able to
discover what the issue is. OSX prepends, for reason unbeknownst to me,
a leading underscore to all function names. That lead to two issues:
First JITed functions do not have that underscore (making us look up a
non-existing symbol, because llvm_get_function applied
mangling). Secondly, llvm_resolve_symbol failed looking up symbol names,
because for $reason dlsym() etc do *not* have the names prefixed by the
underscore. Easily enough fixed.

After that I discovered another problem, the bitcode files for core pg /
contrib modules weren't installed. That turned out to be a make version
issue, I'd used
define install_llvm_module =
# body
but older make only like
define install_llvm_module
# body

Writing up a patch that I can actually push. Thanks both to Thomas and
Peter for pointing me towards this issue!

Greetings,

Andres Freund

#152Peter Eisentraut
peter.eisentraut@2ndquadrant.com
In reply to: Andres Freund (#151)
Re: JIT compiling with LLVM v11

Testing 0732ee73cf3ffd18d0f651376d69d4798d351ccc on Debian testing ...

The build works out of the box with whatever the default system packages
are.

Regression tests crash many times. One backtrace looks like this:

#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1 0x00007fd5b1730231 in __GI_abort () at abort.c:79
#2 0x000055c10a1555e3 in ExceptionalCondition
(conditionName=conditionName@entry=0x7fd5a245c2d8
"!(LLVMGetIntrinsicID(fn))",
errorType=errorType@entry=0x7fd5a245bb1d "FailedAssertion",
fileName=fileName@entry=0x7fd5a245c294 "llvmjit_expr.c",
lineNumber=lineNumber@entry=193) at assert.c:54
#3 0x00007fd5a245510f in get_LifetimeEnd (mod=mod@entry=0x55c10b1db670)
at llvmjit_expr.c:193
#4 0x00007fd5a24553c8 in get_LifetimeEnd (mod=0x55c10b1db670) at
llvmjit_expr.c:233
#5 BuildFunctionCall (context=context@entry=0x55c10b0ca340,
builder=builder@entry=0x55c10b225160,
mod=mod@entry=0x55c10b1db670, fcinfo=0x55c10b1a08b0,
v_fcinfo_isnull=v_fcinfo_isnull@entry=0x7ffc701f5c60)
at llvmjit_expr.c:244

...

#16 0x000055c10a0433ad in exec_simple_query (
query_string=0x55c10b096358 "SELECT COUNT(*) FROM test_tsquery WHERE
keyword < 'new & york';") at postgres.c:1082

--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#153Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#152)
Re: JIT compiling with LLVM v11

On 2018-03-05 16:19:52 -0500, Peter Eisentraut wrote:

Testing 0732ee73cf3ffd18d0f651376d69d4798d351ccc on Debian testing ...

The build works out of the box with whatever the default system packages
are.

Regression tests crash many times. One backtrace looks like this:

#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1 0x00007fd5b1730231 in __GI_abort () at abort.c:79
#2 0x000055c10a1555e3 in ExceptionalCondition
(conditionName=conditionName@entry=0x7fd5a245c2d8
"!(LLVMGetIntrinsicID(fn))",
errorType=errorType@entry=0x7fd5a245bb1d "FailedAssertion",
fileName=fileName@entry=0x7fd5a245c294 "llvmjit_expr.c",
lineNumber=lineNumber@entry=193) at assert.c:54
#3 0x00007fd5a245510f in get_LifetimeEnd (mod=mod@entry=0x55c10b1db670)
at llvmjit_expr.c:193
#4 0x00007fd5a24553c8 in get_LifetimeEnd (mod=0x55c10b1db670) at
llvmjit_expr.c:233
#5 BuildFunctionCall (context=context@entry=0x55c10b0ca340,
builder=builder@entry=0x55c10b225160,
mod=mod@entry=0x55c10b1db670, fcinfo=0x55c10b1a08b0,
v_fcinfo_isnull=v_fcinfo_isnull@entry=0x7ffc701f5c60)
at llvmjit_expr.c:244

Hm, that should be trivial to fix. Which version of llvm are you
building against? There appear to be a lot of them in testing:
https://packages.debian.org/search?keywords=llvm+dev&amp;searchon=names&amp;suite=testing&amp;section=all

Greetings,

Andres Freund

#154Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#151)
Re: JIT compiling with LLVM v11

Hi,

On 2018-03-05 12:17:30 -0800, Andres Freund wrote:

Writing up a patch that I can actually push. Thanks both to Thomas and
Peter for pointing me towards this issue!

After screwing the first attempt at a fix, the second one seems to work
nicely. With optimizations, inlining, etc all core tests pass on
Thomas' machine.

Greetings,

Andres Freund

#155Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#153)
Re: JIT compiling with LLVM v11

On 2018-03-05 13:36:04 -0800, Andres Freund wrote:

On 2018-03-05 16:19:52 -0500, Peter Eisentraut wrote:

Testing 0732ee73cf3ffd18d0f651376d69d4798d351ccc on Debian testing ...

The build works out of the box with whatever the default system packages
are.

Regression tests crash many times. One backtrace looks like this:

#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1 0x00007fd5b1730231 in __GI_abort () at abort.c:79
#2 0x000055c10a1555e3 in ExceptionalCondition
(conditionName=conditionName@entry=0x7fd5a245c2d8
"!(LLVMGetIntrinsicID(fn))",
errorType=errorType@entry=0x7fd5a245bb1d "FailedAssertion",
fileName=fileName@entry=0x7fd5a245c294 "llvmjit_expr.c",
lineNumber=lineNumber@entry=193) at assert.c:54
#3 0x00007fd5a245510f in get_LifetimeEnd (mod=mod@entry=0x55c10b1db670)
at llvmjit_expr.c:193
#4 0x00007fd5a24553c8 in get_LifetimeEnd (mod=0x55c10b1db670) at
llvmjit_expr.c:233
#5 BuildFunctionCall (context=context@entry=0x55c10b0ca340,
builder=builder@entry=0x55c10b225160,
mod=mod@entry=0x55c10b1db670, fcinfo=0x55c10b1a08b0,
v_fcinfo_isnull=v_fcinfo_isnull@entry=0x7ffc701f5c60)
at llvmjit_expr.c:244

Hm, that should be trivial to fix. Which version of llvm are you
building against? There appear to be a lot of them in testing:
https://packages.debian.org/search?keywords=llvm+dev&amp;searchon=names&amp;suite=testing&amp;section=all

On Debian unstable, I built against a wide variety of branches:

for v in 3.9 4.0 5.0 6.0;do rm -f ../config.cache;CLANG="ccache clang-$v" LLVM_CONFIG=/usr/lib/llvm-$v/bin/llvm-config ../config.sh --with-llvm && make -j16 -s install && make -s check;done

All of those pass. I'll create a testing chroot.

Regards,

Andres

#156Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#155)
Re: JIT compiling with LLVM v11

On 2018-03-05 14:01:05 -0800, Andres Freund wrote:

On 2018-03-05 13:36:04 -0800, Andres Freund wrote:

On 2018-03-05 16:19:52 -0500, Peter Eisentraut wrote:

Testing 0732ee73cf3ffd18d0f651376d69d4798d351ccc on Debian testing ...

The build works out of the box with whatever the default system packages
are.

Regression tests crash many times. One backtrace looks like this:

#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1 0x00007fd5b1730231 in __GI_abort () at abort.c:79
#2 0x000055c10a1555e3 in ExceptionalCondition
(conditionName=conditionName@entry=0x7fd5a245c2d8
"!(LLVMGetIntrinsicID(fn))",
errorType=errorType@entry=0x7fd5a245bb1d "FailedAssertion",
fileName=fileName@entry=0x7fd5a245c294 "llvmjit_expr.c",
lineNumber=lineNumber@entry=193) at assert.c:54
#3 0x00007fd5a245510f in get_LifetimeEnd (mod=mod@entry=0x55c10b1db670)
at llvmjit_expr.c:193
#4 0x00007fd5a24553c8 in get_LifetimeEnd (mod=0x55c10b1db670) at
llvmjit_expr.c:233
#5 BuildFunctionCall (context=context@entry=0x55c10b0ca340,
builder=builder@entry=0x55c10b225160,
mod=mod@entry=0x55c10b1db670, fcinfo=0x55c10b1a08b0,
v_fcinfo_isnull=v_fcinfo_isnull@entry=0x7ffc701f5c60)
at llvmjit_expr.c:244

Hm, that should be trivial to fix. Which version of llvm are you
building against? There appear to be a lot of them in testing:
https://packages.debian.org/search?keywords=llvm+dev&amp;searchon=names&amp;suite=testing&amp;section=all

On Debian unstable, I built against a wide variety of branches:

for v in 3.9 4.0 5.0 6.0;do rm -f ../config.cache;CLANG="ccache clang-$v" LLVM_CONFIG=/usr/lib/llvm-$v/bin/llvm-config ../config.sh --with-llvm && make -j16 -s install && make -s check;done

All of those pass. I'll create a testing chroot.

I did, and reproduced. Turned out I just missed the error in the above
test.

The bug was caused by one ifdef in get_LifetimeEnd() being wrong
(function is is overloaded starting in 5 rather than 4). The comment
above it even had it right...

Greetings,

Andres Freund

#157Peter Eisentraut
peter.eisentraut@2ndquadrant.com
In reply to: Andres Freund (#156)
Re: JIT compiling with LLVM v11

On 3/6/18 04:39, Andres Freund wrote:

I did, and reproduced. Turned out I just missed the error in the above
test.

The bug was caused by one ifdef in get_LifetimeEnd() being wrong
(function is is overloaded starting in 5 rather than 4). The comment
above it even had it right...

OK, it's fixed for me now.

--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#158Peter Eisentraut
peter.eisentraut@2ndquadrant.com
In reply to: Peter Eisentraut (#157)
Re: JIT compiling with LLVM v11

With the build issues in check, I'm looking at the configuration settings.

I think taking the total cost as the triggering threshold is probably
good enough for a start. The cost modeling can be refined over time.

We should document that both jit_optimize_above_cost and
jit_inline_above_cost require jit_above_cost to be set, or otherwise
nothing happens.

One problem I see is that if someone sets things like
enable_seqscan=off, the artificial cost increase created by those
settings would quite likely bump the query over the jit threshold, which
would alter the query performance characteristics in a way that the user
would not have intended. I don't have an idea how to address this right
now.

I ran some performance assessments:

merge base (0b1d1a038babff4aadf0862c28e7b667f1b12a30)

make installcheck 3.14s user 3.34s system 17% cpu 37.954 total

jit branch default settings

make installcheck 3.17s user 3.30s system 13% cpu 46.596 total

jit_above_cost=0

make installcheck 3.30s user 3.53s system 5% cpu 1:59.89 total

jit_optimize_above_cost=0 (and jit_above_cost=0)

make installcheck 3.44s user 3.76s system 1% cpu 8:12.42 total

jit_inline_above_cost=0 (and jit_above_cost=0)

make installcheck 3.32s user 3.62s system 2% cpu 5:35.58 total

One can see the CPU savings quite nicely.

One obvious problem is that with the default settings, the test suite
run gets about 15% slower. (These figures are reproducible over several
runs.) Is there some debugging stuff turned on that would explain this?
Or would just loading the jit module in each session cause this?

From the other results, we can see that one clearly needs quite a big
database to see a solid benefit from this. Do you have any information
gathered about this so far? Any scripts to create test databases and
test queries?

--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#159Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#158)
Re: JIT compiling with LLVM v11

Hi,

On 2018-03-06 10:29:47 -0500, Peter Eisentraut wrote:

I think taking the total cost as the triggering threshold is probably
good enough for a start. The cost modeling can be refined over time.

Cool.

We should document that both jit_optimize_above_cost and
jit_inline_above_cost require jit_above_cost to be set, or otherwise
nothing happens.

Yea, that's a good plan. We could also change it so it would, but I
don't think there's much point?

One problem I see is that if someone sets things like
enable_seqscan=off, the artificial cost increase created by those
settings would quite likely bump the query over the jit threshold, which
would alter the query performance characteristics in a way that the user
would not have intended. I don't have an idea how to address this right
now.

I'm not too worried about that scenario. If, for a cheap plan, the
planner ends up with a seqscan despite it being disabled, you're pretty
close to randomly choosing plans already, as the pruning doesn't work
well anymore (as the %1 percent fuzz factor in
compare_path_costs_fuzzily() swamps the actual plan costs).

I ran some performance assessments:

merge base (0b1d1a038babff4aadf0862c28e7b667f1b12a30)

make installcheck 3.14s user 3.34s system 17% cpu 37.954 total

jit branch default settings

make installcheck 3.17s user 3.30s system 13% cpu 46.596 total

jit_above_cost=0

make installcheck 3.30s user 3.53s system 5% cpu 1:59.89 total

jit_optimize_above_cost=0 (and jit_above_cost=0)

make installcheck 3.44s user 3.76s system 1% cpu 8:12.42 total

jit_inline_above_cost=0 (and jit_above_cost=0)

make installcheck 3.32s user 3.62s system 2% cpu 5:35.58 total

One can see the CPU savings quite nicely.

I'm not quite sure what you mean by that.

One obvious problem is that with the default settings, the test suite
run gets about 15% slower. (These figures are reproducible over several
runs.) Is there some debugging stuff turned on that would explain this?
Or would just loading the jit module in each session cause this?

I suspect it's loading the module. There's two pretty easy avenues to
improve this:

1) Attempt to load the JIT provider in postmaster, thereby avoiding a
lot of redundant dynamic linker work if already installed. That's
~5-10 lines or such. I basically refrained from that because it's
convenient to not have to restart the server during development (one
can just reconnect and get a newer jit plugin).

2) Don't load the JIT provider until fully needed. Right now
jit_compile_expr() will load the jit provider even if not really
needed. We should probably move the first two return blocks in
llvm_compile_expr() into jit_compile_expr(), to avoid that.

From the other results, we can see that one clearly needs quite a big
database to see a solid benefit from this.

Right, until we've got caching this'll only be beneficial for ~1s+
analytics queries. Unfortunately caching requires some larger planner &
executor surgery, so I don't want to go there at the same time (I'm
already insane enough).

Do you have any information gathered about this so far? Any scripts
to create test databases and test queries?

Yes. I've used tpc-h. Not because it's the greatest, but because it's
semi conveniently available and a lot of others have experience with it
already. Do you mean whether I've run a couple benchmarks? If so, yes.
I'll schedule some more later - am on battery power rn.

Greetings,

Andres Freund

#160Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#159)
Re: JIT compiling with LLVM v11

On 2018-03-06 12:16:01 -0800, Andres Freund wrote:

I ran some performance assessments:

merge base (0b1d1a038babff4aadf0862c28e7b667f1b12a30)

make installcheck 3.14s user 3.34s system 17% cpu 37.954 total

jit branch default settings

make installcheck 3.17s user 3.30s system 13% cpu 46.596 total

jit_above_cost=0

make installcheck 3.30s user 3.53s system 5% cpu 1:59.89 total

jit_optimize_above_cost=0 (and jit_above_cost=0)

make installcheck 3.44s user 3.76s system 1% cpu 8:12.42 total

jit_inline_above_cost=0 (and jit_above_cost=0)

make installcheck 3.32s user 3.62s system 2% cpu 5:35.58 total

One can see the CPU savings quite nicely.

I'm not quite sure what you mean by that.

One obvious problem is that with the default settings, the test suite
run gets about 15% slower. (These figures are reproducible over several
runs.) Is there some debugging stuff turned on that would explain this?
Or would just loading the jit module in each session cause this?

I suspect it's loading the module.

There's also another issue: For a lot queries in the tests the stats are
way way way off because the relevant tables have never been analyzed.
There's a few cases where costs are off by like 5-7 orders of
magnitude...

Greetings,

Andres Freund

#161Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#159)
Re: JIT compiling with LLVM v11

Andres Freund <andres@anarazel.de> writes:

I'm not too worried about that scenario. If, for a cheap plan, the
planner ends up with a seqscan despite it being disabled, you're pretty
close to randomly choosing plans already, as the pruning doesn't work
well anymore (as the %1 percent fuzz factor in
compare_path_costs_fuzzily() swamps the actual plan costs).

Something I've wanted to do for awhile is to get rid of disable_cost
in favor of pruning disabled plans through logic rather than costing.
I've looked at this once or twice, and it seems doable but not entirely
trivial --- the sticky bits are places where you do need to allow a
disabled plan type because there's no other alternative. But if we
could get that done, it'd help with this sort of problem.

regards, tom lane

#162Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Andres Freund (#156)
Re: JIT compiling with LLVM v11

On Tue, Mar 6, 2018 at 10:39 PM, Andres Freund <andres@anarazel.de> wrote:

[more commits]

+ * OSX prefixes all object level symbols with an underscore. But neither

"macOS" (see commit da6c4f6c and all mentions since).

make check at today's HEAD of your jit branch crashes on my FreeBSD
box. The first thing to crash is this query from point.sql:

LOG: server process (PID 87060) was terminated by signal 4: Illegal instruction
DETAIL: Failed process was running: SELECT '' AS thirtysix, p1.f1 AS
point1, p2.f1 AS point2, p1.f1 <-> p2.f1 AS dist
FROM POINT_TBL p1, POINT_TBL p2
ORDER BY dist, p1.f1[0], p2.f1[0];

Unfortunately when I tried to load the core file into lldb, the stack
is like this:

* thread #1, name = 'postgres', stop reason = signal SIGILL
* frame #0: 0x0000000800e7c1ea

Apparently the generated code is nuking the stack and executing
garbage? I don't have time to investigate right now, and this may
indicate something busted in my environment, but I thought this might
tell you something.

These variants of that query don't crash (even though I set
jit_above_cost = 0 and checked that it's actually JIT-ing), which
might be clues:

-- no p1.f1 <-> p2.f1
SELECT p1.f1 AS point1, p2.f1 AS point2
FROM POINT_TBL p1, POINT_TBL p2
ORDER BY p1.f1[0], p2.f1[0];

-- no join
SELECT p1.f1 <-> p1.f1 AS dist
FROM POINT_TBL p1
ORDER BY 1;

These variants do crash:

-- p1.f1 <-> p2.f1 in order by, but not select list
SELECT p1.f1 AS point1, p2.f1 AS point2
FROM POINT_TBL p1, POINT_TBL p2
ORDER BY p1.f1 <-> p2.f1, p1.f1[0], p2.f1[0];

-- p1.f1 <-> p2.f1 in select list, but not in order by
SELECT p1.f1 AS point1, p2.f1 AS point2, p1.f1 <-> p2.f1 AS dist
FROM POINT_TBL p1, POINT_TBL p2
ORDER BY p1.f1[0], p2.f1[0];

-- simple, with a join
SELECT p1.f1 <-> p1.f1 AS dist
FROM POINT_TBL p1, POINT_TBL p2
ORDER BY 1;

I build it like this:

./configure \
--prefix=$HOME/install/ \
--enable-tap-tests \
--enable-cassert \
--enable-debug \
--enable-depend \
--with-llvm \
CC="ccache cc" CFLAGS="-O0" CXX="ccache c++" CXXFLAGS="-std=c++11" \
CLANG=/usr/local/llvm50/bin/clang \
LLVM_CONFIG=/usr/local/llvm50/bin/llvm-config \
--with-libraries="/usr/local/lib" \
--with-includes="/usr/local/include"

--
Thomas Munro
http://www.enterprisedb.com

#163Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Thomas Munro (#162)
Re: JIT compiling with LLVM v11

On Wed, Mar 7, 2018 at 3:49 PM, Thomas Munro
<thomas.munro@enterprisedb.com> wrote:

make check at today's HEAD of your jit branch crashes on my FreeBSD
box. The first thing to crash is this query from point.sql:

LOG: server process (PID 87060) was terminated by signal 4: Illegal instruction
DETAIL: Failed process was running: SELECT '' AS thirtysix, p1.f1 AS
point1, p2.f1 AS point2, p1.f1 <-> p2.f1 AS dist
FROM POINT_TBL p1, POINT_TBL p2
ORDER BY dist, p1.f1[0], p2.f1[0];

Hmm. It's trying to execute an AVX instruction.

* thread #1, stop reason = breakpoint 1.1
frame #0: llvmjit.so`ExecRunCompiledExpr(state=0x0000000801de4880,
econtext=0x0000000801de3560, isNull="") at llvmjit_expr.c:432
429
430 state->evalfunc = func;
431
-> 432 return func(state, econtext, isNull);
433 }
434
435 static void emit_lifetime_end(ExprState *state, LLVMModuleRef
mod, LLVMBuilderRef b);
(lldb) s
Process 44513 stopped
* thread #1, stop reason = signal SIGILL: privileged instruction
frame #0: 0x0000000801157193
-> 0x801157193: vmovsd (%rax), %xmm0 ; xmm0 = mem[0],zero
0x801157197: vmovsd 0x8(%rax), %xmm1 ; xmm1 = mem[0],zero
0x80115719c: vsubsd (%rcx), %xmm0, %xmm2
0x8011571a0: vsubsd 0x8(%rcx), %xmm1, %xmm0
(lldb) bt
* thread #1, stop reason = signal SIGILL: privileged instruction
* frame #0: 0x0000000801157193

This is running on a "Intel(R) Celeron(R) CPU G1610T @ 2.30GHz" with no AVX.

I am not sure if that is real though, because the stack is immediately
corrupted. So either func is not really a function, or it is but was
compiled for the wrong target. I see that you call
LLVMCreateTargetMachine() with the result of LLVMGetHostCPUName() as
cpu. For me that's "ivybridge", so I tried hard coding "generic"
instead and it didn't help. I see that you say "" for features, where
is where one would normally put "avx" to turn on AVX instructions, so
I think perhaps that theory is entirely bogus.

--
Thomas Munro
http://www.enterprisedb.com

#164Andres Freund
andres@anarazel.de
In reply to: Thomas Munro (#163)
Re: JIT compiling with LLVM v11

Hi,

On 2018-03-09 00:33:03 +1300, Thomas Munro wrote:

On Wed, Mar 7, 2018 at 3:49 PM, Thomas Munro
<thomas.munro@enterprisedb.com> wrote:

make check at today's HEAD of your jit branch crashes on my FreeBSD
box. The first thing to crash is this query from point.sql:

LOG: server process (PID 87060) was terminated by signal 4: Illegal instruction
DETAIL: Failed process was running: SELECT '' AS thirtysix, p1.f1 AS
point1, p2.f1 AS point2, p1.f1 <-> p2.f1 AS dist
FROM POINT_TBL p1, POINT_TBL p2
ORDER BY dist, p1.f1[0], p2.f1[0];

Hmm. It's trying to execute an AVX instruction.

Ah, that's interesting.

I am not sure if that is real though, because the stack is immediately
corrupted.

I don't think the stack is corrupted at all, it's just that lldb can't
unwind with functions it doesn't know. To add that capability I've a
pending LLVM patch.

So either func is not really a function, or it is but was
compiled for the wrong target. I see that you call
LLVMCreateTargetMachine() with the result of LLVMGetHostCPUName() as
cpu. For me that's "ivybridge", so I tried hard coding "generic"
instead and it didn't help.

Hm.

I see that you say "" for features, where
is where one would normally put "avx" to turn on AVX instructions, so
I think perhaps that theory is entirely bogus.

Could you try a -avx in features and see whether it fixes things?

This kinda suggests an LLVM bug or at least an oddity, but I'll try to
drill down more into this. Is this a native machine or a VM?

I think we can easily fix this by behaving like clang, which uses
llvm::sys::getHostCPUFeatures(HostFeatures) to built the feature list:

// If -march=native, autodetect the feature list.
if (const Arg *A = Args.getLastArg(clang::driver::options::OPT_march_EQ)) {
if (StringRef(A->getValue()) == "native") {
llvm::StringMap<bool> HostFeatures;
if (llvm::sys::getHostCPUFeatures(HostFeatures))
for (auto &F : HostFeatures)
Features.push_back(
Args.MakeArgString((F.second ? "+" : "-") + F.first()));
}
}

which seems easy enough.

Greetings,

Andres Freund

#165Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#164)
Re: JIT compiling with LLVM v11

On 2018-03-08 11:58:41 -0800, Andres Freund wrote:

I think we can easily fix this by behaving like clang, which uses
llvm::sys::getHostCPUFeatures(HostFeatures) to built the feature list:

// If -march=native, autodetect the feature list.
if (const Arg *A = Args.getLastArg(clang::driver::options::OPT_march_EQ)) {
if (StringRef(A->getValue()) == "native") {
llvm::StringMap<bool> HostFeatures;
if (llvm::sys::getHostCPUFeatures(HostFeatures))
for (auto &F : HostFeatures)
Features.push_back(
Args.MakeArgString((F.second ? "+" : "-") + F.first()));
}
}

which seems easy enough.

Or even in core LLVM, which has this nice comment:

// If user asked for the 'native' CPU, we need to autodetect features.
// This is necessary for x86 where the CPU might not support all the
// features the autodetected CPU name lists in the target. For example,
// not all Sandybridge processors support AVX.
if (MCPU == "native") {

which pretty much describes the issue you're apparently hitting.

I've pushed an attempted fix (needs a comment, but works here).

Greetings,

Andres Freund

#166Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Andres Freund (#165)
Re: JIT compiling with LLVM v11

On Fri, Mar 9, 2018 at 9:12 AM, Andres Freund <andres@anarazel.de> wrote:

Or even in core LLVM, which has this nice comment:

// If user asked for the 'native' CPU, we need to autodetect features.
// This is necessary for x86 where the CPU might not support all the
// features the autodetected CPU name lists in the target. For example,
// not all Sandybridge processors support AVX.
if (MCPU == "native") {

which pretty much describes the issue you're apparently hitting.

I've pushed an attempted fix (needs a comment, but works here).

=======================
All 186 tests passed.
=======================

That did the trick. Thanks!

--
Thomas Munro
http://www.enterprisedb.com

#167Peter Eisentraut
peter.eisentraut@2ndquadrant.com
In reply to: Andres Freund (#159)
Re: JIT compiling with LLVM v11

On 3/6/18 15:16, Andres Freund wrote:

2) Don't load the JIT provider until fully needed. Right now
jit_compile_expr() will load the jit provider even if not really
needed. We should probably move the first two return blocks in
llvm_compile_expr() into jit_compile_expr(), to avoid that.

I see that you have implemented that, but it doesn't seem to have helped
with my make installcheck times.

--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#168Peter Eisentraut
peter.eisentraut@2ndquadrant.com
In reply to: Peter Eisentraut (#158)
Re: JIT compiling with LLVM v11

On 3/6/18 10:29, Peter Eisentraut wrote:

I think taking the total cost as the triggering threshold is probably
good enough for a start. The cost modeling can be refined over time.

I looked into this a bit more.

The default of jit_above_cost = 500000 seems pretty good. I constructed
a query that cost about 450000 where the run time with and without JIT
were about even. This is obviously very limited testing, but it's a
good start.

For jit_optimize_above_cost, in my testing, any query where JIT payed
off was even faster with optimizing. So right now I don't see a need to
make this a separate setting. Maybe just make it an on/off setting for
experimenting.

For inlining, I haven't been able to get a clear picture. It's a bit
faster perhaps, but the optimizing dominates it. I don't have a clear
mental model for what kind of returns to expect from this.

What I'd quite like is if EXPLAIN or EXPLAIN ANALYZE showed something
about what kind of JIT processing was done, if any, to help with this
kind of testing.

--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#169Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#167)
Re: JIT compiling with LLVM v11

On 2018-03-09 15:28:19 -0500, Peter Eisentraut wrote:

On 3/6/18 15:16, Andres Freund wrote:

2) Don't load the JIT provider until fully needed. Right now
jit_compile_expr() will load the jit provider even if not really
needed. We should probably move the first two return blocks in
llvm_compile_expr() into jit_compile_expr(), to avoid that.

I see that you have implemented that, but it doesn't seem to have helped
with my make installcheck times.

What's the exact comparison you're looking at?

I think that's largely that unnecessary trivial queries get JITed and
optimized, because the stats are entirely completely off.

Greetings,

Andres Freund

#170Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#168)
Re: JIT compiling with LLVM v11

On 2018-03-09 15:42:24 -0500, Peter Eisentraut wrote:

For jit_optimize_above_cost, in my testing, any query where JIT payed
off was even faster with optimizing. So right now I don't see a need to
make this a separate setting. Maybe just make it an on/off setting for
experimenting.

I'd prefer to be more defensive here. The time needed for JITing without
optimization is roughly linear, whereas optimization is definitely not
linear with input size.

For inlining, I haven't been able to get a clear picture. It's a bit
faster perhaps, but the optimizing dominates it. I don't have a clear
mental model for what kind of returns to expect from this.

Yea, you need longrunning queries to benefit significantly. There's a
*lot* more potential once some structural issues with the expression
format (both with and without JIT) are fixed.

What I'd quite like is if EXPLAIN or EXPLAIN ANALYZE showed something
about what kind of JIT processing was done, if any, to help with this
kind of testing.

Yea, I like that. I think we can only show that when timing is on,
because otherwise the tests will not be stable depending on --with-jit
being specified or not.

So I'm thinking of displaying it similar to the "Planning time" piece,
i.e. depending on es->summary being enabled. It'd be good to display the
inline/optimize/emit times too. I think we can just store it in the
JitContext. But the inline/optimize/emission times will only be
meaningful when the query is actually executed, I don't see a way around
that...

Greetings,

Andres Freund

#171Peter Eisentraut
peter.eisentraut@2ndquadrant.com
In reply to: Andres Freund (#169)
Re: JIT compiling with LLVM v11

On 3/9/18 15:56, Andres Freund wrote:

On 2018-03-09 15:28:19 -0500, Peter Eisentraut wrote:

On 3/6/18 15:16, Andres Freund wrote:

2) Don't load the JIT provider until fully needed. Right now
jit_compile_expr() will load the jit provider even if not really
needed. We should probably move the first two return blocks in
llvm_compile_expr() into jit_compile_expr(), to avoid that.

I see that you have implemented that, but it doesn't seem to have helped
with my make installcheck times.

What's the exact comparison you're looking at?

I'm just running `time make installcheck` with default settings, as
described in my message from March 6.

I think that's largely that unnecessary trivial queries get JITed and
optimized, because the stats are entirely completely off.

Right. I instrumented this a bit, and there are indeed two handfuls of
queries that exceed the default JIT thresholds, as well as a few that
trigger JIT because they disable some enable_* planner setting, as
previously discussed.

Should we throw in some ANALYZEs to avoid this?

If I set jit_expressions = off, then the timings match again.

It's perhaps a bit confusing that some of the jit_* settings take effect
at plan time and some at execution time. At the moment, this mainly
affects me reading the code ;-), but it would also have some effect on
prepared statements and such.

Also, jit_tuple_deforming is apparently used only when jit_expressions
is on.

So, we should work toward more clarity on all these different settings,
what they are useful for, when to set them, how they interact.

--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#172Peter Eisentraut
peter.eisentraut@2ndquadrant.com
In reply to: Peter Eisentraut (#168)
Re: JIT compiling with LLVM v11

On 3/9/18 15:42, Peter Eisentraut wrote:

The default of jit_above_cost = 500000 seems pretty good. I constructed
a query that cost about 450000 where the run time with and without JIT
were about even. This is obviously very limited testing, but it's a
good start.

Actually, the default in your latest code is 100000, which per my
analysis would be too low. Did you arrive at that setting based on testing?

--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#173Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#171)
Re: JIT compiling with LLVM v11

On 2018-03-11 13:19:57 -0400, Peter Eisentraut wrote:

On 3/9/18 15:56, Andres Freund wrote:

I think that's largely that unnecessary trivial queries get JITed and
optimized, because the stats are entirely completely off.

Right. I instrumented this a bit, and there are indeed two handfuls of
queries that exceed the default JIT thresholds, as well as a few that
trigger JIT because they disable some enable_* planner setting, as
previously discussed.

Should we throw in some ANALYZEs to avoid this?

Hm, I'd actually lean to just leave it as is for now. JITing halfway
random queries isn't actually that bad... If we get fed up with the
additional time after a while, we can do something then?

It's perhaps a bit confusing that some of the jit_* settings take effect
at plan time and some at execution time. At the moment, this mainly
affects me reading the code ;-), but it would also have some effect on
prepared statements and such.

Not quite sure what you mean?

Also, jit_tuple_deforming is apparently used only when jit_expressions
is on.

Right. I've not found a good place to hook into that has enough context
to do JITed deforming otherwise. I'm inclined to just relegate
jit_tuple_deforming to debugging status (i.e. exclude from show all,
docs etc) for now.

So, we should work toward more clarity on all these different settings,
what they are useful for, when to set them, how they interact.

Yep.

Greetings,

Andres Freund

#174Peter Eisentraut
peter.eisentraut@2ndquadrant.com
In reply to: Andres Freund (#173)
Re: JIT compiling with LLVM v11

On 3/11/18 14:25, Andres Freund wrote:

It's perhaps a bit confusing that some of the jit_* settings take effect
at plan time and some at execution time. At the moment, this mainly
affects me reading the code ;-), but it would also have some effect on
prepared statements and such.

Not quite sure what you mean?

I haven't tested this, but what appears to be the case is that

SET jit_above_cost = 0;
PREPARE foo AS SELECT ....;
SET jit_above_cost = infinity;
EXECUTE foo;

will use JIT, because jit_above_cost applies at plan time, whereas

SET jit_expressions = on;
PREPARE foo AS SELECT ....;
SET jit_expressions = off;
EXECUTE foo;

will *not* use JIT, becaue jit_expressions applies at execution time.

--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#175Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#174)
Re: JIT compiling with LLVM v11

On 2018-03-12 11:21:36 -0400, Peter Eisentraut wrote:

On 3/11/18 14:25, Andres Freund wrote:

It's perhaps a bit confusing that some of the jit_* settings take effect
at plan time and some at execution time. At the moment, this mainly
affects me reading the code ;-), but it would also have some effect on
prepared statements and such.

Not quite sure what you mean?

I haven't tested this, but what appears to be the case is that

SET jit_above_cost = 0;
PREPARE foo AS SELECT ....;
SET jit_above_cost = infinity;
EXECUTE foo;

will use JIT, because jit_above_cost applies at plan time, whereas

SET jit_expressions = on;
PREPARE foo AS SELECT ....;
SET jit_expressions = off;
EXECUTE foo;

will *not* use JIT, becaue jit_expressions applies at execution time.

Right. It'd be easy to change that so jit_expressions=off wouldn't have
an effect there anymore. But I'm not sure we want that? I don't have a
strong feeling about this, except that I think jit_above_cost etc should
apply at plan, not execution time.

Greetings,

Andres Freund

#176Peter Eisentraut
peter.eisentraut@2ndquadrant.com
In reply to: Andres Freund (#175)
Re: JIT compiling with LLVM v11

On 3/12/18 13:05, Andres Freund wrote:

will *not* use JIT, becaue jit_expressions applies at execution time.

Right. It'd be easy to change that so jit_expressions=off wouldn't have
an effect there anymore. But I'm not sure we want that? I don't have a
strong feeling about this, except that I think jit_above_cost etc should
apply at plan, not execution time.

I lean toward making everything apply at plan time. Not only is that
easier in the current code structure, but over time we'll probably want
to add more detailed planner knobs, e.g., perhaps an alternative
cpu_tuple_cost, and all of that would be a planner setting.

--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#177Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#170)
Re: JIT compiling with LLVM v11

On 2018-03-09 13:08:36 -0800, Andres Freund wrote:

On 2018-03-09 15:42:24 -0500, Peter Eisentraut wrote:

What I'd quite like is if EXPLAIN or EXPLAIN ANALYZE showed something
about what kind of JIT processing was done, if any, to help with this
kind of testing.

Yea, I like that. I think we can only show that when timing is on,
because otherwise the tests will not be stable depending on --with-jit
being specified or not.

So I'm thinking of displaying it similar to the "Planning time" piece,
i.e. depending on es->summary being enabled. It'd be good to display the
inline/optimize/emit times too. I think we can just store it in the
JitContext. But the inline/optimize/emission times will only be
meaningful when the query is actually executed, I don't see a way around
that...

Not yet really happy with how it exactly looks, but here's my current
state:

tpch_10[20923][1]=# ;explain (format text, analyze, timing off) SELECT relkind, relname FROM pg_class pgc WHERE relkind = 'r';
┌────────────────────────────────────────────────────────────────────────────────────────┐
│ QUERY PLAN │
├────────────────────────────────────────────────────────────────────────────────────────┤
│ Seq Scan on pg_class pgc (cost=0.00..15.70 rows=77 width=65) (actual rows=77 loops=1) │
│ Filter: (relkind = 'r'::"char") │
│ Rows Removed by Filter: 299 │
│ Planning time: 0.187 ms │
│ JIT: │
│ Functions: 4 │
│ Inlining: false │
│ Optimization: false │
│ Execution time: 72.229 ms │
└────────────────────────────────────────────────────────────────────────────────────────┘
(9 rows)

tpch_10[20923][1]=# ;explain (format text, analyze, timing on) SELECT relkind, relname FROM pg_class pgc WHERE relkind = 'r';

┌────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ QUERY PLAN │
├────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Seq Scan on pg_class pgc (cost=0.00..15.70 rows=77 width=65) (actual time=40.570..40.651 rows=77 loops=1) │
│ Filter: (relkind = 'r'::"char") │
│ Rows Removed by Filter: 299 │
│ Planning time: 0.138 ms │
│ JIT: │
│ Functions: 4 │
│ Inlining: false │
│ Inlining Time: 0.000 │
│ Optimization: false │
│ Optimization Time: 5.023 │
│ Emission Time: 34.987 │
│ Execution time: 46.277 ms │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
(12 rows)

json (excerpt):
│ "Triggers": [ ↵│
│ ], ↵│
│ "JIT": { ↵│
│ "Functions": 4, ↵│
│ "Inlining": false, ↵│
│ "Inlining Time": 0.000, ↵│
│ "Optimization": false, ↵│
│ "Optimization Time": 9.701, ↵│
│ "Emission Time": 52.951 ↵│
│ }, ↵│
│ "Execution Time": 70.292 ↵│

I'm not at all wedded to the current format, but I feel like that's the
basic functionality needed?

Right now the JIT bit will only be displayed if at least one JITed
function has been emitted. Otherwise we'll just create noise for
everyone.

Currently a handful of explain outputs in the regression tests change
output when compiled with JITing. Therefore I'm thinking of adding
JITINFO or such option, which can be set to false for those tests?
Maintaining duplicate output for them seems painful. Better ideas?

Greetings,

Andres Freund

#178Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#177)
Re: JIT compiling with LLVM v11

Andres Freund <andres@anarazel.de> writes:

Currently a handful of explain outputs in the regression tests change
output when compiled with JITing. Therefore I'm thinking of adding
JITINFO or such option, which can be set to false for those tests?
Maintaining duplicate output for them seems painful. Better ideas?

Why not just suppress that info when COSTS OFF is specified?

regards, tom lane

#179Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#178)
Re: JIT compiling with LLVM v11

Hi,

On 2018-03-12 17:14:00 -0400, Tom Lane wrote:

Andres Freund <andres@anarazel.de> writes:

Currently a handful of explain outputs in the regression tests change
output when compiled with JITing. Therefore I'm thinking of adding
JITINFO or such option, which can be set to false for those tests?
Maintaining duplicate output for them seems painful. Better ideas?

Why not just suppress that info when COSTS OFF is specified?

I wondered about that too. But that'd mean it'd be harder to write a
test that tests the planning bits of JITing (i.e. decision whether to
use optimization & inlining or not) . Not sure if it's worth adding
complexity to be able to do so.

Greetings,

Andres Freund

#180Peter Eisentraut
peter.eisentraut@2ndquadrant.com
In reply to: Andres Freund (#177)
Re: JIT compiling with LLVM v11

On 3/12/18 17:04, Andres Freund wrote:

│ JIT: │
│ Functions: 4 │
│ Inlining: false │
│ Inlining Time: 0.000 │
│ Optimization: false │
│ Optimization Time: 5.023 │
│ Emission Time: 34.987 │

The time quantities need some units.

│ Execution time: 46.277 ms │

like this :)

--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#181Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#180)
Re: JIT compiling with LLVM v11

On 2018-03-13 10:25:49 -0400, Peter Eisentraut wrote:

On 3/12/18 17:04, Andres Freund wrote:

│ JIT: │
│ Functions: 4 │
│ Inlining: false │
│ Inlining Time: 0.000 │
│ Optimization: false │
│ Optimization Time: 5.023 │
│ Emission Time: 34.987 │

The time quantities need some units.

│ Execution time: 46.277 ms │

like this :)

Yea, I know. I was planning to start a thread about that. explain.c is
littered with code like
if (es->format == EXPLAIN_FORMAT_TEXT)
appendStringInfo(es->str, "Planning time: %.3f ms\n",
1000.0 * plantime);
else
ExplainPropertyFloat("Planning Time", 1000.0 * plantime, 3, es);
which, to me, is bonkers. I think we should add add 'const char *unit'
parameter to at least ExplainProperty{Float,Integer,Long}? Or a *Unit
version of them doing so, allowing a bit more gradual change?

Greetings,

Andres Freund

#182Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#177)
Re: JIT compiling with LLVM v11

On Mon, Mar 12, 2018 at 5:04 PM, Andres Freund <andres@anarazel.de> wrote:

Currently a handful of explain outputs in the regression tests change
output when compiled with JITing. Therefore I'm thinking of adding
JITINFO or such option, which can be set to false for those tests?

Can we spell that JIT or at least JIT_INFO?

I realize that EXPLAIN (JIT OFF) may sound like it's intended to
disable JIT itself, but I think it's pretty clear that EXPLAIN
(BUFFERS OFF) does not disable the use of actual buffers, only the
display of buffer-related information.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#183Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#182)
Re: JIT compiling with LLVM v11

Hi,

On 2018-03-13 14:36:44 -0400, Robert Haas wrote:

On Mon, Mar 12, 2018 at 5:04 PM, Andres Freund <andres@anarazel.de> wrote:

Currently a handful of explain outputs in the regression tests change
output when compiled with JITing. Therefore I'm thinking of adding
JITINFO or such option, which can be set to false for those tests?

Can we spell that JIT or at least JIT_INFO?

The latter works, I don't have a strong opinion on that. For now I've
just tied it to COSTS off.

I realize that EXPLAIN (JIT OFF) may sound like it's intended to
disable JIT itself

Yea, that's what I'm concerned about.

, but I think it's pretty clear that EXPLAIN (BUFFERS OFF) does not
disable the use of actual buffers, only the display of buffer-related
information.

Hm.

Greetings,

Andres Freund

#184Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#183)
Re: JIT compiling with LLVM v11

Andres Freund <andres@anarazel.de> writes:

On 2018-03-13 14:36:44 -0400, Robert Haas wrote:

I realize that EXPLAIN (JIT OFF) may sound like it's intended to
disable JIT itself

Yea, that's what I'm concerned about.

, but I think it's pretty clear that EXPLAIN (BUFFERS OFF) does not
disable the use of actual buffers, only the display of buffer-related
information.

Hm.

FWIW, I agree with Robert's preference for just JIT here. The "info"
bit isn't conveying anything. And we've never had any EXPLAIN options
that actually change the behavior of the explained command, only ones
that change the amount of info displayed. I don't see why we'd
consider JIT an exception to that.

regards, tom lane

#185Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Andres Freund (#143)
Re: JIT compiling with LLVM v11

On Thu, Mar 1, 2018 at 9:02 PM, Andres Freund <andres@anarazel.de> wrote:

Biggest changes:
- LLVM 3.9 - master are now supported. This includes a good chunk of
work by Pierre Ducroquet.

I decided to try this on a CentOS 7.2 box. It has LLVM 3.9 in the
'epel' package repo, but unfortunately it only has clang 3.4. I
suppose it's important to make this work for RHEL7 using only
dependencies that can be met by the vendor package repos? Maybe
someone who knows more about CentOS/RHE could tell me if I'm mistaken
and there is a way to get a more modern clang from a reputable repo
that our packages could depend on, though I release that clang is only a
build dependency, not a runtime one. I'm unsure how that constrains
things.

clang: "clang version 3.4.2 (tags/RELEASE_34/dot2-final)"
gcc and g++: "gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)"
llvm: "3.9.1"

First problem:

clang: error: unknown argument: '-fexcess-precision=standard'
clang: error: unknown argument: '-flto=thin'

Ok, so I hacked src/Makefile.global.in to remove -flto=thin. It looks
like -fexcess-precision-standard is coming from a configure test that
was run against ${CC}, not against ${CLANG}, so I hacked the generated
src/Makefile.global to remove that too, just to see if I could get
past that.

I don't know if there was another way to control floating point
precision in ancient clang before they adopted the GCC-compatible
flag, but it would seem slightly fishy to have .o files and .bc files
compiled with different floating point settings because then you could
get different answers depending on whether your expression is JITted.

Then I could build successfully and make check passed. I did see one warning:

In file included from execExpr.c:39:
../../../src/include/jit/jit.h:36:3: warning: redefinition of typedef
'JitProviderCallbacks' is a C11 feature [-Wtypedef-redefinition]
} JitProviderCallbacks;
^
../../../src/include/jit/jit.h:22:37: note: previous definition is here
typedef struct JitProviderCallbacks JitProviderCallbacks;
^

That's a legit complaint.

--
Thomas Munro
http://www.enterprisedb.com

#186Andres Freund
andres@anarazel.de
In reply to: Thomas Munro (#185)
Re: JIT compiling with LLVM v11

Hi,

On 2018-03-14 10:32:40 +1300, Thomas Munro wrote:

I decided to try this on a CentOS 7.2 box. It has LLVM 3.9 in the
'epel' package repo, but unfortunately it only has clang 3.4.

That's a bit odd, given llvm and clang really live in the same repo...

clang: error: unknown argument: '-fexcess-precision=standard'
clang: error: unknown argument: '-flto=thin'

Ok, so I hacked src/Makefile.global.in to remove -flto=thin.

I think I can get actually rid of that entirely.

It looks
like -fexcess-precision-standard is coming from a configure test that
was run against ${CC}, not against ${CLANG}, so I hacked the generated
src/Makefile.global to remove that too, just to see if I could get
past that.

Yea, I'd hoped we could avoid duplicating all the configure tests, but
maybe not :(.

Then I could build successfully and make check passed. I did see one warning:

In file included from execExpr.c:39:
../../../src/include/jit/jit.h:36:3: warning: redefinition of typedef
'JitProviderCallbacks' is a C11 feature [-Wtypedef-redefinition]
} JitProviderCallbacks;
^
../../../src/include/jit/jit.h:22:37: note: previous definition is here
typedef struct JitProviderCallbacks JitProviderCallbacks;
^

Yep. Removed the second superflous / redundant typedef. Will push a
heavily rebased version in a bit, will include fix for this.

Greetings,

Andres Freund

#187Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#1)
JIT compiling with LLVM v12

Hi,

I've pushed a revised and rebased version of my JIT patchset.
The git tree is at
https://git.postgresql.org/git/users/andresfreund/postgres.git
in the jit branch
https://git.postgresql.org/gitweb/?p=users/andresfreund/postgres.git;a=shortlog;h=refs/heads/jit

There's nothing hugely exciting, mostly lots of cleanups.

- added some basic EXPLAIN output, displaying JIT options and time spent
jitting (see todo below)

JIT:
Functions: 9
Generation Time: 4.604
Inlining: false
Inlining Time: 0.000
Optimization: false
Optimization Time: 0.585
Emission Time: 12.858

- Fixed bugs around alignment computations in tuple deforming. Wasn't
able to trigger any bad consequences, but it was clearly wrong.
- Worked a lot on making code more pgindent safe. There's still some
minor layout damage, but it's mostly ok now. For that I had to add a
bunch of helpers that make the code shorter
- Freshly emitted functions now have proper attributes indicating
architecture, floating point behaviour etc. That's what previously
prevented the inliner of doing its job without forcing its hand. That
yields a bit of a speedup.
- reduced size of code a bit by deduplicating code, in particular
don't "manually" create signatures for function declarations
anymore. Besides deduplicating, this also ensures code generation time
errors when function signatures change.
- fixed a number of FIXMEs etc
- added a lot of comments
- portability fixes (OSX, freebsd)

Todo:
- some build issues with old clang versions pointed out by Thomas Munro
- when to take jit_expressions into account (both exec and plan or just
latter)
- EXPLAIN for queries that are JITed should display units. Starting
thread about effort to not duplicate code for that
- more explanations of type & function signature syncing
- GUC docs (including postgresql.conf.sample)

Thanks everyone, particularly Peter in this update, for helping me
along!

Regards,

Andres

#188Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#186)
Re: JIT compiling with LLVM v11

Hi,

On 2018-03-13 15:29:33 -0700, Andres Freund wrote:

On 2018-03-14 10:32:40 +1300, Thomas Munro wrote:

I decided to try this on a CentOS 7.2 box. It has LLVM 3.9 in the
'epel' package repo, but unfortunately it only has clang 3.4.

That's a bit odd, given llvm and clang really live in the same repo...

I don't really live in the RHEL world, but I wonder if
https://developers.redhat.com/blog/2017/10/04/red-hat-adds-go-clangllvm-rust-compiler-toolsets-updates-gcc/
is relevant?
Appears to be available on centos too
https://www.softwarecollections.org/en/scls/rhscl/devtoolset-7/

I checked it out and supporting 3.4 would be a bit painful due to not
being able to directly emit module summaries. We could support that by
building the summaries separately using LLVM, but that'd be either
slower for everyone, or we'd need somewhat finnicky conditionals.

clang: error: unknown argument: '-fexcess-precision=standard'
clang: error: unknown argument: '-flto=thin'

Ok, so I hacked src/Makefile.global.in to remove -flto=thin.

I think I can get actually rid of that entirely.

Err, no, not really. Would increase overhead due to separate module
summary generation, so I'd rather not do it.

It looks
like -fexcess-precision-standard is coming from a configure test that
was run against ${CC}, not against ${CLANG}, so I hacked the generated
src/Makefile.global to remove that too, just to see if I could get
past that.

Yea, I'd hoped we could avoid duplicating all the configure tests, but
maybe not :(.

I've mostly done that now (not pushed). I've created new
PGAC_PROG_VARCC_VARFLAGS_OPT(compiler variable, flag variable, testflag)
function, which now is used to implement PGAC_PROG_CC_CFLAGS_OPT and
PGAC_PROG_CC_VAR_OPT (similar for CXX). That makes it reasonable to
test the variables clang recognizes separately.

Greetings,

Andres Freund

#189Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#188)
Re: JIT compiling with LLVM v11

Andres Freund <andres@anarazel.de> writes:

On 2018-03-13 15:29:33 -0700, Andres Freund wrote:

On 2018-03-14 10:32:40 +1300, Thomas Munro wrote:

It looks
like -fexcess-precision-standard is coming from a configure test that
was run against ${CC}, not against ${CLANG}, so I hacked the generated
src/Makefile.global to remove that too, just to see if I could get
past that.

Yea, I'd hoped we could avoid duplicating all the configure tests, but
maybe not :(.

I've mostly done that now (not pushed). I've created new
PGAC_PROG_VARCC_VARFLAGS_OPT(compiler variable, flag variable, testflag)
function, which now is used to implement PGAC_PROG_CC_CFLAGS_OPT and
PGAC_PROG_CC_VAR_OPT (similar for CXX). That makes it reasonable to
test the variables clang recognizes separately.

Meh. I agree with Thomas' concern that it's not clear we can or should
just ignore discrepancies between the -f options supported by the C
and CLANG compilers.

Is it really so necessary to bring a second compiler into the mix for
this? Why not just insist that JIT is only supported if the main build
is done with clang, too? My experience with mixing results from different
compilers is, eh, not positive.

regards, tom lane

#190Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#189)
Re: JIT compiling with LLVM v11

Hi,

On 2018-03-14 22:36:52 -0400, Tom Lane wrote:

Andres Freund <andres@anarazel.de> writes:

On 2018-03-13 15:29:33 -0700, Andres Freund wrote:

On 2018-03-14 10:32:40 +1300, Thomas Munro wrote:

It looks
like -fexcess-precision-standard is coming from a configure test that
was run against ${CC}, not against ${CLANG}, so I hacked the generated
src/Makefile.global to remove that too, just to see if I could get
past that.

Yea, I'd hoped we could avoid duplicating all the configure tests, but
maybe not :(.

I've mostly done that now (not pushed). I've created new
PGAC_PROG_VARCC_VARFLAGS_OPT(compiler variable, flag variable, testflag)
function, which now is used to implement PGAC_PROG_CC_CFLAGS_OPT and
PGAC_PROG_CC_VAR_OPT (similar for CXX). That makes it reasonable to
test the variables clang recognizes separately.

Meh.

Why? The necessary configure code isn't that large:

# Test for behaviour changing compiler flags, to keep compatibility
# with compiler used for normal postgres code. XXX expand
if test "$with_llvm" = yes ; then
PGAC_PROG_VARCC_VARFLAGS_OPT(CLANG, BITCODE_CFLAGS, [-fno-strict-aliasing])
PGAC_PROG_VARCC_VARFLAGS_OPT(CLANG, BITCODE_CFLAGS, [-fwrapv])
PGAC_PROG_VARCC_VARFLAGS_OPT(CLANG, BITCODE_CFLAGS, [-fexcess-precision=standard])

AC_SUBST(BITCODE_CFLAGS, $BITCODE_CFLAGS)
fi

If the relevant clang version doesn't understand, say
-fno-strict-aliasing, then we'd in trouble already if it's
required. After all we do support compiling postgres with clang.

I agree with Thomas' concern that it's not clear we can or should
just ignore discrepancies between the -f options supported by the C
and CLANG compilers.

What's the precise concern here? We pass these flags to work around
compiler issues / "defining our standard". As I said above, if we do not
know the right flags to make clang behave sensibly, we're in trouble
already.

For a good part of the code we already want to be compatible with
compiling postgres with one compiler, and linking to libraries compiled
with something else.

Is it really so necessary to bring a second compiler into the mix for
this? Why not just insist that JIT is only supported if the main build
is done with clang, too? My experience with mixing results from different
compilers is, eh, not positive.

I don't like that option. It doesn't really buy us much, a few lines of
config code, and one additional configure option that should normally be
autodected from the environment. Requiring a specific compiler will be
terrible on windows, seems out of line how we do development, requires
using clang which is still generates a bit slower code, prevent getting
gcc warnings etc.

Greetings,

Andres Freund

#191Catalin Iacob
iacobcatalin@gmail.com
In reply to: Andres Freund (#188)
Re: JIT compiling with LLVM v11

On Thu, Mar 15, 2018 at 1:20 AM, Andres Freund <andres@anarazel.de> wrote:

I don't really live in the RHEL world, but I wonder if
https://developers.redhat.com/blog/2017/10/04/red-hat-adds-go-clangllvm-rust-compiler-toolsets-updates-gcc/
is relevant?

Indeed. It might be a bit awkward for packagers to depend on something
from Software Collections, for example because they come as separate
trees in /opt that are by default not in your path or dynamic loader
path - one needs to run everything via a scl wrapper or source the
/opt/rh/llvm-toolset-7/enable file to get the appropriate PATH and
LD_LIBRARY_PATH settings, But it seems doable.

I just installed llvm-toolset-7 (the LLVM version is 4.0.1) on RHEL
7.4 and did a build of your tree at
475b4da439ae397345ab3df509e0e8eb26a8ff39. make installcheck passes for
both the default config and a server forced to jit everything (I
think) via:
jit_above_cost = '0'
jit_inline_above_cost = '0'
jit_optimize_above_cost = '0'

As a side note, this increases the runtime from approx 4 min to 18
min. Disabling jit completely with -1 in all of the above yields 3 min
48s, close to the default question raising maybe the question of how
much coverage does jit get with the default config.

The build was with the newer gcc 7.2.1 from the aforementioned
collections, I'll try the system gcc as well. I run a buildfarm animal
(katydid) on this RHEL. When JIT gets committed I'll make it use
--with-llvm against this Software Collections LLVM.

Appears to be available on centos too
https://www.softwarecollections.org/en/scls/rhscl/devtoolset-7/

Indeed they are available for CentOS as well.

#192Andres Freund
andres@anarazel.de
In reply to: Catalin Iacob (#191)
Re: JIT compiling with LLVM v11

Hi,

On 2018-03-15 17:19:23 +0100, Catalin Iacob wrote:

On Thu, Mar 15, 2018 at 1:20 AM, Andres Freund <andres@anarazel.de> wrote:

I don't really live in the RHEL world, but I wonder if
https://developers.redhat.com/blog/2017/10/04/red-hat-adds-go-clangllvm-rust-compiler-toolsets-updates-gcc/
is relevant?

Indeed. It might be a bit awkward for packagers to depend on something
from Software Collections, for example because they come as separate
trees in /opt that are by default not in your path or dynamic loader
path - one needs to run everything via a scl wrapper or source the
/opt/rh/llvm-toolset-7/enable file to get the appropriate PATH and
LD_LIBRARY_PATH settings, But it seems doable.

It'd be just for clang, and they're not *forced* to do it, it's an
optional dependency. So I think I'm ok with that.

I just installed llvm-toolset-7 (the LLVM version is 4.0.1) on RHEL
7.4 and did a build of your tree at
475b4da439ae397345ab3df509e0e8eb26a8ff39. make installcheck passes for
both the default config and a server forced to jit everything (I
think) via:
jit_above_cost = '0'
jit_inline_above_cost = '0'
jit_optimize_above_cost = '0'

As a side note, this increases the runtime from approx 4 min to 18
min.

Sure, that jits everything, which is obviously pointless to do for
performancereasons. Especially SQL functions play very badly, because
they're replanned every execution. But it's good for testing ;)

Disabling jit completely with -1 in all of the above yields 3 min
48s, close to the default question raising maybe the question of how
much coverage does jit get with the default config.

A bit, but not hugely so. I'm not too concerned about that. I plan to
stand up a few buildfarm animals testing JITing with everything on w/
various LLVM versions.

The build was with the newer gcc 7.2.1 from the aforementioned
collections, I'll try the system gcc as well. I run a buildfarm animal
(katydid) on this RHEL. When JIT gets committed I'll make it use
--with-llvm against this Software Collections LLVM.

Cool! Thanks for testing!

Greetings,

Andres Freund

#193Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#192)
Re: JIT compiling with LLVM v11

Andres Freund <andres@anarazel.de> writes:

On 2018-03-15 17:19:23 +0100, Catalin Iacob wrote:

Indeed. It might be a bit awkward for packagers to depend on something
from Software Collections, for example because they come as separate
trees in /opt that are by default not in your path or dynamic loader
path - one needs to run everything via a scl wrapper or source the
/opt/rh/llvm-toolset-7/enable file to get the appropriate PATH and
LD_LIBRARY_PATH settings, But it seems doable.

It'd be just for clang, and they're not *forced* to do it, it's an
optional dependency. So I think I'm ok with that.

The "software collections" stuff was still in its infancy when I left
Red Hat, so things might've changed, but I'm pretty sure at the time
it was verboten for any mainstream package to depend on an SCL one.

But they very probably wouldn't want postgresql depending on a
compiler package even if the dependency was mainstream, so I rather
doubt that you'll ever see an --enable-jit PG build out of there,
making this most likely moot as far as the official RH package goes.
I don't know what Devrim's opinion might be about PGDG.

regards, tom lane

#194Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#193)
Re: JIT compiling with LLVM v11

On 2018-03-15 12:33:08 -0400, Tom Lane wrote:

Andres Freund <andres@anarazel.de> writes:

On 2018-03-15 17:19:23 +0100, Catalin Iacob wrote:

Indeed. It might be a bit awkward for packagers to depend on something
from Software Collections, for example because they come as separate
trees in /opt that are by default not in your path or dynamic loader
path - one needs to run everything via a scl wrapper or source the
/opt/rh/llvm-toolset-7/enable file to get the appropriate PATH and
LD_LIBRARY_PATH settings, But it seems doable.

It'd be just for clang, and they're not *forced* to do it, it's an
optional dependency. So I think I'm ok with that.

The "software collections" stuff was still in its infancy when I left
Red Hat, so things might've changed, but I'm pretty sure at the time
it was verboten for any mainstream package to depend on an SCL one.

But we won't get PG 11 into RHEL7.x either way, no?

But they very probably wouldn't want postgresql depending on a
compiler package even if the dependency was mainstream, so I rather
doubt that you'll ever see an --enable-jit PG build out of there,
making this most likely moot as far as the official RH package goes.
I don't know what Devrim's opinion might be about PGDG.

It'd be a build not runtime dependency, doesn't that change things?

Greetings,

Andres Freund

#195Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#194)
Re: JIT compiling with LLVM v11

Andres Freund <andres@anarazel.de> writes:

On 2018-03-15 12:33:08 -0400, Tom Lane wrote:

The "software collections" stuff was still in its infancy when I left
Red Hat, so things might've changed, but I'm pretty sure at the time
it was verboten for any mainstream package to depend on an SCL one.

But we won't get PG 11 into RHEL7.x either way, no?

Well, they've been known to back-port newer releases of PG into older
RHEL; I wouldn't necessarily assume it'd happen for 11, but maybe 12
or beyond could be made available for RHEL7 at some point.

But they very probably wouldn't want postgresql depending on a
compiler package even if the dependency was mainstream, so I rather
doubt that you'll ever see an --enable-jit PG build out of there,
making this most likely moot as far as the official RH package goes.
I don't know what Devrim's opinion might be about PGDG.

It'd be a build not runtime dependency, doesn't that change things?

How could it not be a runtime dependency? You're not proposing that
we'd embed all of LLVM into a Postgres package are you? If you are, be
assured that Red Hat will *never* ship that. Static linking/embedding of
one package in another is forbidden for obvious maintainability reasons.
I would think that other distros have similar policies.

regards, tom lane

#196Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#195)
Re: JIT compiling with LLVM v11

On 2018-03-15 12:42:54 -0400, Tom Lane wrote:

Andres Freund <andres@anarazel.de> writes:

It'd be a build not runtime dependency, doesn't that change things?

How could it not be a runtime dependency?

What we were talking about in this subthread was about a depency on
clang, not LLVM. And that's just needed at buildtime, to generate the
bitcode files (including synchronizing types / function signatures).

For the yum.pg.o, which already depends on EPEL, there's a new enough
LLVM version. There's a new enough version in RHEL proper, but it
appears to only be there for mesa (llvm-private).

You're not proposing that we'd embed all of LLVM into a Postgres
package are you?

No.

Greetings,

Andres Freund

#197Catalin Iacob
iacobcatalin@gmail.com
In reply to: Andres Freund (#196)
Re: JIT compiling with LLVM v11

On Thu, Mar 15, 2018 at 6:19 PM, Andres Freund <andres@anarazel.de> wrote:

What we were talking about in this subthread was about a depency on
clang, not LLVM. And that's just needed at buildtime, to generate the
bitcode files (including synchronizing types / function signatures).

I was actually thinking of both the buildtime and runtime dependency
because I did not realize the PGDG packages already depend on EPEL.

For the yum.pg.o, which already depends on EPEL, there's a new enough
LLVM version. There's a new enough version in RHEL proper, but it
appears to only be there for mesa (llvm-private).

Indeed RHEL 7 comes with llvm-private for mesa but that doesn't seem
kosher to use for other things.

When I said packagers I was only thinking of PGDG. I was thinking the
software collections would be the likely solution for the PGDG
packages for both buildtime and runtime. But it seems using clang from
software collections and LLVM from EPEL is also a possibility,
assuming that the newer clang generates IR that the older libraries
are guaranteed to be able to load.

For RHEL proper, I would guess that PG11 is too late for RHEL8 which,
according to history, should be coming soon.

For RHEL9 I would really expect RedHat to add llvm and clang to proper
RHEL and build/run against those, even if they add it only for
Postgres (like they did for mesa). I really don't see them shipping
without a major speedup for a major DB, also because in the meantime
the JIT in PG will have matured. That's also why I find it important
to support gcc and not restrict JIT to clang builds as I expect that
RedHat and all other Linux distros want to build everything with gcc
and asking them to switch to clang or give up JIT will put them in a
hard spot. As far as I know clang does promise gcc compatibility in
the sense that one can link together .o files compiled with both so I
expect the combination not to cause issues (assuming the other
compiler flags affecting binary compatibility are aligned).

#198Andres Freund
andres@anarazel.de
In reply to: Catalin Iacob (#197)
Re: JIT compiling with LLVM v11

Hi,

On 2018-03-15 19:14:09 +0100, Catalin Iacob wrote:

For RHEL proper, I would guess that PG11 is too late for RHEL8 which,
according to history, should be coming soon.

Yea.

For RHEL9 I would really expect RedHat to add llvm and clang to proper
RHEL and build/run against those, even if they add it only for
Postgres (like they did for mesa).

By the looks of what's going to come for RHEL8 I think it already
contains a suitable LLVM and clang (i.e. >= 3.9)?

As far as I know clang does promise gcc compatibility in
the sense that one can link together .o files compiled with both so I
expect the combination not to cause issues (assuming the other
compiler flags affecting binary compatibility are aligned).

Right. But that's not even needed, as we just use plain old C ABI via
dlsym(). Nothing needs to be linked together outside of dlsym(), so I'm
not too concerned about that aspect.

Greetings,

Andres Freund

#199Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#187)
Re: JIT compiling with LLVM v12.1

Hi,

On 2018-03-13 16:40:32 -0700, Andres Freund wrote:

I've pushed a revised and rebased version of my JIT patchset.
The git tree is at
https://git.postgresql.org/git/users/andresfreund/postgres.git
in the jit branch
https://git.postgresql.org/gitweb/?p=users/andresfreund/postgres.git;a=shortlog;h=refs/heads/jit

The biggest change is that this contains docbook docs. Please check it
out, I'm not entirely sure the structure is perfect. I'll make a
language prettying pass tomorrow, to tired for that now.

Todo:
- some build issues with old clang versions pointed out by Thomas Munro

I've added the configure magic to properly detect capabilities of
different clang versions. This doesn't resolve the 3.4 issues Thomas had
reported however, because we still rely on -flto=thin.

If necessary we could support it by adding a 'opt -module-summary $@ -o
$@' to the %.bc rules, but that'd require some version specific
handling. Given that it doesn't yet look necessary I'm loath to go
there.

- when to take jit_expressions into account (both exec and plan or just
latter)

It's just plan time now. There's a new 'jit' GUC that works *both* at
execution time and plan time, and is documented as such.

- EXPLAIN for queries that are JITed should display units. Starting
thread about effort to not duplicate code for that

done.

- GUC docs (including postgresql.conf.sample)

done.

- more explanations of type & function signature syncing

Still WIP.

Greetings,

Andres Freund

#200Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#199)
Re: JIT compiling with LLVM v12.2

Hi,

I've pushed a revised and rebased version of my JIT patchset.
The git tree is at
https://git.postgresql.org/git/users/andresfreund/postgres.git
in the jit branch
https://git.postgresql.org/gitweb/?p=users/andresfreund/postgres.git;a=shortlog;h=refs/heads/jit

There's a lot of tiny changes in here:
- doc proofreading, addition of --with-llvm docs
- comments
- pgindent (jit files, not whole tree)
- syncing of order between compiled and interpreted expressions in case
statement
- line-by-line review of expression compliation
- fix of a small memory leak (missing pfree of the JIT context struct
itself)
- slight simplification of JIT resowner integration (no need to
re-associate with parent)

My current plan is to push the first few commits relatively soon, give
the BF a few cycles to shake out. Set up a few BF animals with each
supported LLVM version. Then continue mergin.

Greetings,

Andres Freund

#201Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Andres Freund (#200)
1 attachment(s)
Re: JIT compiling with LLVM v12.2

On Tue, Mar 20, 2018 at 11:14 PM, Andres Freund <andres@anarazel.de> wrote:

- doc proofreading, addition of --with-llvm docs

The documentation builds and the resulting HTML looks good, and I like
what you've written for users and also for developers in the README
file. Perhaps it could use something about how to know it's working
with EXPLAIN (or any other introspection there might be), but maybe
you're still working on that?

I did a proof-reading pass and have some minor language and
typesetting suggestions. See comments below and attached patch
(against current HEAD of your jit branch) which implements all of
these changes, which of course you can feel free to take individual
hunks from or ignore if you disagree!

+   <varlistentry>
+    <term><acronym>JIT</acronym></term>
+    <listitem>
+     <para>
+      <ulink url="https://en.wikipedia.org/wiki/Just-in-time_compilation">Just
in Time
+      Compilation</ulink>
+     </para>
+    </listitem>
+   </varlistentry>

The usual typesetting seems to be "just-in-time" (with hyphens),
including on Wikipedia, various literature and in dictionaries. Here
"compilation" doesn't seem to need a capital letter (it's not part of
the acronym, it's not otherwise in a title context where
capitalisation is called for).

Similar comments apply to all other mentions, also changed (though I
won't repeat them here; see patch).

+ <title>JIT accelerated operations</title>

Although the existing documentation is not entirely consistent on this
point, it almost always follows the US convention for titles: initial
capitals except for a handful of small words ("is", "of", "to", ...),
like the New York Times and unlike the (London) Times. So here "JIT
Accelerated Operations". Same change elsewhere.

+ <title>What is <acronym>JIT</acronym></title>

Needs a question mark.

+   As explained in <xref linkend="jit-decision"/> the configuration variables
+   xref <xref linkend="guc-jit-above-cost"/>, <xref

Extra "xref" in the text.

+ <varlistentry id="guc-jit-above-cost" xreflabel="guc-jit-above-cost">

xreflabel should use underscores not hyphens, and shouldn't have the
leading "guc" (this breaks the resulting HTML).

+        Sets the planner's cutoff after which JIT compilation is used as part
...
+        Sets the planner's cutoff after which JIT compiled programs (see <xref

s/after which/above which/. I see there was some nearby text that
used "after which", but that was talking about time.

I think writers might do s/JIT compiled/JIT-compiled/ here and some
similar places (JIT-generated, JIT-accelerated etc), though I'm not
sure about that and I doubt anyone cares so I didn't change it.

+        available, but no error will be raised. This allows to install JIT
+        support separately from the main <productname>PostgreSQL</productname>
+        package.

"allows to ..." isn't correct English. You can say things like
"allows <object> to <infinitive>", and "allows installation ...", and
maybe "to allow installing ..." (though the last sounds a bit clumsy).
I rewrote it as "This allows JIT support to be installed separately
from ...". Same sort of thing in several places.

+        Writes the generated <productname>LLVM</productname> IR out to the
+        filesystem, inside <xref linkend="guc-data-directory"/>. This is only
+        useful for development of JIT.

Seems a little vague... maybe "... for working on the internals of the
JIT implementation"? Just to make clear it's not for end users unless
curious.

+   E.g. instead of using a facility that can evaluate arbitrary arbitrary SQL
+   expressions to evaluate an SQL predicate like <literal>WHERE a.col =

I'd write "For example" here. "E.g." seems more appropriate for
fitting into examples into tight spaces, like a remark in parentheses.
YMMV.

"arbitrary" is repeated.

+    Expression evaluation is used to evaluate <literal>WHERE</literal>
+    clauses, target lists, aggregates and projections. It can be accelerated
+    by generating code specific to the used expression.

How about "... by generating code specific to each case."

+    Tuple deforming is the process of transforming an on-disk tuple (see <xref
+    linkend="heaptuple"/>) into its in-memory representation. It can be
+    accelerated by creating a function specific to the table layout and the
+    number of to be extracted columns.

"... number of columns to be extracted."

+    <productname>LLVM</productname> has support for optimizing generated
+    code. Some of the optimizations are cheap enough to be performed whenever
+    <acronym>JIT</acronym> is used, others are only beneficial for more longer
+    running queries.

", while others are only beneficial for longer running queries."

+    <productname>PostgreSQL</productname> is very extensible and allows to
+    extend the set of datatypes, functions, operators, etc.; see <xref
+    linkend="extend"/>. In fact the builtin ones are implemented using nearly
+    the same mechanisms.  This extensibility implies some overhead, e.g. due
+    to function calls (see <xref linkend="xfunc"/>).  To reduce that overhead
+    <acronym>JIT</acronym> compilation can inline the body for small functions
+    into the expression using them. That allows to optimize away a significant
+    percentage of the overhead.

"... and allows new datatypes, functions, operators and other database
objects to be defined; ..."

"... can inline the body *of* small functions ..."

"... That allows a significant percentage of the overhead to be optimized away."

+   <acronym>JIT</acronym> is beneficial primarily for long-running, CPU bound,
+   queries. Frequently these will be analytical queries.  For short queries

I'd lose those commas.

+   made. Firstly, if the query is more costly than the <xref
+   linkend="guc-jit-optimize-above-cost"/> GUC expensive optimizations are

I'd add a comma (and maybe "then") before "GUC".

+   For development and debugging purposes a few additional GUCs exist. <xref
+   linkend="guc-jit-dump-bitcode"/> allows to inspect the generated
+   bitcode. <xref linkend="guc-jit-debugging-support"/> allows GDB to see
+   generated functions. <xref linkend="guc-jit-profiling-support"/> emits
+   information so the <productname>perf</productname> profiler can interpret
+   JIT generated functions sensibly.

"... allows the generated bitcode to be inspected."

+        <programlisting>
+struct JitProviderCallbacks
+{
+    JitProviderResetAfterErrorCB reset_after_error;
+    JitProviderReleaseContextCB release_context;
+    JitProviderCompileExprCB compile_expr;
+};
+extern void _PG_jit_provider_init(JitProviderCallbacks *cb);
+        </programlisting>

Some weird tabs in here. Changed to spaces.

About the README, some of this text is similar to the user-facing docs
and the same comments apply, and there are also some nitpicks about
apostrophes etc that I won't bother to repeat here.

--
Thomas Munro
http://www.enterprisedb.com

Attachments:

jit-doc-tweaks.patchapplication/octet-stream; name=jit-doc-tweaks.patchDownload
diff --git a/doc/src/sgml/acronyms.sgml b/doc/src/sgml/acronyms.sgml
index 5ad81a4ff77..638ffc9fe83 100644
--- a/doc/src/sgml/acronyms.sgml
+++ b/doc/src/sgml/acronyms.sgml
@@ -373,8 +373,8 @@
     <term><acronym>JIT</acronym></term>
     <listitem>
      <para>
-      <ulink url="https://en.wikipedia.org/wiki/Just-in-time_compilation">Just in Time
-      Compilation</ulink>
+      <ulink url="https://en.wikipedia.org/wiki/Just-in-time_compilation">Just-in-Time
+      compilation</ulink>
      </para>
     </listitem>
    </varlistentry>
diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index b45c9bc592f..8025b319597 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -4057,7 +4057,7 @@ ANY <replaceable class="parameter">num_sync</replaceable> ( <replaceable class="
      </varlistentry>
 
 
-     <varlistentry id="guc-jit-above-cost" xreflabel="guc-jit-above-cost">
+     <varlistentry id="guc-jit-above-cost" xreflabel="jit_above_cost">
       <term><varname>jit_above_cost</varname> (<type>floating point</type>)
       <indexterm>
        <primary><varname>jit_above_cost</varname> configuration parameter</primary>
@@ -4065,7 +4065,7 @@ ANY <replaceable class="parameter">num_sync</replaceable> ( <replaceable class="
       </term>
       <listitem>
        <para>
-        Sets the planner's cutoff after which JIT compilation is used as part
+        Sets the planner's cutoff above which JIT compilation is used as part
         of query execution (see <xref linkend="jit"/>). Performing
         <acronym>JIT</acronym> costs time but can accelerate query execution.
 
@@ -4082,7 +4082,7 @@ ANY <replaceable class="parameter">num_sync</replaceable> ( <replaceable class="
       </term>
       <listitem>
        <para>
-        Sets the planner's cutoff after which JIT compiled programs (see <xref
+        Sets the planner's cutoff above which JIT compiled programs (see <xref
         linkend="guc-jit-above-cost"/>) are optimized. Optimization initially
         takes time, but can improve execution speed.  It is not meaningful to
         set this to a lower value than <xref linkend="guc-jit-above-cost"/>.
@@ -4100,7 +4100,7 @@ ANY <replaceable class="parameter">num_sync</replaceable> ( <replaceable class="
       </term>
       <listitem>
        <para>
-        Sets the planner's cutoff after which JIT compiled programs (see <xref
+        Sets the planner's cutoff above which JIT compiled programs (see <xref
         linkend="guc-jit-above-cost"/>) attempt to inline functions and
         operators. Inlining initially takes time, but can improve execution
         speed.  It is unlikely to be beneficial to set
@@ -7419,9 +7419,9 @@ SET XML OPTION { DOCUMENT | CONTENT };
        </para>
        <para>
         If set to a non-existent library <acronym>JIT</acronym> will not
-        available, but no error will be raised. This allows to install JIT
-        support separately from the main <productname>PostgreSQL</productname>
-        package.
+        available, but no error will be raised. This allows JIT support to be
+        installed separately from the main
+        <productname>PostgreSQL</productname> package.
 
         This parameter can only be set at server start.
        </para>
@@ -8702,7 +8702,7 @@ LOG:  CleanUpLock: deleting: lock(0xb7acd844) id(24688,24696,0,0,0,1)
        <para>
         Writes the generated <productname>LLVM</productname> IR out to the
         filesystem, inside <xref linkend="guc-data-directory"/>. This is only
-        useful for development of JIT.
+        useful for working on the internals of the JIT implementation.
 
         The default setting is <literal>off</literal>, and it can only be
         changed by a superuser.
diff --git a/doc/src/sgml/jit.sgml b/doc/src/sgml/jit.sgml
index be3415fa6ce..7169744d4f9 100644
--- a/doc/src/sgml/jit.sgml
+++ b/doc/src/sgml/jit.sgml
@@ -1,31 +1,31 @@
 <!-- doc/src/sgml/jit.sgml -->
 
 <chapter id="jit">
- <title>Just in Time Compilation (<acronym>JIT</acronym>)</title>
+ <title>Just-in-Time Compilation (<acronym>JIT</acronym>)</title>
 
  <indexterm zone="jit">
   <primary><acronym>JIT</acronym></primary>
  </indexterm>
 
  <indexterm>
-  <primary>Just In Time Compilation</primary>
+  <primary>Just-In-Time compilation</primary>
   <see><acronym>JIT</acronym></see>
  </indexterm>
 
  <para>
-  This chapter explains what Just in Time Compilation is, and how it can be
+  This chapter explains what just-in-time compilation is, and how it can be
   configured in <productname>PostgreSQL</productname>.
  </para>
 
  <sect1 id="jit-reason">
-  <title>What is <acronym>JIT</acronym></title>
+  <title>What is <acronym>JIT</acronym>?</title>
 
   <para>
-   Just in Time Compilation (<acronym>JIT</acronym>) is the process of turning
+   Just-in-time compilation (<acronym>JIT</acronym>) is the process of turning
    some form of interpreted program evaluation into a native program, and
    doing so at runtime.
 
-   E.g. instead of using a facility that can evaluate arbitrary arbitrary SQL
+   For example, instead of using a facility that can evaluate arbitrary SQL
    expressions to evaluate an SQL predicate like <literal>WHERE a.col =
    3</literal>, it is possible to generate a function than can be natively
    executed by the CPU that just handles that expression, yielding a speedup.
@@ -43,7 +43,7 @@
   </para>
 
   <sect2 id="jit-accelerated-operations">
-   <title>JIT accelerated operations</title>
+   <title>JIT Accelerated Operations</title>
    <para>
     Currently <productname>PostgreSQL</productname>'s JIT implementation has
     support for accelerating expression evaluation and tuple deforming.
@@ -52,13 +52,13 @@
    <para>
     Expression evaluation is used to evaluate <literal>WHERE</literal>
     clauses, target lists, aggregates and projections. It can be accelerated
-    by generating code specific to the used expression.
+    by generating code specific to each case.
    </para>
    <para>
     Tuple deforming is the process of transforming an on-disk tuple (see <xref
     linkend="heaptuple"/>) into its in-memory representation. It can be
     accelerated by creating a function specific to the table layout and the
-    number of to be extracted columns.
+    number of columns to be extracted.
    </para>
   </sect2>
 
@@ -67,7 +67,7 @@
    <para>
     <productname>LLVM</productname> has support for optimizing generated
     code. Some of the optimizations are cheap enough to be performed whenever
-    <acronym>JIT</acronym> is used, others are only beneficial for more longer
+    <acronym>JIT</acronym> is used, while others are only beneficial for longer
     running queries.
 
     See <ulink url="https://llvm.org/docs/Passes.html#transform-passes"/> for
@@ -78,14 +78,14 @@
   <sect2 id="jit-inlining">
    <title>Inlining</title>
    <para>
-    <productname>PostgreSQL</productname> is very extensible and allows to
-    extend the set of datatypes, functions, operators, etc.; see <xref
-    linkend="extend"/>. In fact the builtin ones are implemented using nearly
+    <productname>PostgreSQL</productname> is very extensible and allows new
+    datatypes, functions, operators and other database objects to be defined; see <xref
+    linkend="extend"/>. In fact the built-in ones are implemented using nearly
     the same mechanisms.  This extensibility implies some overhead, e.g. due
     to function calls (see <xref linkend="xfunc"/>).  To reduce that overhead
     <acronym>JIT</acronym> compilation can inline the body for small functions
-    into the expression using them. That allows to optimize away a significant
-    percentage of the overhead.
+    into the expression using them. That allows a significant percentage of
+    the overhead to be optimized away.
    </para>
   </sect2>
 
@@ -95,7 +95,7 @@
   <title>When to <acronym>JIT</acronym></title>
 
   <para>
-   <acronym>JIT</acronym> is beneficial primarily for long-running, CPU bound,
+   <acronym>JIT</acronym> is beneficial primarily for long-running CPU bound
    queries. Frequently these will be analytical queries.  For short queries
    the overhead of performing <acronym>JIT</acronym> will often be higher than
    the time it can save.
@@ -117,7 +117,7 @@
    If the planner, based on the above criterion, decided that
    <acronym>JIT</acronym> is beneficial, two further decisions are
    made. Firstly, if the query is more costly than the <xref
-   linkend="guc-jit-optimize-above-cost"/> GUC expensive optimizations are
+   linkend="guc-jit-optimize-above-cost"/>, GUC expensive optimizations are
    used to improve the generated code. Secondly, if the query is more costly
    than the <xref linkend="guc-jit-inline-above-cost"/> GUC, short functions
    and operators used in the query will be inlined.  Both of these operations
@@ -153,7 +153,7 @@
 
   <para>
    As explained in <xref linkend="jit-decision"/> the configuration variables
-   xref <xref linkend="guc-jit-above-cost"/>, <xref
+   <xref linkend="guc-jit-above-cost"/>, <xref
    linkend="guc-jit-optimize-above-cost"/>, <xref
    linkend="guc-jit-inline-above-cost"/> decide whether JIT compilation is
    performed for a query, and how much effort is spent doing so.
@@ -161,8 +161,8 @@
 
   <para>
    For development and debugging purposes a few additional GUCs exist. <xref
-   linkend="guc-jit-dump-bitcode"/> allows to inspect the generated
-   bitcode. <xref linkend="guc-jit-debugging-support"/> allows GDB to see
+   linkend="guc-jit-dump-bitcode"/> allows the generated bitcode to be
+   inspected. <xref linkend="guc-jit-debugging-support"/> allows GDB to see
    generated functions. <xref linkend="guc-jit-profiling-support"/> emits
    information so the <productname>perf</productname> profiler can interpret
    JIT generated functions sensibly.
@@ -179,7 +179,7 @@
   <title>Extensibility</title>
 
   <sect2 id="jit-extensibility-bitcode">
-   <title>Inlining support for extensions</title>
+   <title>Inlining Support for Extensions</title>
    <para>
     <productname>PostgreSQL</productname>'s <acronym>JIT</acronym>
     implementation can inline the implementation of operators and functions
@@ -231,7 +231,7 @@
      <function>_PG_jit_provider_init</function>. This function is
      passed a struct that needs to be filled with the callback function
      pointers for individual actions.
-	 <programlisting>
+     <programlisting>
 struct JitProviderCallbacks
 {
     JitProviderResetAfterErrorCB reset_after_error;
@@ -239,7 +239,7 @@ struct JitProviderCallbacks
     JitProviderCompileExprCB compile_expr;
 };
 extern void _PG_jit_provider_init(JitProviderCallbacks *cb);
-	 </programlisting>
+     </programlisting>
     </para>
    </sect3>
   </sect2>
diff --git a/src/backend/jit/README b/src/backend/jit/README
index 03ec3253ee5..b37dcbe0c16 100644
--- a/src/backend/jit/README
+++ b/src/backend/jit/README
@@ -1,18 +1,18 @@
-What is Just in Time Compilation
-================================
+What is Just-in-Time Compilation?
+=================================
 
-Just in Time Compilation (JIT) is the process of turning some form of
+Just-in-Time compilation (JIT) is the process of turning some form of
 interpreted program evaluation into a native program, and doing so at
 runtime.
 
-E.g. instead of using a facility that can evaluate arbitrary arbitrary
+For example, instead of using a facility that can evaluate arbitrary
 SQL expressions to evaluate an SQL predicate like WHERE a.col = 3, it
 is possible to generate a function than can be natively executed by
 the CPU that just handles that expression, yielding a speedup.
 
 That this is done at query execution time, possibly even only in cases
 the relevant task is done a number of times, makes it JIT, rather than
-ahead of time (AOT). Given the way JIT compilation is used in
+ahead-of-time (AOT). Given the way JIT compilation is used in
 postgres, the lines between interpretation, AOT and JIT are somewhat
 blurry.
 
@@ -23,8 +23,8 @@ function just handling a specific type of table, despite tuple
 deforming not commonly being understood as a "program".
 
 
-Why JIT
-=======
+Why JIT?
+========
 
 Parts of postgres are commonly bottlenecked by comparatively small
 pieces of CPU intensive code. In a number of cases that is because the
@@ -52,11 +52,11 @@ How to JIT
 Postgres, by default, uses LLVM to perform JIT. LLVM was chosen
 because it is developed by several large corporations and therefore
 unlikely to be discontinued, because it has a license compatible with
-PostgreSQL, and because it's LLVM IR allow can be generated from C
+PostgreSQL, and because its LLVM IR can be generated from C
 using the clang compiler.
 
 
-Shared Library separation
+Shared Library Separation
 -------------------------
 
 To avoid the main PostgreSQL binary directly depending on LLVM, which
@@ -127,7 +127,7 @@ used.
 Error Handling
 --------------
 
-There's two aspects to error handling.  Firstly, generated (LLVM IR)
+There are two aspects to error handling.  Firstly, generated (LLVM IR)
 and emitted functions (mmap()ed segments) need to be cleaned up both
 after a successful query execution and after an error. This is done by
 registering each created JITContext with the current resource owner,
@@ -138,7 +138,7 @@ The second, less pretty, aspect of error handling is OOM handling
 inside LLVM itself. The above resowner based mechanism takes care of
 cleaning up emitted code upon ERROR, but there's also the chance that
 LLVM itself runs out of memory. LLVM by default does *not* use any C++
-exceptions. It's allocations are primarily funneled through the
+exceptions. Its allocations are primarily funneled through the
 standard "new" handlers, and some direct use of malloc() and
 mmap(). For the former a 'new handler' exists
 http://en.cppreference.com/w/cpp/memory/new/set_new_handler for the
@@ -193,14 +193,14 @@ Inlining
 --------
 
 One big advantage of JITing expressions is that it can significantly
-reduce the overhead of postgres' extensible function/operator
+reduce the overhead of postgres's extensible function/operator
 mechanism, by inlining the body of called functions / operators.
 
 It obviously is undesirable to maintain a second implementation of
 commonly used functions, just for inlining purposes. Instead we take
 advantage of the fact that the clang compiler can emit LLVM IR.
 
-The ability to do so allows to get the LLVM IR for all operators
+The ability to do so allows us to get the LLVM IR for all operators
 (e.g. int8eq, float8pl etc), without maintaining two copies.  These
 bitcode files get installed into the server's
   $pkglibdir/bitcode/postgres/
@@ -260,7 +260,7 @@ generation, and later compiling larger parts of queries.
 When to JIT
 ===========
 
-Currently there's a number of GUCs that influence JITing:
+Currently there are a number of GUCs that influence JITing:
 
 - jit_above_cost = -1, 0-DBL_MAX - all queries with a higher total cost
   get JITed, *without* optimization (expensive part), corresponding to
#202Andres Freund
andres@anarazel.de
In reply to: Thomas Munro (#201)
Re: JIT compiling with LLVM v12.2

Hi,

On 2018-03-21 12:07:59 +1300, Thomas Munro wrote:

The documentation builds and the resulting HTML looks good, and I like
what you've written for users and also for developers in the README
file.

Cool.

Perhaps it could use something about how to know it's working
with EXPLAIN (or any other introspection there might be), but maybe
you're still working on that?

I'd not yet seen that as a priority, but I think it'd make sense to show
an example of that. Perhaps showing a select query from a function,
once with that function's cost set to the default, and once with it set
to something high?

I did a proof-reading pass and have some minor language and
typesetting suggestions. See comments below and attached patch
(against current HEAD of your jit branch) which implements all of
these changes, which of course you can feel free to take individual
hunks from or ignore if you disagree!

Yeha!

+   <varlistentry>
+    <term><acronym>JIT</acronym></term>
+    <listitem>
+     <para>
+      <ulink url="https://en.wikipedia.org/wiki/Just-in-time_compilation">Just
in Time
+      Compilation</ulink>
+     </para>
+    </listitem>
+   </varlistentry>

The usual typesetting seems to be "just-in-time" (with hyphens),
including on Wikipedia, various literature and in dictionaries. Here
"compilation" doesn't seem to need a capital letter (it's not part of
the acronym, it's not otherwise in a title context where
capitalisation is called for).

I wasn't sure about that one, thanks.

+ <varlistentry id="guc-jit-above-cost" xreflabel="guc-jit-above-cost">

xreflabel should use underscores not hyphens, and shouldn't have the
leading "guc" (this breaks the resulting HTML).

Oops, yea, that's definitely a mistake.

+        Sets the planner's cutoff after which JIT compilation is used as part
...
+        Sets the planner's cutoff after which JIT compiled programs (see <xref

s/after which/above which/. I see there was some nearby text that
used "after which", but that was talking about time.

I think writers might do s/JIT compiled/JIT-compiled/ here and some
similar places (JIT-generated, JIT-accelerated etc), though I'm not
sure about that and I doubt anyone cares so I didn't change it.

I was wondering about that...

Thanks a lot for going through this!

Greetings,

Andres Freund

#203Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#200)
Re: JIT compiling with LLVM v12.2

Hi,

On 2018-03-20 03:14:55 -0700, Andres Freund wrote:

My current plan is to push the first few commits relatively soon, give
the BF a few cycles to shake out. Set up a few BF animals with each
supported LLVM version. Then continue mergin.

I've done that. I'll set up a number of BF animals as soon as I've got
the buildfarm secrets for them.

- Andres

#204Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Andres Freund (#203)
Re: JIT compiling with LLVM v12.2

On Wed, Mar 21, 2018 at 1:50 PM, Andres Freund <andres@anarazel.de> wrote:

On 2018-03-20 03:14:55 -0700, Andres Freund wrote:

My current plan is to push the first few commits relatively soon, give
the BF a few cycles to shake out. Set up a few BF animals with each
supported LLVM version. Then continue mergin.

I've done that. I'll set up a number of BF animals as soon as I've got
the buildfarm secrets for them.

Somehow your configure test correctly concludes that my $CC (clang
4.0) doesn't support -fexcess-precision=standard but that my $CXX
(clang++ 4.0) does, despite producing a nearly identical warning:

configure:5489: checking whether ccache cc supports
-fexcess-precision=standard, for CFLAGS
configure:5511: ccache cc -c -Wall -Wmissing-prototypes
-Wpointer-arith -Wdeclaration-after-statement -Wendif-labels
-Wmissing-format-attribute -Wformat-security -fno-strict-aliasing
-fwrapv -fexcess-precision=standard conftest.c >&5
cc: warning: optimization flag '-fexcess-precision=standard' is not
supported [-Wignored-optimization-argument]
configure:5511: $? = 0
configure: failed program was:
...
configure:5521: result: no

configure:5528: checking whether ccache c++ supports
-fexcess-precision=standard, for CXXFLAGS
configure:5556: ccache c++ -c -Wall -Wpointer-arith
-fno-strict-aliasing -fwrapv -fexcess-precision=standard conftest.cpp

&5

c++: warning: optimization flag '-fexcess-precision=standard' is not
supported [-Wignored-optimization-argument]
configure:5556: $? = 0
configure:5572: result: yes

So it goes into my $CXXFLAGS and then I get the same warning when
compiling the three .cpp files in the tree.

GCC also doesn't like that in C++ mode, but it seems to report an
error (rather than a warning) so with g++ as your $CXX configure sees
$? = 1 and draws the correct conclusion.

$ gcc -fexcess-precision=standard -c test.c
$ g++ -fexcess-precision=standard -c test.cpp
cc1plus: sorry, unimplemented: -fexcess-precision=standard for C++

--
Thomas Munro
http://www.enterprisedb.com

#205Andres Freund
andres@anarazel.de
In reply to: Thomas Munro (#204)
Re: JIT compiling with LLVM v12.2

Hi,

On 2018-03-21 15:22:08 +1300, Thomas Munro wrote:

Somehow your configure test correctly concludes that my $CC (clang
4.0) doesn't support -fexcess-precision=standard but that my $CXX
(clang++ 4.0) does, despite producing a nearly identical warning:

Yea, there was a copy & pasto (s/ac_c_werror_flag/ac_cxx_werror_flag/),
sorry. If you rebase onto the committed version, it should work? I'll
push a version rebased of the jit tree soon.

Greetings,

Andres Freund

#206Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#205)
Re: JIT compiling with LLVM v12.2

On 2018-03-20 19:29:55 -0700, Andres Freund wrote:

Hi,

On 2018-03-21 15:22:08 +1300, Thomas Munro wrote:

Somehow your configure test correctly concludes that my $CC (clang
4.0) doesn't support -fexcess-precision=standard but that my $CXX
(clang++ 4.0) does, despite producing a nearly identical warning:

Yea, there was a copy & pasto (s/ac_c_werror_flag/ac_cxx_werror_flag/),
sorry. If you rebase onto the committed version, it should work? I'll
push a version rebased of the jit tree soon.

Well, or not. Seems git.pg.o is down atm:

debug1: Next authentication method: publickey
debug1: Offering public key: RSA SHA256:cMbSa8YBm8AgaIeMtCSFvvPDrrrdadCxzQaFiWFe+7c /home/andres/.ssh/id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 277
<hang>

Will try tomorrow.

Greetings,

Andres Freund

#207Stephen Frost
sfrost@snowman.net
In reply to: Andres Freund (#206)
Re: JIT compiling with LLVM v12.2

Greetings,

* Andres Freund (andres@anarazel.de) wrote:

On 2018-03-20 19:29:55 -0700, Andres Freund wrote:

On 2018-03-21 15:22:08 +1300, Thomas Munro wrote:

Somehow your configure test correctly concludes that my $CC (clang
4.0) doesn't support -fexcess-precision=standard but that my $CXX
(clang++ 4.0) does, despite producing a nearly identical warning:

Yea, there was a copy & pasto (s/ac_c_werror_flag/ac_cxx_werror_flag/),
sorry. If you rebase onto the committed version, it should work? I'll
push a version rebased of the jit tree soon.

Well, or not. Seems git.pg.o is down atm:

debug1: Next authentication method: publickey
debug1: Offering public key: RSA SHA256:cMbSa8YBm8AgaIeMtCSFvvPDrrrdadCxzQaFiWFe+7c /home/andres/.ssh/id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 277
<hang>

Will try tomorrow.

Andres contacted pginfra over IRC about this, but it seems that it
resolved itself shortly following (per a comment from Andres to that
effect), so, afaik, things are working properly.

If anyone has issues with git.p.o, please let us know, but hopefully all
is good now.

Thanks!

Stephen

#208Andres Freund
andres@anarazel.de
In reply to: Stephen Frost (#207)
Re: JIT compiling with LLVM v12.2

Hi,

On 2018-03-20 23:03:13 -0400, Stephen Frost wrote:

Greetings,

* Andres Freund (andres@anarazel.de) wrote:

On 2018-03-20 19:29:55 -0700, Andres Freund wrote:

On 2018-03-21 15:22:08 +1300, Thomas Munro wrote:

Somehow your configure test correctly concludes that my $CC (clang
4.0) doesn't support -fexcess-precision=standard but that my $CXX
(clang++ 4.0) does, despite producing a nearly identical warning:

Yea, there was a copy & pasto (s/ac_c_werror_flag/ac_cxx_werror_flag/),
sorry. If you rebase onto the committed version, it should work? I'll
push a version rebased of the jit tree soon.

Well, or not. Seems git.pg.o is down atm:

debug1: Next authentication method: publickey
debug1: Offering public key: RSA SHA256:cMbSa8YBm8AgaIeMtCSFvvPDrrrdadCxzQaFiWFe+7c /home/andres/.ssh/id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 277
<hang>

Will try tomorrow.

Andres contacted pginfra over IRC about this, but it seems that it
resolved itself shortly following (per a comment from Andres to that
effect), so, afaik, things are working properly.

Indeed. I've pushed a rebased version now, that basically just fixes the
issue Thomas observed.

Thanks,

Andres Freund

#209Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Andres Freund (#208)
Re: JIT compiling with LLVM v12.2

On Wed, Mar 21, 2018 at 4:07 PM, Andres Freund <andres@anarazel.de> wrote:

Indeed. I've pushed a rebased version now, that basically just fixes the
issue Thomas observed.

I set up a 32 bit i386 virtual machine and installed Debian 9.4.
Compiler warnings:

gcc -Wall -Wmissing-prototypes -Wpointer-arith
-Wdeclaration-after-statement -Wendif-labels
-Wmissing-format-attribute -Wformat-security -fno-strict-aliasing
-fwrapv -fexcess-precision=standard -g -O2 -fPIC
-D__STDC_LIMIT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_CONSTANT_MACROS
-D_GNU_SOURCE -I/usr/lib/llvm-3.9/include -I../../../../src/include
-D_GNU_SOURCE -c -o llvmjit.o llvmjit.c
llvmjit.c: In function ‘llvm_get_function’:
llvmjit.c:268:10: warning: cast to pointer from integer of different
size [-Wint-to-pointer-cast]
return (void *) addr;
^
llvmjit.c:270:10: warning: cast to pointer from integer of different
size [-Wint-to-pointer-cast]
return (void *) addr;
^
llvmjit.c: In function ‘llvm_resolve_symbol’:
llvmjit.c:842:10: warning: cast from pointer to integer of different
size [-Wpointer-to-int-cast]
addr = (uint64_t) load_external_function(modname, funcname,
^
llvmjit.c:845:10: warning: cast from pointer to integer of different
size [-Wpointer-to-int-cast]
addr = (uint64_t) LLVMSearchForAddressOfSymbol(symname);
^

Then "make check" bombs:

Program terminated with signal SIGSEGV, Segmentation fault.
#0 0xac233453 in llvm::SelectionDAG::getNode(unsigned int,
llvm::SDLoc const&, llvm::EVT, llvm::SDValue) () from
/usr/lib/i386-linux-gnu/libLLVM-3.9.so.1
(gdb) bt
#0 0xac233453 in llvm::SelectionDAG::getNode(unsigned int,
llvm::SDLoc const&, llvm::EVT, llvm::SDValue) () from
/usr/lib/i386-linux-gnu/libLLVM-3.9.so.1
#1 0xac270c29 in llvm::TargetLowering::SimplifySetCC(llvm::EVT,
llvm::SDValue, llvm::SDValue, llvm::ISD::CondCode, bool,
llvm::TargetLowering::DAGCombinerInfo&, llvm::SDLoc const&) const ()
from /usr/lib/i386-linux-gnu/libLLVM-3.9.so.1
#2 0xac11d3a8 in ?? () from /usr/lib/i386-linux-gnu/libLLVM-3.9.so.1
#3 0xac11ef0b in ?? () from /usr/lib/i386-linux-gnu/libLLVM-3.9.so.1
#4 0xac12030e in llvm::SelectionDAG::Combine(llvm::CombineLevel,
llvm::AAResults&, llvm::CodeGenOpt::Level) () from
/usr/lib/i386-linux-gnu/libLLVM-3.9.so.1
#5 0xac24ccec in llvm::SelectionDAGISel::CodeGenAndEmitDAG() () from
/usr/lib/i386-linux-gnu/libLLVM-3.9.so.1
#6 0xac24d239 in
llvm::SelectionDAGISel::SelectBasicBlock(llvm::ilist_iterator<llvm::Instruction
const>, llvm::ilist_iterator<llvm::Instruction const>, bool&) () from
/usr/lib/i386-linux-gnu/libLLVM-3.9.so.1
#7 0xac25466f in
llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) ()
from /usr/lib/i386-linux-gnu/libLLVM-3.9.so.1
#8 0xac25773c in
llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&)
() from /usr/lib/i386-linux-gnu/libLLVM-3.9.so.1
#9 0xad356414 in ?? () from /usr/lib/i386-linux-gnu/libLLVM-3.9.so.1
#10 0xabf5a019 in
llvm::MachineFunctionPass::runOnFunction(llvm::Function&) () from
/usr/lib/i386-linux-gnu/libLLVM-3.9.so.1
#11 0xabdefaeb in llvm::FPPassManager::runOnFunction(llvm::Function&)
() from /usr/lib/i386-linux-gnu/libLLVM-3.9.so.1
#12 0xabdefe35 in llvm::FPPassManager::runOnModule(llvm::Module&) ()
from /usr/lib/i386-linux-gnu/libLLVM-3.9.so.1
#13 0xabdf019a in llvm::legacy::PassManagerImpl::run(llvm::Module&) ()
from /usr/lib/i386-linux-gnu/libLLVM-3.9.so.1
#14 0xabdf037f in llvm::legacy::PassManager::run(llvm::Module&) ()
from /usr/lib/i386-linux-gnu/libLLVM-3.9.so.1
#15 0xacb3c3de in
std::_Function_handler<llvm::object::OwningBinary<llvm::object::ObjectFile>
(llvm::Module&), llvm::orc::SimpleCompiler>::_M_invoke(std::_Any_data
const&, llvm::Module&) () from
/usr/lib/i386-linux-gnu/libLLVM-3.9.so.1
#16 0xacb37d00 in ?? () from /usr/lib/i386-linux-gnu/libLLVM-3.9.so.1
#17 0xacb384f8 in ?? () from /usr/lib/i386-linux-gnu/libLLVM-3.9.so.1
#18 0xacb388d5 in LLVMOrcAddEagerlyCompiledIR () from
/usr/lib/i386-linux-gnu/libLLVM-3.9.so.1
#19 0xae7bb3e4 in llvm_compile_module (context=0x20858a0) at llvmjit.c:539
#20 llvm_get_function (context=0x20858a0, funcname=0x21da818
"evalexpr_2_3") at llvmjit.c:244
#21 0xae7c333e in ExecRunCompiledExpr (state=0x2119634,
econtext=0x211810c, isNull=0xbfdd138e "\207") at llvmjit_expr.c:2563
#22 0x00745e10 in ExecEvalExprSwitchContext (isNull=0xbfdd138e "\207",
econtext=<optimized out>, state=0x2119634) at
../../../src/include/executor/executor.h:305
#23 ExecQual (econtext=<optimized out>, state=0x2119634) at
../../../src/include/executor/executor.h:374
#24 ExecNestLoop (pstate=<optimized out>) at nodeNestloop.c:214
#25 0x00748ddd in ExecProcNode (node=0x2118080) at
../../../src/include/executor/executor.h:239
#26 ExecSort (pstate=0x2117ff4) at nodeSort.c:107
#27 0x0071e9d2 in ExecProcNode (node=0x2117ff4) at
../../../src/include/executor/executor.h:239
#28 ExecutePlan (execute_once=<optimized out>, dest=0x0,
direction=NoMovementScanDirection, numberTuples=<optimized out>,
sendTuples=<optimized out>, operation=CMD_SELECT,
use_parallel_mode=<optimized out>, planstate=0x2117ff4,
estate=0x2117ee8) at execMain.c:1729
#29 standard_ExecutorRun (queryDesc=0x207da50,
direction=ForwardScanDirection, count=0, execute_once=1 '\001') at
execMain.c:365
#30 0x00883e8d in PortalRunSelect (portal=portal@entry=0x20a7f58,
forward=forward@entry=1 '\001', count=0, count@entry=2147483647,
dest=0x21a8888) at pquery.c:932
#31 0x008856a0 in PortalRun (portal=0x20a7f58, count=2147483647,
isTopLevel=1 '\001', run_once=1 '\001', dest=0x21a8888,
altdest=0x21a8888, completionTag=0xbfdd1620 "") at pquery.c:773
#32 0x008808a7 in exec_simple_query
(query_string=query_string@entry=0x205a628 "SELECT '' AS tf_12_ff_4,
BOOLTBL1.*, BOOLTBL2.*\n FROM BOOLTBL1, BOOLTBL2\n WHERE
BOOLTBL2.f1 = BOOLTBL1.f1 or BOOLTBL1.f1 = bool 'true'\n ORDER BY
BOOLTBL1.f1, BOOLTBL2.f1;")
at postgres.c:1121
#33 0x0088270e in PostgresMain (argc=1, argv=0x2083c44,
dbname=<optimized out>, username=0x2083aa0 "munro") at postgres.c:4147
#34 0x00552cff in BackendRun (port=0x207d518) at postmaster.c:4409
#35 BackendStartup (port=0x207d518) at postmaster.c:4081
#36 ServerLoop () at postmaster.c:1754
#37 0x007fc68f in PostmasterMain (argc=<optimized out>,
argv=<optimized out>) at postmaster.c:1362
#38 0x0055475a in main (argc=<optimized out>, argv=<optimized out>) at
main.c:228
(gdb)

That's with clang-3.9 and llvm-3.9-dev installed, which configure
automagically found.

"make -C src/interfaces/ecpg/test check" consistently fails on my macOS machine:

test compat_oracle/char_array ... stderr source FAILED

*** /Users/munro/projects/postgresql/src/interfaces/ecpg/test/expected/compat_oracle-char_array.stdout
 2018-03-21 09:46:33.000000000 +1300
--- /Users/munro/projects/postgresql/src/interfaces/ecpg/test/results/compat_oracle-char_array.stdout
  2018-03-21 19:13:43.000000000 +1300
***************
*** 1,10 ****
  Full Str.  :  Short  Ind.
! "          ": "    "  -1
! "AB        ": "AB  "  0
! "ABCD      ": "ABCD"  0
! "ABCDE     ": "ABCD"  5
! "ABCDEF    ": "ABCD"  6
! "ABCDEFGHIJ": "ABCD"  10

GOOD-BYE!!

--- 1,10 ----
  Full Str.  :  Short  Ind.
! "": ""  0
! "AB": "AB"  0
! "ABCD": "ABCD"  0
! "ABCDE": "ABCDE"  0
! "ABCDEF": "ABCDE"  6
! "ABCDEFGHIJ": "ABCDE"  10

GOOD-BYE!!

======================================================================

*** /Users/munro/projects/postgresql/src/interfaces/ecpg/test/expected/compat_oracle-char_array.stderr
 2018-03-21 16:27:05.000000000 +1300
--- /Users/munro/projects/postgresql/src/interfaces/ecpg/test/results/compat_oracle-char_array.stderr
  2018-03-21 19:13:43.000000000 +1300
***************
*** 90,96 ****
  [NO_PID]: sqlca: code: 0, state: 00000
  [NO_PID]: ecpg_get_data on line 50: RESULT: ABCDE offset: -1; array: no
  [NO_PID]: sqlca: code: 0, state: 00000
- Warning: At least one column was truncated
  [NO_PID]: ecpg_execute on line 50: query: fetch C; with 0
parameter(s) on connection ecpg1_regression
  [NO_PID]: sqlca: code: 0, state: 00000
  [NO_PID]: ecpg_execute on line 50: using PQexec
--- 90,95 ----

======================================================================

I couldn't immediately see what was going wrong there since I'm not
too familiar with ecpg... That's with vendor cc/c++ and LLVM 5.0 and
6.0, using a couple of different clang versions.

While trying out many combinations of versions of stuff on different
OSes, I found another way to screw up that I wanted to report here.
It's obvious that this is doomed if you know what's going on, but I
thought the failure mode was interesting enough to report here. There
is a hazard for people running systems where the vendor ships some
version (possibly a mystery version) of clang in the PATH but you have
to get LLVM separately (eg from ports/brew/whatever):

1. If you use macOS High Sierra's current /usr/bin/clang ("9.0.0"),
ie the default if you didn't set CLANG to something else when you ran
./configure, and you build against LLVM 3.9, then llvm-lto gives this
message during "make install":

Invalid summary version 3, 1 expected
error: can't create ModuleSummaryIndexObjectFile for buffer: Corrupted bitcode

Then it segfaults! Presumably clang "9.0.0" derives from a more
recent upstream version (why must they mess with the reported
version?!). Apple's clang 9.0.0 bitcode works fine with LLVM 5.0. I
don't have 4.0 to hand to test.

2. If you use FreeBSD 11's current /usr/bin/clang (4.0) and you build
against LLVM 3.9 then it's the same:

Invalid summary version 3, 1 expected
error: can't create ModuleSummaryIndexObjectFile for buffer: Corrupted bitcode
gmake[3]: *** [Makefile:252: install-postgres-bitcode] Segmentation
fault (core dumped)

It works fine with 4.0 or 5.0, as expected.

Neither of these cases should be too surprising, and users of those
operating systems can easily get a newer LLVM or an older -- it was
just interesting to see exactly what goes wrong and exactly when. I
suppose there could be a configure test to see if your $CLANG can play
nicely with your $LLVM_CONFIG.

--
Thomas Munro
http://www.enterprisedb.com

#210Catalin Iacob
iacobcatalin@gmail.com
In reply to: Andres Freund (#208)
Re: JIT compiling with LLVM v12.2

On Wed, Mar 21, 2018 at 4:07 AM, Andres Freund <andres@anarazel.de> wrote:

Indeed. I've pushed a rebased version now, that basically just fixes the
issue Thomas observed.

Testing 2d6f2fba from your repository configured --with-llvm I noticed
some weird things in the configure output.

Without --enable-debug:
configure: using compiler=gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16)
configure: using CFLAGS=-Wall -Wmissing-prototypes -Wpointer-arith
-Wdeclaration-after-statement -Wendif-labels
-Wmissing-format-attribute -Wformat-security -fno-strict-aliasing
-fwrapv -fexcess-precision=standard -O2
configure: using CPPFLAGS= -D_GNU_SOURCE
configure: using LDFLAGS= -L/opt/rh/llvm-toolset-7/root/usr/lib64
-Wl,--as-needed
configure: using CXX=g++
configure: using CXXFLAGS=-Wall -Wpointer-arith -Wendif-labels
-Wmissing-format-attribute -Wformat-security -fno-strict-aliasing
-fwrapv -g -O2
configure: using CLANG=/opt/rh/llvm-toolset-7/root/usr/bin/clang
configure: using BITCODE_CFLAGS= -fno-strict-aliasing -fwrapv -O2
configure: using BITCODE_CXXFLAGS= -fno-strict-aliasing -fwrapv -O2
BITCODE_CXXFLAGS

With --enable-debug:
configure: using compiler=gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16)
configure: using CFLAGS=-Wall -Wmissing-prototypes -Wpointer-arith
-Wdeclaration-after-statement -Wendif-labels
-Wmissing-format-attribute -Wformat-security -fno-strict-aliasing
-fwrapv -fexcess-precision=standard -g -O2
configure: using CPPFLAGS= -D_GNU_SOURCE
configure: using LDFLAGS= -L/opt/rh/llvm-toolset-7/root/usr/lib64
-Wl,--as-needed
configure: using CXX=g++
configure: using CXXFLAGS=-Wall -Wpointer-arith -Wendif-labels
-Wmissing-format-attribute -Wformat-security -fno-strict-aliasing
-fwrapv -g -g -O2
configure: using CLANG=/opt/rh/llvm-toolset-7/root/usr/bin/clang
configure: using BITCODE_CFLAGS= -fno-strict-aliasing -fwrapv -O2
configure: using BITCODE_CXXFLAGS= -fno-strict-aliasing -fwrapv -O2
BITCODE_CXXFLAGS

So I unconditionally get one -g added to CXXFLAGS regardless of
whether I specify --enable-debug or not. And --enable-debug results in
-g -g in CXXFLAGS.

Didn't get to look at the code yet, maybe that comes from:
$ llvm-config --cxxflags
-I/opt/rh/llvm-toolset-7/root/usr/include -O2 -g -pipe -Wall
-Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong
--param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic
-fPIC -fvisibility-inlines-hidden -Wall -W -Wno-unused-parameter
-Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -pedantic
-Wno-long-long -Wno-maybe-uninitialized -Wdelete-non-virtual-dtor
-Wno-comment -std=c++11 -ffunction-sections -fdata-sections -O2 -g
-DNDEBUG -fno-exceptions -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS
-D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS

But on the other hand there are lots of other flags in there that
don't end up in CXXFLAGS.

BTW, you should probably specify -std=c++11 (or whatever you need) as
various g++ and clang++ versions default to various things. Will the
required C++ standard be based on the requirements of the C++ code in
the PG tree or will you take it from LLVM's CXXFLAGS? Can --std=c++11
and --std=c++14 compiled .o files be linked together? Or in other
words, in case in the future LLVM starts requiring C++14 but the code
in the PG tree you wrote still builds with C++11, will PG upgrade it's
requirement with LLVM or will it stay with the older standard?

Also, my CXXFLAGS did not get -fexcess-precision=standard neither did
BITCODE_CFLAGS nor BITCODE_CXXFLAGS.

In case it's interesting:
$ llvm-config --cflags
-I/opt/rh/llvm-toolset-7/root/usr/include -O2 -g -pipe -Wall
-Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong
--param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic
-fPIC -Wall -W -Wno-unused-parameter -Wwrite-strings
-Wno-missing-field-initializers -pedantic -Wno-long-long -Wno-comment
-ffunction-sections -fdata-sections -O2 -g -DNDEBUG -D_GNU_SOURCE
-D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS

2. Unlike all the other *FLAGS, BITCODE_CXXFLAGS includes itself on
the right hand side of the equal
configure: using BITCODE_CXXFLAGS= -fno-strict-aliasing -fwrapv -O2
BITCODE_CXXFLAGS

#211Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Thomas Munro (#209)
Re: JIT compiling with LLVM v12.2

On Wed, Mar 21, 2018 at 8:06 PM, Thomas Munro
<thomas.munro@enterprisedb.com> wrote:

On Wed, Mar 21, 2018 at 4:07 PM, Andres Freund <andres@anarazel.de> wrote:

Indeed. I've pushed a rebased version now, that basically just fixes the
issue Thomas observed.

I set up a 32 bit i386 virtual machine and installed Debian 9.4.

Next up, I have an arm64 system running Debian 9.4. It bombs in
"make check" and in simple tests:

postgres=# set jit_above_cost = 0;
SET
postgres=# select 42;
<boom>

The stack looks like this:

Program received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
51 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1 0x0000ffff8f65adf4 in __GI_abort () at abort.c:89
#2 0x0000ffff83e2de40 in __gnu_cxx::__verbose_terminate_handler() ()
from /usr/lib/aarch64-linux-gnu/libstdc++.so.6
#3 0x0000ffff83e2bd4c in ?? () from /usr/lib/aarch64-linux-gnu/libstdc++.so.6
#4 0x0000ffff83e2bd98 in std::terminate() () from
/usr/lib/aarch64-linux-gnu/libstdc++.so.6
#5 0x0000ffff83e2c01c in __cxa_throw () from
/usr/lib/aarch64-linux-gnu/libstdc++.so.6
#6 0x0000ffff83e544bc in std::__throw_bad_function_call() () from
/usr/lib/aarch64-linux-gnu/libstdc++.so.6
#7 0x0000ffff85176a2c in LLVMOrcCreateInstance () from
/usr/lib/aarch64-linux-gnu/libLLVM-3.9.so.1
#8 0x0000ffff865c4db0 in llvm_session_initialize () at llvmjit.c:643
#9 llvm_create_context (jitFlags=9) at llvmjit.c:136
#10 0x0000ffff865cf8c8 in llvm_compile_expr (state=0xaaaaf2300208) at
llvmjit_expr.c:132
#11 0x0000aaaab64ca71c in ExecReadyExpr
(state=state@entry=0xaaaaf2300208) at execExpr.c:627
#12 0x0000aaaab64cd7b8 in ExecBuildProjectionInfo
(targetList=<optimized out>, econtext=<optimized out>, slot=<optimized
out>, parent=parent@entry=0xaaaaf22ffde0,
inputDesc=inputDesc@entry=0x0)
at execExpr.c:471
#13 0x0000aaaab64e0028 in ExecAssignProjectionInfo
(planstate=planstate@entry=0xaaaaf22ffde0,
inputDesc=inputDesc@entry=0x0) at execUtils.c:460
#14 0x0000aaaab64fca28 in ExecInitResult
(node=node@entry=0xaaaaf224e1a0, estate=estate@entry=0xaaaaf22ffbc8,
eflags=eflags@entry=16) at nodeResult.c:221
#15 0x0000aaaab64db828 in ExecInitNode (node=0xaaaaf224e1a0,
node@entry=0xaaaaf227a610, estate=estate@entry=0xaaaaf22ffbc8,
eflags=eflags@entry=16) at execProcnode.c:164
#16 0x0000aaaab64d6a70 in InitPlan (eflags=16,
queryDesc=0xaaaaf226d808) at execMain.c:1051
#17 standard_ExecutorStart (queryDesc=0xaaaaf226d808, eflags=16) at
execMain.c:266
#18 0x0000aaaab662dbec in PortalStart (portal=0x400,
portal@entry=0xaaaaf22b04d8, params=0x59004077f060bc65,
params@entry=0x0, eflags=43690, eflags@entry=0,
snapshot=0xaaaab689df58, snapshot@entry=0x0)
at pquery.c:520
#19 0x0000aaaab6628b18 in exec_simple_query
(query_string=query_string@entry=0xaaaaf224c3d8 "select 42;") at
postgres.c:1082
#20 0x0000aaaab662a6a8 in PostgresMain (argc=<optimized out>,
argv=argv@entry=0xaaaaf2278b70, dbname=<optimized out>,
username=<optimized out>) at postgres.c:4147
#21 0x0000aaaab631cdd0 in BackendRun (port=0xaaaaf226d410) at postmaster.c:4409
#22 BackendStartup (port=0xaaaaf226d410) at postmaster.c:4081
#23 ServerLoop () at postmaster.c:1754
#24 0x0000aaaab65ab048 in PostmasterMain (argc=<optimized out>,
argv=<optimized out>) at postmaster.c:1362
#25 0x0000aaaab631e7cc in main (argc=3, argv=0xaaaaf2246f70) at main.c:228

Taking frame 6 at face value, it appears to be trying to call an empty
std::function (that's what the exception std::bad_function_call
means). No clue how or why though.

With LLVM 5.0 (from backports) it seemed to get further (?):

Program terminated with signal SIGABRT, Aborted.
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
51 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1 0x0000ffffa9642df4 in __GI_abort () at abort.c:89
#2 0x0000ffff9d306e40 in __gnu_cxx::__verbose_terminate_handler() ()
from /usr/lib/aarch64-linux-gnu/libstdc++.so.6
#3 0x0000ffff9d304d4c in ?? () from /usr/lib/aarch64-linux-gnu/libstdc++.so.6
#4 0x0000ffff9d304d98 in std::terminate() () from
/usr/lib/aarch64-linux-gnu/libstdc++.so.6
#5 0x0000ffff9d30501c in __cxa_throw () from
/usr/lib/aarch64-linux-gnu/libstdc++.so.6
#6 0x0000ffff9d32d4bc in std::__throw_bad_function_call() () from
/usr/lib/aarch64-linux-gnu/libstdc++.so.6
#7 0x0000ffff9eac7dc4 in ?? () from /usr/lib/aarch64-linux-gnu/libLLVM-5.0.so.1
#8 0x0000aaaadd2dced0 in ?? ()
#9 0x0000000040100401 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb)

Configure was run like this:

./configure \
--prefix=$HOME/install \
--enable-cassert \
--enable-debug \
--with-llvm \
CC="ccache gcc" \
CXX="ccache g++" \
CLANG="ccache /usr/lib/llvm-3.9/bin/clang" \
LLVM_CONFIG="/usr/lib/llvm-3.9/bin/llvm-config"

I can provide access to this thing if you think that'd be useful.

--
Thomas Munro
http://www.enterprisedb.com

#212Andres Freund
andres@anarazel.de
In reply to: Thomas Munro (#209)
Re: JIT compiling with LLVM v12.2

Hi,

On 2018-03-21 20:06:49 +1300, Thomas Munro wrote:

On Wed, Mar 21, 2018 at 4:07 PM, Andres Freund <andres@anarazel.de> wrote:

Indeed. I've pushed a rebased version now, that basically just fixes the
issue Thomas observed.

I set up a 32 bit i386 virtual machine and installed Debian 9.4.
Compiler warnings:

Was that with a 64bit CPU and 32bit OS, or actually a 32bit CPU?

gcc -Wall -Wmissing-prototypes -Wpointer-arith
-Wdeclaration-after-statement -Wendif-labels
-Wmissing-format-attribute -Wformat-security -fno-strict-aliasing
-fwrapv -fexcess-precision=standard -g -O2 -fPIC
-D__STDC_LIMIT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_CONSTANT_MACROS
-D_GNU_SOURCE -I/usr/lib/llvm-3.9/include -I../../../../src/include
-D_GNU_SOURCE -c -o llvmjit.o llvmjit.c
llvmjit.c: In function ‘llvm_get_function’:
llvmjit.c:268:10: warning: cast to pointer from integer of different
size [-Wint-to-pointer-cast]
return (void *) addr;
^
llvmjit.c:270:10: warning: cast to pointer from integer of different
size [-Wint-to-pointer-cast]
return (void *) addr;
^
llvmjit.c: In function ‘llvm_resolve_symbol’:
llvmjit.c:842:10: warning: cast from pointer to integer of different
size [-Wpointer-to-int-cast]
addr = (uint64_t) load_external_function(modname, funcname,
^
llvmjit.c:845:10: warning: cast from pointer to integer of different
size [-Wpointer-to-int-cast]
addr = (uint64_t) LLVMSearchForAddressOfSymbol(symname);
^

Hrmpf, those need to be fixed.

While trying out many combinations of versions of stuff on different
OSes, I found another way to screw up that I wanted to report here.
It's obvious that this is doomed if you know what's going on, but I
thought the failure mode was interesting enough to report here. There
is a hazard for people running systems where the vendor ships some
version (possibly a mystery version) of clang in the PATH but you have
to get LLVM separately (eg from ports/brew/whatever):

1. If you use macOS High Sierra's current /usr/bin/clang ("9.0.0"),
ie the default if you didn't set CLANG to something else when you ran
./configure, and you build against LLVM 3.9, then llvm-lto gives this
message during "make install":

Invalid summary version 3, 1 expected
error: can't create ModuleSummaryIndexObjectFile for buffer: Corrupted bitcode

Then it segfaults!

Gah, that's not desirable :/. It's fine that it doesn't work, but it'd
be better if it didn't segfault. I guess I could just try by corrupting
the file explicitly...

Neither of these cases should be too surprising, and users of those
operating systems can easily get a newer LLVM or an older -- it was
just interesting to see exactly what goes wrong and exactly when. I
suppose there could be a configure test to see if your $CLANG can play
nicely with your $LLVM_CONFIG.

Not precisely sure how. I think suggesting to use compatible clang is
going to be sufficient for most cases...

Greetings,

Andres Freund

#213Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Andres Freund (#212)
Re: JIT compiling with LLVM v12.2

On Thu, Mar 22, 2018 at 8:47 AM, Andres Freund <andres@anarazel.de> wrote:

On 2018-03-21 20:06:49 +1300, Thomas Munro wrote:

On Wed, Mar 21, 2018 at 4:07 PM, Andres Freund <andres@anarazel.de> wrote:

Indeed. I've pushed a rebased version now, that basically just fixes the
issue Thomas observed.

I set up a 32 bit i386 virtual machine and installed Debian 9.4.
Compiler warnings:

Was that with a 64bit CPU and 32bit OS, or actually a 32bit CPU?

64 bit CPU, 32 bit OS. I didn't try Debian multi-arch i386 support on
an amd64 system, but that's probably an easier way to do this if you
already have one of those...

--
Thomas Munro
http://www.enterprisedb.com

#214Andres Freund
andres@anarazel.de
In reply to: Catalin Iacob (#210)
Re: JIT compiling with LLVM v12.2

Hi,

On 2018-03-21 08:26:28 +0100, Catalin Iacob wrote:

On Wed, Mar 21, 2018 at 4:07 AM, Andres Freund <andres@anarazel.de> wrote:

Indeed. I've pushed a rebased version now, that basically just fixes the
issue Thomas observed.

Testing 2d6f2fba from your repository configured --with-llvm I noticed
some weird things in the configure output.

Thanks!

Without --enable-debug:
configure: using compiler=gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16)
configure: using CFLAGS=-Wall -Wmissing-prototypes -Wpointer-arith
-Wdeclaration-after-statement -Wendif-labels
-Wmissing-format-attribute -Wformat-security -fno-strict-aliasing
-fwrapv -fexcess-precision=standard -O2
configure: using CPPFLAGS= -D_GNU_SOURCE
configure: using LDFLAGS= -L/opt/rh/llvm-toolset-7/root/usr/lib64
-Wl,--as-needed
configure: using CXX=g++
configure: using CXXFLAGS=-Wall -Wpointer-arith -Wendif-labels
-Wmissing-format-attribute -Wformat-security -fno-strict-aliasing
-fwrapv -g -O2
configure: using CLANG=/opt/rh/llvm-toolset-7/root/usr/bin/clang
configure: using BITCODE_CFLAGS= -fno-strict-aliasing -fwrapv -O2
configure: using BITCODE_CXXFLAGS= -fno-strict-aliasing -fwrapv -O2
BITCODE_CXXFLAGS

With --enable-debug:
configure: using compiler=gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16)
configure: using CFLAGS=-Wall -Wmissing-prototypes -Wpointer-arith
-Wdeclaration-after-statement -Wendif-labels
-Wmissing-format-attribute -Wformat-security -fno-strict-aliasing
-fwrapv -fexcess-precision=standard -g -O2
configure: using CPPFLAGS= -D_GNU_SOURCE
configure: using LDFLAGS= -L/opt/rh/llvm-toolset-7/root/usr/lib64
-Wl,--as-needed
configure: using CXX=g++
configure: using CXXFLAGS=-Wall -Wpointer-arith -Wendif-labels
-Wmissing-format-attribute -Wformat-security -fno-strict-aliasing
-fwrapv -g -g -O2
configure: using CLANG=/opt/rh/llvm-toolset-7/root/usr/bin/clang
configure: using BITCODE_CFLAGS= -fno-strict-aliasing -fwrapv -O2
configure: using BITCODE_CXXFLAGS= -fno-strict-aliasing -fwrapv -O2
BITCODE_CXXFLAGS

So I unconditionally get one -g added to CXXFLAGS regardless of
whether I specify --enable-debug or not. And --enable-debug results in
-g -g in CXXFLAGS.

Aaah, nice catch. I was missing an unset CXXFLAGS.

BTW, you should probably specify -std=c++11 (or whatever you need) as
various g++ and clang++ versions default to various things. Will the
required C++ standard be based on the requirements of the C++ code in
the PG tree or will you take it from LLVM's CXXFLAGS?

It's currently already taken from LLVM's CXXFLAGS if present there, but
just specified for LLVM wrapping files. Relevant code is in
src/backend/jit/llvm/Makefile:

# All files in this directy link to LLVM.
CFLAGS += $(LLVM_CFLAGS)
CXXFLAGS += $(LLVM_CXXFLAGS)
override CPPFLAGS := $(LLVM_CPPFLAGS) $(CPPFLAGS)
SHLIB_LINK += $(LLVM_LIBS)

Since there's no other C++ code, and I don't forsee anything else, I'm
not planning to set the global CXXFLAGS differently atm. Would just make
it more complicated to use the right flag from llvm's CXXFLAGSS.

Can --std=c++11 and --std=c++14 compiled .o files be linked together?

Yes, with some limitations. In the PG case all the intra-file calls are
C ABI, there wouldn't be a problem.

Also, my CXXFLAGS did not get -fexcess-precision=standard neither did
BITCODE_CFLAGS nor BITCODE_CXXFLAGS.

Yea, that's to be expected, gcc doesn't know that for C++ on most
versions. Some vendors have it patched into.

2. Unlike all the other *FLAGS, BITCODE_CXXFLAGS includes itself on
the right hand side of the equal
configure: using BITCODE_CXXFLAGS= -fno-strict-aliasing -fwrapv -O2
BITCODE_CXXFLAGS

Hum, that's definitely a typo bug (missing $ when adding to
BITCODE_CXXFLAGS).

Greetings,

Andres Freund

#215Andres Freund
andres@anarazel.de
In reply to: Thomas Munro (#211)
Re: JIT compiling with LLVM v12.2

On 2018-03-21 23:10:27 +1300, Thomas Munro wrote:

On Wed, Mar 21, 2018 at 8:06 PM, Thomas Munro
<thomas.munro@enterprisedb.com> wrote:

On Wed, Mar 21, 2018 at 4:07 PM, Andres Freund <andres@anarazel.de> wrote:

Indeed. I've pushed a rebased version now, that basically just fixes the
issue Thomas observed.

I set up a 32 bit i386 virtual machine and installed Debian 9.4.

Next up, I have an arm64 system running Debian 9.4. It bombs in
"make check" and in simple tests:

Hum. Is it running a 32bit or 64 bit kernel/os?

Program received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
51 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1 0x0000ffff8f65adf4 in __GI_abort () at abort.c:89
#2 0x0000ffff83e2de40 in __gnu_cxx::__verbose_terminate_handler() ()
from /usr/lib/aarch64-linux-gnu/libstdc++.so.6
#3 0x0000ffff83e2bd4c in ?? () from /usr/lib/aarch64-linux-gnu/libstdc++.so.6
#4 0x0000ffff83e2bd98 in std::terminate() () from
/usr/lib/aarch64-linux-gnu/libstdc++.so.6
#5 0x0000ffff83e2c01c in __cxa_throw () from
/usr/lib/aarch64-linux-gnu/libstdc++.so.6
#6 0x0000ffff83e544bc in std::__throw_bad_function_call() () from
/usr/lib/aarch64-linux-gnu/libstdc++.so.6
#7 0x0000ffff85176a2c in LLVMOrcCreateInstance () from
/usr/lib/aarch64-linux-gnu/libLLVM-3.9.so.1
#8 0x0000ffff865c4db0 in llvm_session_initialize () at llvmjit.c:643
#9 llvm_create_context (jitFlags=9) at llvmjit.c:136
#10 0x0000ffff865cf8c8 in llvm_compile_expr (state=0xaaaaf2300208) at
llvmjit_expr.c:132

Hm.

With LLVM 5.0 (from backports) it seemed to get further (?):

Program terminated with signal SIGABRT, Aborted.
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
51 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1 0x0000ffffa9642df4 in __GI_abort () at abort.c:89
#2 0x0000ffff9d306e40 in __gnu_cxx::__verbose_terminate_handler() ()
from /usr/lib/aarch64-linux-gnu/libstdc++.so.6
#3 0x0000ffff9d304d4c in ?? () from /usr/lib/aarch64-linux-gnu/libstdc++.so.6
#4 0x0000ffff9d304d98 in std::terminate() () from
/usr/lib/aarch64-linux-gnu/libstdc++.so.6
#5 0x0000ffff9d30501c in __cxa_throw () from
/usr/lib/aarch64-linux-gnu/libstdc++.so.6
#6 0x0000ffff9d32d4bc in std::__throw_bad_function_call() () from
/usr/lib/aarch64-linux-gnu/libstdc++.so.6
#7 0x0000ffff9eac7dc4 in ?? () from /usr/lib/aarch64-linux-gnu/libLLVM-5.0.so.1
#8 0x0000aaaadd2dced0 in ?? ()
#9 0x0000000040100401 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb)

Configure was run like this:

./configure \
--prefix=$HOME/install \
--enable-cassert \
--enable-debug \
--with-llvm \
CC="ccache gcc" \
CXX="ccache g++" \
CLANG="ccache /usr/lib/llvm-3.9/bin/clang" \
LLVM_CONFIG="/usr/lib/llvm-3.9/bin/llvm-config"

I guess you'd swapped out 3.9 for 5.0?

I can provide access to this thing if you think that'd be useful.

Perhaps that's necessary. Before that though, could you check how the
backtrace looks with LLVM debug symbols installed?

Greetings,

Andres Freund

#216Andres Freund
andres@anarazel.de
In reply to: Thomas Munro (#213)
Re: JIT compiling with LLVM v12.2

Hi,

On 2018-03-22 09:00:19 +1300, Thomas Munro wrote:

On Thu, Mar 22, 2018 at 8:47 AM, Andres Freund <andres@anarazel.de> wrote:

On 2018-03-21 20:06:49 +1300, Thomas Munro wrote:

On Wed, Mar 21, 2018 at 4:07 PM, Andres Freund <andres@anarazel.de> wrote:

Indeed. I've pushed a rebased version now, that basically just fixes the
issue Thomas observed.

I set up a 32 bit i386 virtual machine and installed Debian 9.4.
Compiler warnings:

Was that with a 64bit CPU and 32bit OS, or actually a 32bit CPU?

64 bit CPU, 32 bit OS. I didn't try Debian multi-arch i386 support on
an amd64 system, but that's probably an easier way to do this if you
already have one of those...

Ah, then I think I might know what happend. Does it start to work if you
replace the auto-detected cpu with "x86"? I think what might happen is
that it generates 64bit code, because of the detected CPU name.

Let me set up a chroot, in this case I should be able to emulate this
pretty easily...

Greetings,

Andres Freund

#217Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Andres Freund (#215)
Re: JIT compiling with LLVM v12.2

On Thu, Mar 22, 2018 at 9:06 AM, Andres Freund <andres@anarazel.de> wrote:

On 2018-03-21 23:10:27 +1300, Thomas Munro wrote:

Next up, I have an arm64 system running Debian 9.4. It bombs in
"make check" and in simple tests:

Hum. Is it running a 32bit or 64 bit kernel/os?

checking size of void *... 8

./configure \
--prefix=$HOME/install \
--enable-cassert \
--enable-debug \
--with-llvm \
CC="ccache gcc" \
CXX="ccache g++" \
CLANG="ccache /usr/lib/llvm-3.9/bin/clang" \
LLVM_CONFIG="/usr/lib/llvm-3.9/bin/llvm-config"

I guess you'd swapped out 3.9 for 5.0?

Right, in the second backtrace I showed it was 5.0 (for both clang and
llvm-config).

I can provide access to this thing if you think that'd be useful.

Perhaps that's necessary. Before that though, could you check how the
backtrace looks with LLVM debug symbols installed?

After installing libllvm3.9-dgb:

(gdb) bt
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1 0x0000ffffa1ae1df4 in __GI_abort () at abort.c:89
#2 0x0000ffff9634ee40 in __gnu_cxx::__verbose_terminate_handler() ()
from /usr/lib/aarch64-linux-gnu/libstdc++.so.6
#3 0x0000ffff9634cd4c in ?? () from /usr/lib/aarch64-linux-gnu/libstdc++.so.6
#4 0x0000ffff9634cd98 in std::terminate() () from
/usr/lib/aarch64-linux-gnu/libstdc++.so.6
#5 0x0000ffff9634d01c in __cxa_throw () from
/usr/lib/aarch64-linux-gnu/libstdc++.so.6
#6 0x0000ffff963754bc in std::__throw_bad_function_call() () from
/usr/lib/aarch64-linux-gnu/libstdc++.so.6
warning: Could not find DWO CU
CMakeFiles/LLVMOrcJIT.dir/OrcCBindings.cpp.dwo(0x691f70a1d71f901d)
referenced by CU at offset 0x11ffa [in module
/usr/lib/debug/.build-id/09/04bb3e707305e175216a59bc3598c2b194775a.debug]
#7 0x0000ffff97697a2c in LLVMOrcCreateInstance () at
/usr/include/c++/6/functional:2126
#8 0x0000ffff98accdb0 in llvm_session_initialize () at llvmjit.c:643
#9 llvm_create_context (jitFlags=9) at llvmjit.c:136
#10 0x0000ffff98ad78c8 in llvm_compile_expr (state=0xaaaafce73208) at
llvmjit_expr.c:132
#11 0x0000aaaac1bd671c in ExecReadyExpr
(state=state@entry=0xaaaafce73208) at execExpr.c:627
#12 0x0000aaaac1bd97b8 in ExecBuildProjectionInfo
(targetList=<optimized out>, econtext=<optimized out>, slot=<optimized
out>, parent=parent@entry=0xaaaafce72de0,
inputDesc=inputDesc@entry=0x0) at execExpr.c:471
#13 0x0000aaaac1bec028 in ExecAssignProjectionInfo
(planstate=planstate@entry=0xaaaafce72de0,
inputDesc=inputDesc@entry=0x0) at execUtils.c:460
#14 0x0000aaaac1c08a28 in ExecInitResult
(node=node@entry=0xaaaafcdc11a0, estate=estate@entry=0xaaaafce72bc8,
eflags=eflags@entry=16) at nodeResult.c:221
#15 0x0000aaaac1be7828 in ExecInitNode (node=0xaaaafcdc11a0,
node@entry=0xaaaafcded630, estate=estate@entry=0xaaaafce72bc8,
eflags=eflags@entry=16) at execProcnode.c:164
#16 0x0000aaaac1be2a70 in InitPlan (eflags=16,
queryDesc=0xaaaafcde0808) at execMain.c:1051
#17 standard_ExecutorStart (queryDesc=0xaaaafcde0808, eflags=16) at
execMain.c:266
#18 0x0000aaaac1d39bec in PortalStart (portal=0x400,
portal@entry=0xaaaafce234d8, params=0x274580612ce0a285,
params@entry=0x0, eflags=43690, eflags@entry=0,
snapshot=0xaaaac1fa9f58, snapshot@entry=0x0) at pquery.c:520
#19 0x0000aaaac1d34b18 in exec_simple_query
(query_string=query_string@entry=0xaaaafcdbf3d8 "select 42;") at
postgres.c:1082
#20 0x0000aaaac1d366a8 in PostgresMain (argc=<optimized out>,
argv=argv@entry=0xaaaafcdebb90, dbname=<optimized out>,
username=<optimized out>) at postgres.c:4147
#21 0x0000aaaac1a28dd0 in BackendRun (port=0xaaaafcde0410) at postmaster.c:4409
#22 BackendStartup (port=0xaaaafcde0410) at postmaster.c:4081
#23 ServerLoop () at postmaster.c:1754
#24 0x0000aaaac1cb7048 in PostmasterMain (argc=<optimized out>,
argv=<optimized out>) at postmaster.c:1362
#25 0x0000aaaac1a2a7cc in main (argc=3, argv=0xaaaafcdb9f70) at main.c:228

GDB also printed a ton of messages like this for many LLVM .cpp files:

warning: Could not find DWO CU
CMakeFiles/LLVMLibDriver.dir/LibDriver.cpp.dwo(0x117022032f862080)
referenced by CU at offset 0x187da [in module
/usr/lib/debug/.build-id/09/04bb3e707305e175216a59bc3598c2b194775a.debug]
...

We can see that it's missing some debug info, any clues about that?
Here's LLVM 3.9's LLVMOrcCreateInstance function:

https://github.com/llvm-mirror/llvm/blob/6531c3164cb9edbfb9f4b43ca383810a94ca5aa0/lib/ExecutionEngine/Orc/OrcCBindings.cpp#L15

Without digging through more source code I'm not sure which line of
that is invoking our uninvocable std::function...

The server also prints this:

terminate called after throwing an instance of 'std::bad_function_call'
what(): bad_function_call

Aside from whatever problem is causing this, we can see that there is
no top-level handling of exceptions. That's probably fine if we are
in a no throw scenario (unless there is something seriously corrupted,
as is probably the case here), and it seems that we must be because
we're accessing this code via its C API.

--
Thomas Munro
http://www.enterprisedb.com

#218Noname
ilmari@ilmari.org
In reply to: Andres Freund (#212)
Re: JIT compiling with LLVM v12.2

Andres Freund <andres@anarazel.de> writes:

Hi,

On 2018-03-21 20:06:49 +1300, Thomas Munro wrote:

On Wed, Mar 21, 2018 at 4:07 PM, Andres Freund <andres@anarazel.de> wrote:

Indeed. I've pushed a rebased version now, that basically just fixes the
issue Thomas observed.

I set up a 32 bit i386 virtual machine and installed Debian 9.4.
Compiler warnings:

Was that with a 64bit CPU and 32bit OS, or actually a 32bit CPU?

gcc -Wall -Wmissing-prototypes -Wpointer-arith
-Wdeclaration-after-statement -Wendif-labels
-Wmissing-format-attribute -Wformat-security -fno-strict-aliasing
-fwrapv -fexcess-precision=standard -g -O2 -fPIC
-D__STDC_LIMIT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_CONSTANT_MACROS
-D_GNU_SOURCE -I/usr/lib/llvm-3.9/include -I../../../../src/include
-D_GNU_SOURCE -c -o llvmjit.o llvmjit.c
llvmjit.c: In function ‘llvm_get_function’:
llvmjit.c:268:10: warning: cast to pointer from integer of different
size [-Wint-to-pointer-cast]
return (void *) addr;
^
llvmjit.c:270:10: warning: cast to pointer from integer of different
size [-Wint-to-pointer-cast]
return (void *) addr;
^
llvmjit.c: In function ‘llvm_resolve_symbol’:
llvmjit.c:842:10: warning: cast from pointer to integer of different
size [-Wpointer-to-int-cast]
addr = (uint64_t) load_external_function(modname, funcname,
^
llvmjit.c:845:10: warning: cast from pointer to integer of different
size [-Wpointer-to-int-cast]
addr = (uint64_t) LLVMSearchForAddressOfSymbol(symname);
^

Hrmpf, those need to be fixed.

How about using uintptr_t is for this? I see configure.in includes
AC_TYPE_UINTPTR_T, which probes for an existing uintptr_t or defines it
as an alias for the appropriate unsinged (long (long)) int type.

- ilmari
--
- Twitter seems more influential [than blogs] in the 'gets reported in
the mainstream press' sense at least. - Matt McLeod
- That'd be because the content of a tweet is easier to condense down
to a mainstream media article. - Calle Dybedahl

#219Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Andres Freund (#216)
Re: JIT compiling with LLVM v12.2

On Thu, Mar 22, 2018 at 9:09 AM, Andres Freund <andres@anarazel.de> wrote:

Hi,

On 2018-03-22 09:00:19 +1300, Thomas Munro wrote:

64 bit CPU, 32 bit OS. I didn't try Debian multi-arch i386 support on
an amd64 system, but that's probably an easier way to do this if you
already have one of those...

Ah, then I think I might know what happend. Does it start to work if you
replace the auto-detected cpu with "x86"? I think what might happen is
that it generates 64bit code, because of the detected CPU name.

Hah, that makes sense. I tried setting cpu to "x86", and now it fails
differently:

Program terminated with signal SIGSEGV, Segmentation fault.
#0 malloc_printerr (action=3, str=0xb7682d00 "free(): invalid
pointer", ptr=0xae75f27b, ar_ptr=0xae700220
<llvm::SystemZ::GRX32BitRegClass>) at malloc.c:5036
5036 malloc.c: No such file or directory.
(gdb) bt
#0 malloc_printerr (action=3, str=0xb7682d00 "free(): invalid
pointer", ptr=0xae75f27b, ar_ptr=0xae700220
<llvm::SystemZ::GRX32BitRegClass>) at malloc.c:5036
#1 0xb7593806 in _int_free (av=0xae700220
<llvm::SystemZ::GRX32BitRegClass>, p=0xae75f273, have_lock=0) at
malloc.c:3905
#2 0xabd05cd8 in LLVMDisposeMessage () from
/usr/lib/i386-linux-gnu/libLLVM-3.9.so.1
#3 0xae75100b in llvm_session_initialize () at llvmjit.c:636
#4 llvm_create_context (jitFlags=15) at llvmjit.c:136
#5 0xae75d3e9 in llvm_compile_expr (state=0x2616e60) at llvmjit_expr.c:132
#6 0x00650118 in ExecReadyExpr (state=state@entry=0x2616e60) at execExpr.c:627
#7 0x00652dd7 in ExecInitExpr (node=0x2666bb4, parent=0x261693c) at
execExpr.c:144
...

--
Thomas Munro
http://www.enterprisedb.com

#220Andres Freund
andres@anarazel.de
In reply to: Thomas Munro (#219)
Re: JIT compiling with LLVM v12.2

On 2018-03-22 09:51:01 +1300, Thomas Munro wrote:

On Thu, Mar 22, 2018 at 9:09 AM, Andres Freund <andres@anarazel.de> wrote:

Hi,

On 2018-03-22 09:00:19 +1300, Thomas Munro wrote:

64 bit CPU, 32 bit OS. I didn't try Debian multi-arch i386 support on
an amd64 system, but that's probably an easier way to do this if you
already have one of those...

Ah, then I think I might know what happend. Does it start to work if you
replace the auto-detected cpu with "x86"? I think what might happen is
that it generates 64bit code, because of the detected CPU name.

Hah, that makes sense. I tried setting cpu to "x86", and now it fails
differently:

Did you change the variable, or replace the value that's passed to the
LLVMCreateTargetMachine() calls? If you did the former, the error
wouldn't be surprising, because
LLVMDisposeMessage(cpu);
cpu = NULL;
will attempt to free the return value of LLVMGetHostCPUName(), which'll
obviously not work if you just set to a constant.

#1 0xb7593806 in _int_free (av=0xae700220
<llvm::SystemZ::GRX32BitRegClass>, p=0xae75f273, have_lock=0) at
malloc.c:3905
#2 0xabd05cd8 in LLVMDisposeMessage () from
/usr/lib/i386-linux-gnu/libLLVM-3.9.so.1
#3 0xae75100b in llvm_session_initialize () at llvmjit.c:636
#4 llvm_create_context (jitFlags=15) at llvmjit.c:136
#5 0xae75d3e9 in llvm_compile_expr (state=0x2616e60) at llvmjit_expr.c:132
#6 0x00650118 in ExecReadyExpr (state=state@entry=0x2616e60) at execExpr.c:627
#7 0x00652dd7 in ExecInitExpr (node=0x2666bb4, parent=0x261693c) at
execExpr.c:144
...

FWIW, a 32bit chroot, on a 64bit kernel works:

2018-03-21 20:57:56.576 UTC [3708] DEBUG: successfully loaded LLVM in current session
2018-03-21 20:57:56.577 UTC [3708] DEBUG: JIT detected CPU "skylake", with features "+sse2,+cx16,-tbm,-avx512ifma,-avx512dq,-fma4,+prfchw,+bmi2,+xsavec,+fsgsbase,+popcnt,+aes,-pcommit,+xsaves,-avx512er,-clwb,-avx512f,-pku,+smap,+mmx,-xop,+rdseed,+hle,-sse4a,-avx512bw,+clflushopt,+xsave,-avx512vl,+invpcid,-avx512cd,+avx,+rtm,+fma,+bmi,-mwaitx,+rdrnd,+sse4.1,+sse4.2,+avx2,+sse,+lzcnt,+pclmul,-prefetchwt1,+f16c,+ssse3,+sgx,+cmov,-avx512vbmi,+movbe,+xsaveopt,-sha,+adx,-avx512pf,+sse3"
2018-03-21 20:57:56.579 UTC [3708] DEBUG: time to inline: 0.000s, opt: 0.000s, emit: 0.002s

that's debian testing though.

Greetings,

Andres Freund

#221Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Andres Freund (#220)
Re: JIT compiling with LLVM v12.2

On Thu, Mar 22, 2018 at 9:59 AM, Andres Freund <andres@anarazel.de> wrote:

On 2018-03-22 09:51:01 +1300, Thomas Munro wrote:

Hah, that makes sense. I tried setting cpu to "x86", and now it fails
differently:

Did you change the variable, or replace the value that's passed to the
LLVMCreateTargetMachine() calls? If you did the former, the error
wouldn't be surprising, because
LLVMDisposeMessage(cpu);
cpu = NULL;
will attempt to free the return value of LLVMGetHostCPUName(), which'll
obviously not work if you just set to a constant.

Duh. Right.

FWIW, a 32bit chroot, on a 64bit kernel works:

2018-03-21 20:57:56.576 UTC [3708] DEBUG: successfully loaded LLVM in current session
2018-03-21 20:57:56.577 UTC [3708] DEBUG: JIT detected CPU "skylake", with features "+sse2,+cx16,-tbm,-avx512ifma,-avx512dq,-fma4,+prfchw,+bmi2,+xsavec,+fsgsbase,+popcnt,+aes,-pcommit,+xsaves,-avx512er,-clwb,-avx512f,-pku,+smap,+mmx,-xop,+rdseed,+hle,-sse4a,-avx512bw,+clflushopt,+xsave,-avx512vl,+invpcid,-avx512cd,+avx,+rtm,+fma,+bmi,-mwaitx,+rdrnd,+sse4.1,+sse4.2,+avx2,+sse,+lzcnt,+pclmul,-prefetchwt1,+f16c,+ssse3,+sgx,+cmov,-avx512vbmi,+movbe,+xsaveopt,-sha,+adx,-avx512pf,+sse3"
2018-03-21 20:57:56.579 UTC [3708] DEBUG: time to inline: 0.000s, opt: 0.000s, emit: 0.002s

that's debian testing though.

Hmm. So now I'm doing this:

        llvm_opt0_targetmachine =
-               LLVMCreateTargetMachine(llvm_targetref, llvm_triple,
cpu, features,
+               LLVMCreateTargetMachine(llvm_targetref, llvm_triple,
"x86" /*cpu*/, "" /*features*/,

LLVMCodeGenLevelNone,

LLVMRelocDefault,

LLVMCodeModelJITDefault);
        llvm_opt3_targetmachine =
-               LLVMCreateTargetMachine(llvm_targetref, llvm_triple,
cpu, features,
+               LLVMCreateTargetMachine(llvm_targetref, llvm_triple,
"x86" /*cpu*/, "" /*features*/,

LLVMCodeGenLevelAggressive,

LLVMRelocDefault,

LLVMCodeModelJITDefault);

And I'm still getting a segfault:

(gdb)
#0 0xac22c453 in llvm::SelectionDAG::getNode(unsigned int,
llvm::SDLoc const&, llvm::EVT, llvm::SDValue) () at
/build/llvm-toolchain-3.9-UOOPrK/llvm-toolchain-3.9-3.9.1/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:2898
#1 0xac269c29 in llvm::TargetLowering::SimplifySetCC(llvm::EVT,
llvm::SDValue, llvm::SDValue, llvm::ISD::CondCode, bool,
llvm::TargetLowering::DAGCombinerInfo&, llvm::SDLoc const&) const ()
at /build/llvm-toolchain-3.9-UOOPrK/llvm-toolchain-3.9-3.9.1/lib/CodeGen/SelectionDAG/TargetLowering.cpp:1480
#2 0xac1163a8 in (anonymous
namespace)::DAGCombiner::visit(llvm::SDNode*) () at
/build/llvm-toolchain-3.9-UOOPrK/llvm-toolchain-3.9-3.9.1/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:14438
#3 0xac117f0b in (anonymous
namespace)::DAGCombiner::combine(llvm::SDNode*) () at
/build/llvm-toolchain-3.9-UOOPrK/llvm-toolchain-3.9-3.9.1/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1449
#4 0xac11930e in llvm::SelectionDAG::Combine(llvm::CombineLevel,
llvm::AAResults&, llvm::CodeGenOpt::Level) () at
/build/llvm-toolchain-3.9-UOOPrK/llvm-toolchain-3.9-3.9.1/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1303
#5 0xac245cec in llvm::SelectionDAGISel::CodeGenAndEmitDAG() () at
/build/llvm-toolchain-3.9-UOOPrK/llvm-toolchain-3.9-3.9.1/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:755
#6 0xac246239 in
llvm::SelectionDAGISel::SelectBasicBlock(llvm::ilist_iterator<llvm::Instruction
const>, llvm::ilist_iterator<llvm::Instruction const>, bool&) ()
at /build/llvm-toolchain-3.9-UOOPrK/llvm-toolchain-3.9-3.9.1/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:679
#7 0xac24d66f in
llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) ()
at /build/llvm-toolchain-3.9-UOOPrK/llvm-toolchain-3.9-3.9.1/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1482
#8 0xac25073c in
llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&)
() at /build/llvm-toolchain-3.9-UOOPrK/llvm-toolchain-3.9-3.9.1/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:500
#9 0xad34f414 in (anonymous
namespace)::X86DAGToDAGISel::runOnMachineFunction(llvm::MachineFunction&)
() at /build/llvm-toolchain-3.9-UOOPrK/llvm-toolchain-3.9-3.9.1/lib/Target/X86/X86ISelDAGToDAG.cpp:175
#10 0xabf53019 in
llvm::MachineFunctionPass::runOnFunction(llvm::Function&) () at
/build/llvm-toolchain-3.9-UOOPrK/llvm-toolchain-3.9-3.9.1/lib/CodeGen/MachineFunctionPass.cpp:60
#11 0xabde8aeb in llvm::FPPassManager::runOnFunction(llvm::Function&)
() at /build/llvm-toolchain-3.9-UOOPrK/llvm-toolchain-3.9-3.9.1/lib/IR/LegacyPassManager.cpp:1526
#12 0xabde8e35 in llvm::FPPassManager::runOnModule(llvm::Module&) ()
at /build/llvm-toolchain-3.9-UOOPrK/llvm-toolchain-3.9-3.9.1/lib/IR/LegacyPassManager.cpp:1547
#13 0xabde919a in llvm::legacy::PassManagerImpl::run(llvm::Module&) ()
at /build/llvm-toolchain-3.9-UOOPrK/llvm-toolchain-3.9-3.9.1/lib/IR/LegacyPassManager.cpp:1603
#14 0xabde937f in llvm::legacy::PassManager::run(llvm::Module&) () at
/build/llvm-toolchain-3.9-UOOPrK/llvm-toolchain-3.9-3.9.1/lib/IR/LegacyPassManager.cpp:1737
#15 0xacb353de in
std::_Function_handler<llvm::object::OwningBinary<llvm::object::ObjectFile>
(llvm::Module&), llvm::orc::SimpleCompiler>::_M_invoke(std::_Any_data
const&, llvm::Module&) ()
at /build/llvm-toolchain-3.9-UOOPrK/llvm-toolchain-3.9-3.9.1/include/llvm/ExecutionEngine/Orc/CompileUtils.h:42
#16 0xacb30d00 in
std::_List_iterator<std::unique_ptr<llvm::orc::ObjectLinkingLayerBase::LinkedObjectSet,
std::default_delete<llvm::orc::ObjectLinkingLayerBase::LinkedObjectSet>

llvm::orc::IRCompileLayer<llvm::orc::ObjectLinkingLayer<llvm::orc::DoNothingOnNotifyLoaded>

::addModuleSet<std::vector<llvm::Module*,

std::allocator<llvm::Module*> >,
std::unique_ptr<llvm::RuntimeDyld::MemoryManager,
std::default_delete<llvm::RuntimeDyld::MemoryManager> >,
std::unique_ptr<llvm::RuntimeDyld::SymbolResolver,
std::default_delete<llvm::RuntimeDyld::SymbolResolver> >

(std::vector<llvm::Module*, std::allocator<llvm::Module*> >,

std::unique_ptr<llvm::RuntimeDyld::MemoryManager,
std::default_delete<llvm::RuntimeDyld::MemoryManager> >,
std::unique_ptr<llvm::RuntimeDyld::SymbolResolver,
std::default_delete<llvm::RuntimeDyld::SymbolResolver> >) () at
/usr/include/c++/6/functional:2127
#17 0xacb314f8 in unsigned int
llvm::OrcCBindingsStack::addIRModule<llvm::orc::IRCompileLayer<llvm::orc::ObjectLinkingLayer<llvm::orc::DoNothingOnNotifyLoaded>

(llvm::orc::IRCompileLayer<llvm::orc::ObjectLinkingLayer<llvm::orc::DoNothingOnNotifyLoaded>

&, llvm::Module*, std::unique_ptr<llvm::RuntimeDyld::MemoryManager,

std::default_delete<llvm::RuntimeDyld::MemoryManager> >, unsigned long
long (*)(char const*, void*), void*) ()
at /build/llvm-toolchain-3.9-UOOPrK/llvm-toolchain-3.9-3.9.1/lib/ExecutionEngine/Orc/OrcCBindingsStack.h:190
#18 0xacb318d5 in LLVMOrcAddEagerlyCompiledIR () at
/build/llvm-toolchain-3.9-UOOPrK/llvm-toolchain-3.9-3.9.1/lib/ExecutionEngine/Orc/OrcCBindingsStack.h:208
#19 0xae7b43f4 in llvm_compile_module (context=0x2438444) at llvmjit.c:539
#20 llvm_get_function (context=0x2438444, funcname=0x2542b00
"evalexpr_2_3") at llvmjit.c:244
#21 0xae7bc34e in ExecRunCompiledExpr (state=0x247d634,
econtext=0x247c10c, isNull=0xbfadf6ae "~") at llvmjit_expr.c:2563
#22 0x006b3e10 in ExecEvalExprSwitchContext (isNull=0xbfadf6ae "~",
econtext=<optimized out>, state=0x247d634) at
../../../src/include/executor/executor.h:305
#23 ExecQual (econtext=<optimized out>, state=0x247d634) at
../../../src/include/executor/executor.h:374
#24 ExecNestLoop (pstate=<optimized out>) at nodeNestloop.c:214
#25 0x006b6ddd in ExecProcNode (node=0x247c080) at
../../../src/include/executor/executor.h:239
#26 ExecSort (pstate=0x247bff4) at nodeSort.c:107
#27 0x0068c9d2 in ExecProcNode (node=0x247bff4) at
../../../src/include/executor/executor.h:239
#28 ExecutePlan (execute_once=<optimized out>, dest=0x0,
direction=NoMovementScanDirection, numberTuples=<optimized out>,
sendTuples=<optimized out>, operation=CMD_SELECT,
use_parallel_mode=<optimized out>, planstate=0x247bff4,
estate=0x247bee8) at execMain.c:1729
#29 standard_ExecutorRun (queryDesc=0x23e1a50,
direction=ForwardScanDirection, count=0, execute_once=1 '\001') at
execMain.c:365
#30 0x007f1e8d in PortalRunSelect (portal=portal@entry=0x240bf58,
forward=forward@entry=1 '\001', count=0, count@entry=2147483647,
dest=0x25383c0) at pquery.c:932
#31 0x007f36a0 in PortalRun (portal=0x240bf58, count=2147483647,
isTopLevel=1 '\001', run_once=1 '\001', dest=0x25383c0,
altdest=0x25383c0, completionTag=0xbfadf940 "") at pquery.c:773
#32 0x007ee8a7 in exec_simple_query
(query_string=query_string@entry=0x23be628 "SELECT '' AS tf_12_ff_4,
BOOLTBL1.*, BOOLTBL2.*\n FROM BOOLTBL1, BOOLTBL2\n WHERE
BOOLTBL2.f1 = BOOLTBL1.f1 or BOOLTBL1.f1 = bool 'true'\n ORDER BY
BOOLTBL1.f1, BOOLTBL2.f1;")
at postgres.c:1121
#33 0x007f070e in PostgresMain (argc=1, argv=0x23e7c44,
dbname=<optimized out>, username=0x23e7aa0 "munro") at postgres.c:4147
#34 0x004c0cff in BackendRun (port=0x23e1518) at postmaster.c:4409
#35 BackendStartup (port=0x23e1518) at postmaster.c:4081
#36 ServerLoop () at postmaster.c:1754
#37 0x0076a68f in PostmasterMain (argc=<optimized out>,
argv=<optimized out>) at postmaster.c:1362
#38 0x004c275a in main (argc=<optimized out>, argv=<optimized out>) at
main.c:228

I wonder what I'm doing wrong... what you're doing is very similar,
right? It's a 32 bit user land on a 64 bit kernel whereas mine is a
32 bit user land on a 32 bit kernel (on a 64 bit CPU).

--
Thomas Munro
http://www.enterprisedb.com

#222Andres Freund
andres@anarazel.de
In reply to: Thomas Munro (#221)
Re: JIT compiling with LLVM v12.2

Hi,

On 2018-03-22 10:09:23 +1300, Thomas Munro wrote:

FWIW, a 32bit chroot, on a 64bit kernel works:

2018-03-21 20:57:56.576 UTC [3708] DEBUG: successfully loaded LLVM in current session
2018-03-21 20:57:56.577 UTC [3708] DEBUG: JIT detected CPU "skylake", with features "+sse2,+cx16,-tbm,-avx512ifma,-avx512dq,-fma4,+prfchw,+bmi2,+xsavec,+fsgsbase,+popcnt,+aes,-pcommit,+xsaves,-avx512er,-clwb,-avx512f,-pku,+smap,+mmx,-xop,+rdseed,+hle,-sse4a,-avx512bw,+clflushopt,+xsave,-avx512vl,+invpcid,-avx512cd,+avx,+rtm,+fma,+bmi,-mwaitx,+rdrnd,+sse4.1,+sse4.2,+avx2,+sse,+lzcnt,+pclmul,-prefetchwt1,+f16c,+ssse3,+sgx,+cmov,-avx512vbmi,+movbe,+xsaveopt,-sha,+adx,-avx512pf,+sse3"
2018-03-21 20:57:56.579 UTC [3708] DEBUG: time to inline: 0.000s, opt: 0.000s, emit: 0.002s

that's debian testing though.

Hmm. So now I'm doing this:

I've now reproduced this. It actually only fails for *some*
queries, a good number works. Investigating.

As a random aside, our costing is fairly ridiculous here:
┌──────────────────────────────────────────────────────────────────────────────┐
│ QUERY PLAN │
├──────────────────────────────────────────────────────────────────────────────┤
│ Sort (cost=1088314.21..1103119.40 rows=5922075 width=34) │
│ Sort Key: booltbl1.f1, booltbl2.f1 │
│ -> Nested Loop (cost=0.00..118524.73 rows=5922075 width=34) │
│ Join Filter: ((booltbl2.f1 = booltbl1.f1) OR booltbl1.f1) │
│ -> Seq Scan on booltbl1 (cost=0.00..38.10 rows=2810 width=1) │
│ -> Materialize (cost=0.00..52.15 rows=2810 width=1) │
│ -> Seq Scan on booltbl2 (cost=0.00..38.10 rows=2810 width=1) │
│ JIT: │
│ Functions: 6 │
│ Inlining: true │
│ Optimization: true │
└──────────────────────────────────────────────────────────────────────────────┘

I wonder what I'm doing wrong... what you're doing is very similar,
right? It's a 32 bit user land on a 64 bit kernel whereas mine is a
32 bit user land on a 32 bit kernel (on a 64 bit CPU).

I think it's I that did something wrong not you. And the architecture
thing is a non-issue, because we're taking the target triple from the
right place. I think it's a separate issue. Notably the generated code
is apparently corrupt, when reading in the generated bitcode:

$ opt-6.0 -O3 -S < /tmp/data/6814.1.bc|less
opt-6.0: <stdin>: error: Invalid record (Producer: 'LLVM6.0.0' Reader: 'LLVM 6.0.0')

I suspect there's a 32bit vs 64bit confusion in the expression code
somewhere, might've accidentally used a 64bit type for Datum somewhere
or such. Will compile an LLVM with assertions enabled, to figure this
out (which verifies this kinda thing).

Greetings,

Andres Freund

#223Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#222)
Re: JIT compiling with LLVM v12.2

Hi,

On 2018-03-21 14:21:01 -0700, Andres Freund wrote:

I think it's I that did something wrong not you. And the architecture
thing is a non-issue, because we're taking the target triple from the
right place. I think it's a separate issue. Notably the generated code
is apparently corrupt, when reading in the generated bitcode:

$ opt-6.0 -O3 -S < /tmp/data/6814.1.bc|less
opt-6.0: <stdin>: error: Invalid record (Producer: 'LLVM6.0.0' Reader: 'LLVM 6.0.0')

I suspect there's a 32bit vs 64bit confusion in the expression code
somewhere, might've accidentally used a 64bit type for Datum somewhere
or such. Will compile an LLVM with assertions enabled, to figure this
out (which verifies this kinda thing).

Yup, that's it. Found it by searching for 64bit references, while LLVM
was compiling. I've pushed quickfixes (for the 32 warnings, as well as
for the 32bit x86 issue, as for configure typos).

Passes
PGOPTIONS='-c jit_above_cost=0' make -s check
now.

I'll still run 32bit through an LLVM w/ assert run once finished (takes
~30min to compile LLVM).

Greetings,

Andres Freund

#224Andres Freund
andres@anarazel.de
In reply to: Thomas Munro (#211)
Re: JIT compiling with LLVM v12.2

Hi,

On 2018-03-21 23:10:27 +1300, Thomas Munro wrote:

Next up, I have an arm64 system running Debian 9.4. It bombs in
"make check" and in simple tests:

Any chance you could try w/ LLVM 6? It looks like some parts of ORC
only got aarch64 in LLVM 6. I didn't *think* those were necessary, but
given the backtrace it looks like that still might be relevant.

Greetings,

Andres Freund

#225Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Andres Freund (#223)
Re: JIT compiling with LLVM v12.2

On Thu, Mar 22, 2018 at 10:36 AM, Andres Freund <andres@anarazel.de> wrote:

On 2018-03-21 14:21:01 -0700, Andres Freund wrote:

I think it's I that did something wrong not you. And the architecture
thing is a non-issue, because we're taking the target triple from the
right place. I think it's a separate issue. Notably the generated code
is apparently corrupt, when reading in the generated bitcode:

$ opt-6.0 -O3 -S < /tmp/data/6814.1.bc|less
opt-6.0: <stdin>: error: Invalid record (Producer: 'LLVM6.0.0' Reader: 'LLVM 6.0.0')

I suspect there's a 32bit vs 64bit confusion in the expression code
somewhere, might've accidentally used a 64bit type for Datum somewhere
or such. Will compile an LLVM with assertions enabled, to figure this
out (which verifies this kinda thing).

Yup, that's it. Found it by searching for 64bit references, while LLVM
was compiling. I've pushed quickfixes (for the 32 warnings, as well as
for the 32bit x86 issue, as for configure typos).

Looks good here too.

--
Thomas Munro
http://www.enterprisedb.com

#226Andres Freund
andres@anarazel.de
In reply to: Thomas Munro (#217)
Re: JIT compiling with LLVM v12.2

Hi,

On 2018-03-22 09:31:12 +1300, Thomas Munro wrote:

Aside from whatever problem is causing this, we can see that there is
no top-level handling of exceptions. That's probably fine if we are
in a no throw scenario (unless there is something seriously corrupted,
as is probably the case here), and it seems that we must be because
we're accessing this code via its C API.

Yea, it should only happen in abort() type situations. Notably LLVM
doesn't even default to enabling exceptions...

Greetings,

Andres Freund

#227Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Andres Freund (#224)
Re: JIT compiling with LLVM v12.2

On Thu, Mar 22, 2018 at 10:44 AM, Andres Freund <andres@anarazel.de> wrote:

On 2018-03-21 23:10:27 +1300, Thomas Munro wrote:

Next up, I have an arm64 system running Debian 9.4. It bombs in
"make check" and in simple tests:

Any chance you could try w/ LLVM 6? It looks like some parts of ORC
only got aarch64 in LLVM 6. I didn't *think* those were necessary, but
given the backtrace it looks like that still might be relevant.

Hmm. There is no LLVM 6 in backports. I'll have to build it, which
I'm happy to do if I can wrap my brain around its cmake build system
(or for you to build it if you want), but it may take... who knows, a
day? on this little thing.

If that turns out to be it I guess we'd need to figure out how to
detect an LLVM with bits missing hand handle it more gracefully?

--
Thomas Munro
http://www.enterprisedb.com

#228Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Thomas Munro (#227)
Re: JIT compiling with LLVM v12.2

On Thu, Mar 22, 2018 at 10:50 AM, Thomas Munro
<thomas.munro@enterprisedb.com> wrote:

On Thu, Mar 22, 2018 at 10:44 AM, Andres Freund <andres@anarazel.de> wrote:

On 2018-03-21 23:10:27 +1300, Thomas Munro wrote:

Next up, I have an arm64 system running Debian 9.4. It bombs in
"make check" and in simple tests:

Any chance you could try w/ LLVM 6? It looks like some parts of ORC
only got aarch64 in LLVM 6. I didn't *think* those were necessary, but
given the backtrace it looks like that still might be relevant.

Hmm. There is no LLVM 6 in backports. I'll have to build it, which
I'm happy to do if I can wrap my brain around its cmake build system
(or for you to build it if you want), but it may take... who knows, a
day? on this little thing.

Actually scratch that, I'll just install buster. More soon.

--
Thomas Munro
http://www.enterprisedb.com

#229Andres Freund
andres@anarazel.de
In reply to: Thomas Munro (#227)
Re: JIT compiling with LLVM v12.2

On 2018-03-22 10:50:52 +1300, Thomas Munro wrote:

On Thu, Mar 22, 2018 at 10:44 AM, Andres Freund <andres@anarazel.de> wrote:

On 2018-03-21 23:10:27 +1300, Thomas Munro wrote:

Next up, I have an arm64 system running Debian 9.4. It bombs in
"make check" and in simple tests:

Any chance you could try w/ LLVM 6? It looks like some parts of ORC
only got aarch64 in LLVM 6. I didn't *think* those were necessary, but
given the backtrace it looks like that still might be relevant.

Hmm. There is no LLVM 6 in backports.

I think there now is:
https://packages.debian.org/search?keywords=llvm&amp;searchon=names&amp;section=all&amp;suite=stretch-backports

Package llvm-6.0-dev

stretch-backports (devel): Modular compiler and toolchain technologies, libraries and headers
1:6.0-1~bpo9+1: amd64

It's a recent addition:

llvm-toolchain-6.0 (1:6.0-1~bpo9+1) stretch-backports; urgency=medium

* Team upload
* Rebuild for stretch-backports.

-- Anton Gladky <gladk@debian.org> Mon, 12 Mar 2018 18:58:43 +0100

Otherwise I think LLVM has a repo with the necessary bits:
http://apt.llvm.org/

But if it's not this, I think we're going to have to indeed build
LLVM. Without proper debugging symbols it's going to be hard to figure
this out otherwise.

FWIW, I build it with:

mkdir -p ~/build/llvm/debug/vpath
cd ~/build/llvm/debug/vpath
cmake -G Ninja ~/src/llvm/ -DCMAKE_INSTALL_PREFIX=/home/andres/build/llvm/debug/install -DBUILD_SHARED_LIBS=true -DLLVM_TARGETS_TO_BUILD='X86;BPF' -DLLVM_CCACHE_BUILD=true
ninja -j8 install

I suspect you'd need to replace X86 with AArch64 (BPF isn't needed,
that's for stuff unrelated to PG).

If that turns out to be it I guess we'd need to figure out how to
detect an LLVM with bits missing hand handle it more gracefully?

Yea :/.

Greetings,

Andres Freund

#230Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Andres Freund (#229)
Re: JIT compiling with LLVM v12.2

On Thu, Mar 22, 2018 at 10:59 AM, Andres Freund <andres@anarazel.de> wrote:

On 2018-03-22 10:50:52 +1300, Thomas Munro wrote:

Hmm. There is no LLVM 6 in backports.

I think there now is:
https://packages.debian.org/search?keywords=llvm&amp;searchon=names&amp;section=all&amp;suite=stretch-backports

Package llvm-6.0-dev

stretch-backports (devel): Modular compiler and toolchain technologies, libraries and headers
1:6.0-1~bpo9+1: amd64

It's a recent addition:

llvm-toolchain-6.0 (1:6.0-1~bpo9+1) stretch-backports; urgency=medium

* Team upload
* Rebuild for stretch-backports.

-- Anton Gladky <gladk@debian.org> Mon, 12 Mar 2018 18:58:43 +0100

Huh, it hasn't made it to my mirror yet.

Anyway, I upgraded and built with LLVM 6 and make check now passes on
my arm64 system. Woohoo!

Via an off-list exchange I learned that Andres suspects a bug in LLVM
3.9 on arm64 and will investigate/maybe file a bug report with LLVM.
Not sure if we'll want to try to actively identify and avoid known
buggy versions or not?

--
Thomas Munro
http://www.enterprisedb.com

#231Andres Freund
andres@anarazel.de
In reply to: Thomas Munro (#230)
Re: JIT compiling with LLVM v12.2

Hi,

On 2018-03-22 11:36:47 +1300, Thomas Munro wrote:

On Thu, Mar 22, 2018 at 10:59 AM, Andres Freund <andres@anarazel.de> wrote:

On 2018-03-22 10:50:52 +1300, Thomas Munro wrote:

Hmm. There is no LLVM 6 in backports.

I think there now is:
https://packages.debian.org/search?keywords=llvm&amp;searchon=names&amp;section=all&amp;suite=stretch-backports

Package llvm-6.0-dev

stretch-backports (devel): Modular compiler and toolchain technologies, libraries and headers
1:6.0-1~bpo9+1: amd64

It's a recent addition:

llvm-toolchain-6.0 (1:6.0-1~bpo9+1) stretch-backports; urgency=medium

* Team upload
* Rebuild for stretch-backports.

-- Anton Gladky <gladk@debian.org> Mon, 12 Mar 2018 18:58:43 +0100

Huh, it hasn't made it to my mirror yet.

Interesting.

Anyway, I upgraded and built with LLVM 6 and make check now passes on
my arm64 system. Woohoo!

Yay, thanks for testing!

Via an off-list exchange I learned that Andres suspects a bug in LLVM
3.9 on arm64 and will investigate/maybe file a bug report with LLVM.
Not sure if we'll want to try to actively identify and avoid known
buggy versions or not?

I'm currently not inclined to invest a lot of effort into it, besides
trying to get the bug fixed.

A possible testcase would be to call
createLocalIndirectStubsManagerBuilder() and report an error if it
returns nullptr. But that'd fail once the bug is fixed, because we don't
actually *need* that functionality, it's just that LLVM instantiates the
stub manager unconditionally for some reason.

Greetings,

Andres Freund

#232Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Andres Freund (#231)
Re: JIT compiling with LLVM v12.2

On Thu, Mar 22, 2018 at 11:46 AM, Andres Freund <andres@anarazel.de> wrote:

On 2018-03-22 11:36:47 +1300, Thomas Munro wrote:

Not sure if we'll want to try to actively identify and avoid known
buggy versions or not?

I'm currently not inclined to invest a lot of effort into it, besides
trying to get the bug fixed.

A possible testcase would be to call
createLocalIndirectStubsManagerBuilder() and report an error if it
returns nullptr. But that'd fail once the bug is fixed, because we don't
actually *need* that functionality, it's just that LLVM instantiates the
stub manager unconditionally for some reason.

So how about we test createLocalIndirectStubsManagerBuilder(), and if
it's nullptr then we also test the LLVM version number? For each
major release (3.9, 4.0, 5.0, ... you can see that they did the same
kind of versioning schema change that we did!) there will eventually
be a minor/patch release number where this works even when nullptr is
returned here.

This problem is going to come up on any architecture not covered in
the following code, namely anything but x86, x86_64 and (since 6.0)
aarch64 (aka arm64), so we definitely don't want to leave JIT disabled
once that bug is fixed:

https://github.com/llvm-mirror/llvm/blob/release_39/lib/ExecutionEngine/Orc/IndirectionUtils.cpp#L48
https://github.com/llvm-mirror/llvm/blob/release_60/lib/ExecutionEngine/Orc/IndirectionUtils.cpp#L48

--
Thomas Munro
http://www.enterprisedb.com

#233Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Thomas Munro (#209)
Re: JIT compiling with LLVM v12.2

On Wed, Mar 21, 2018 at 8:06 PM, Thomas Munro
<thomas.munro@enterprisedb.com> wrote:

"make -C src/interfaces/ecpg/test check" consistently fails on my macOS machine:

test compat_oracle/char_array ... stderr source FAILED

I can't reproduce this anymore on the tip of your jit branch. I don't
know what caused it or which change fixed it...

I've now run out of things to complain about for now. Nice work!

--
Thomas Munro
http://www.enterprisedb.com

#234Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Thomas Munro (#233)
Re: JIT compiling with LLVM v12.2

On Thu, Mar 22, 2018 at 1:36 PM, Thomas Munro
<thomas.munro@enterprisedb.com> wrote:

I've now run out of things to complain about for now. Nice work!

I jumped on a POWER8 box. As expected, the same breakage occurs. So
I hacked LLVM 6.0 thusly:

diff --git a/lib/ExecutionEngine/Orc/IndirectionUtils.cpp
b/lib/ExecutionEngine/Orc/IndirectionUtils.cpp
index 68397be..08aa3a8 100644
--- a/lib/ExecutionEngine/Orc/IndirectionUtils.cpp
+++ b/lib/ExecutionEngine/Orc/IndirectionUtils.cpp
@@ -54,7 +54,11 @@ createLocalCompileCallbackManager(const Triple &T,
 std::function<std::unique_ptr<IndirectStubsManager>()>
 createLocalIndirectStubsManagerBuilder(const Triple &T) {
   switch (T.getArch()) {
-    default: return nullptr;
+    default:
+      return [](){
+        return llvm::make_unique<
+                       orc::LocalIndirectStubsManager<orc::OrcGenericABI>>();
+      };

case Triple::aarch64:
return [](){

I am not qualified to have an opinion on whether this is the correct
fix for LLVM, but with this change our make check passes, indicating
that things are otherwise looking good on this architecture.

So I've now tested your branch on various combinations of:
FreeBSD/amd64 (including with a weird CPU that lacks AVX),
Debian/amd64, Debian/i386, Debian/arm64, RHEL/ppc64le, macOS/amd64,
with LLVM 3.9, 4,0, 5.0, 6.0, with GCC and clang as the main compiler,
with libstdc++ and libc++ as the C++ standard library.

If I had access to one I'd try it on a big endian machine, but I
don't. Anyone? The elephant in the room is Windows. I'm not
personally in the same room as that particular elephant, however.

FWIW, your branch doesn't build against LLVM master (future 7.0),
because the shared module stuff is changing:

llvmjit.c: In function ‘llvm_compile_module’:
llvmjit.c:544:4: error: unknown type name ‘LLVMSharedModuleRef’
LLVMSharedModuleRef smod;
^
llvmjit.c:546:4: warning: implicit declaration of function
‘LLVMOrcMakeSharedModule’ [-Wimplicit-function-declaration]
smod = LLVMOrcMakeSharedModule(context->module);
^
llvmjit.c:548:12: warning: passing argument 3 of
‘LLVMOrcAddEagerlyCompiledIR’ makes pointer from integer without a
cast [enabled by default]
llvm_resolve_symbol, NULL))
^
In file included from llvmjit.c:31:0:
/home/thomas.munro/build/llvm/debug/install/include/llvm-c/OrcBindings.h:99:1:
note: expected ‘LLVMModuleRef’ but argument is of type ‘int’
LLVMOrcAddEagerlyCompiledIR(LLVMOrcJITStackRef JITStack,
^
llvmjit.c:552:4: warning: implicit declaration of function
‘LLVMOrcDisposeSharedModuleRef’ [-Wimplicit-function-declaration]
LLVMOrcDisposeSharedModuleRef(smod);
^

--
Thomas Munro
http://www.enterprisedb.com

#235Andres Freund
andres@anarazel.de
In reply to: Thomas Munro (#234)
Re: JIT compiling with LLVM v12.2

Hi,

On 2018-03-22 16:09:51 +1300, Thomas Munro wrote:

On Thu, Mar 22, 2018 at 1:36 PM, Thomas Munro
<thomas.munro@enterprisedb.com> wrote:

I've now run out of things to complain about for now. Nice work!

I jumped on a POWER8 box. As expected, the same breakage occurs. So
I hacked LLVM 6.0 thusly:

diff --git a/lib/ExecutionEngine/Orc/IndirectionUtils.cpp
b/lib/ExecutionEngine/Orc/IndirectionUtils.cpp
index 68397be..08aa3a8 100644
--- a/lib/ExecutionEngine/Orc/IndirectionUtils.cpp
+++ b/lib/ExecutionEngine/Orc/IndirectionUtils.cpp
@@ -54,7 +54,11 @@ createLocalCompileCallbackManager(const Triple &T,
std::function<std::unique_ptr<IndirectStubsManager>()>
createLocalIndirectStubsManagerBuilder(const Triple &T) {
switch (T.getArch()) {
-    default: return nullptr;
+    default:
+      return [](){
+        return llvm::make_unique<
+                       orc::LocalIndirectStubsManager<orc::OrcGenericABI>>();
+      };

case Triple::aarch64:
return [](){

I am not qualified to have an opinion on whether this is the correct
fix for LLVM, but with this change our make check passes, indicating
that things are otherwise looking good on this architecture.

Yea, that should do the trick, as long as one doesn't rely on indirect
stubs, which we don't. Kinda wonder if we could hackfix this by putting
your definition of createLocalIndirectStubsManagerBuilder() into
something earlier on the search path...

So I've now tested your branch on various combinations of:
FreeBSD/amd64 (including with a weird CPU that lacks AVX),
Debian/amd64, Debian/i386, Debian/arm64, RHEL/ppc64le, macOS/amd64,
with LLVM 3.9, 4,0, 5.0, 6.0, with GCC and clang as the main compiler,
with libstdc++ and libc++ as the C++ standard library.

Many thanks again.

If I had access to one I'd try it on a big endian machine, but I
don't. Anyone? The elephant in the room is Windows. I'm not
personally in the same room as that particular elephant, however.

Hah. I'm not 100% sure I can MSVC project stuff done for this release,
TBH. Doing it via mingw shouldn't be much trouble. But I'm aiming for
fixing the project generation support too.

FWIW, your branch doesn't build against LLVM master (future 7.0),
because the shared module stuff is changing:

llvmjit.c: In function ‘llvm_compile_module’:
llvmjit.c:544:4: error: unknown type name ‘LLVMSharedModuleRef’
LLVMSharedModuleRef smod;
^
llvmjit.c:546:4: warning: implicit declaration of function
‘LLVMOrcMakeSharedModule’ [-Wimplicit-function-declaration]
smod = LLVMOrcMakeSharedModule(context->module);
^
llvmjit.c:548:12: warning: passing argument 3 of
‘LLVMOrcAddEagerlyCompiledIR’ makes pointer from integer without a
cast [enabled by default]
llvm_resolve_symbol, NULL))
^
In file included from llvmjit.c:31:0:
/home/thomas.munro/build/llvm/debug/install/include/llvm-c/OrcBindings.h:99:1:
note: expected ‘LLVMModuleRef’ but argument is of type ‘int’
LLVMOrcAddEagerlyCompiledIR(LLVMOrcJITStackRef JITStack,
^
llvmjit.c:552:4: warning: implicit declaration of function
‘LLVMOrcDisposeSharedModuleRef’ [-Wimplicit-function-declaration]
LLVMOrcDisposeSharedModuleRef(smod);

Yea, I guess we could add branches for that, but 7 just branched and is
a moving target, so I'm inclined to wait a bit.

Greetings,

Andres Freund

#236Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Andres Freund (#235)
2 attachment(s)
Re: JIT compiling with LLVM v12.2

Hi Andres,

I spotted a couple of typos and some very minor coding details -- see
please see attached.

--
Thomas Munro
http://www.enterprisedb.com

Attachments:

0001-Correct-some-minor-typos-in-the-new-JIT-code.patchapplication/octet-stream; name=0001-Correct-some-minor-typos-in-the-new-JIT-code.patchDownload
From 3e5a3dce4556f48441c9f9050928576477baeedf Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.munro@enterprisedb.com>
Date: Sat, 24 Mar 2018 22:34:31 +1300
Subject: [PATCH 1/2] Correct some minor typos in the new JIT code.

Thomas Munro
---
 src/backend/jit/llvm/llvmjit.c         | 12 ++++++------
 src/backend/jit/llvm/llvmjit_error.cpp |  6 +++---
 src/backend/jit/llvm/llvmjit_expr.c    |  4 ++--
 src/backend/jit/llvm/llvmjit_types.c   |  2 +-
 4 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/src/backend/jit/llvm/llvmjit.c b/src/backend/jit/llvm/llvmjit.c
index cd3c40c5f1b..54f6d3685ee 100644
--- a/src/backend/jit/llvm/llvmjit.c
+++ b/src/backend/jit/llvm/llvmjit.c
@@ -246,7 +246,7 @@ llvm_get_function(LLVMJitContext *context, const char *funcname)
 
 	/*
 	 * If there is a pending / not emitted module, compile and emit now.
-	 * Otherwise we migh not find the [correct] function.
+	 * Otherwise we might not find the [correct] function.
 	 */
 	if (!context->compiled)
 	{
@@ -265,7 +265,7 @@ llvm_get_function(LLVMJitContext *context, const char *funcname)
 
 		addr = 0;
 		if (LLVMOrcGetSymbolAddressIn(handle->stack, &addr, handle->orc_handle, funcname))
-			elog(ERROR, "failed to lookup symbol \"%s\"", funcname);
+			elog(ERROR, "failed to look up symbol \"%s\"", funcname);
 		if (addr)
 			return (void *) (uintptr_t) addr;
 	}
@@ -279,11 +279,11 @@ llvm_get_function(LLVMJitContext *context, const char *funcname)
 		return (void *) (uintptr_t) addr;
 #else
 	if (LLVMOrcGetSymbolAddress(llvm_opt0_orc, &addr, funcname))
-		elog(ERROR, "failed to lookup symbol \"%s\"", funcname);
+		elog(ERROR, "failed to look up symbol \"%s\"", funcname);
 	if (addr)
 		return (void *) (uintptr_t) addr;
 	if (LLVMOrcGetSymbolAddress(llvm_opt3_orc, &addr, funcname))
-		elog(ERROR, "failed to lookup symbol \"%s\"", funcname);
+		elog(ERROR, "failed to look up symbol \"%s\"", funcname);
 	if (addr)
 		return (void *) (uintptr_t) addr;
 #endif							/* LLVM_VERSION_MAJOR */
@@ -539,7 +539,7 @@ llvm_compile_module(LLVMJitContext *context)
 		if (LLVMOrcAddEagerlyCompiledIR(compile_orc, &orc_handle, smod,
 										llvm_resolve_symbol, NULL))
 		{
-			elog(ERROR, "failed to jit module");
+			elog(ERROR, "failed to JIT module");
 		}
 		LLVMOrcDisposeSharedModuleRef(smod);
 	}
@@ -845,7 +845,7 @@ llvm_resolve_symbol(const char *symname, void *ctx)
 	char	   *modname;
 
 	/*
-	 * OSX prefixes all object level symbols with an underscore. But neither
+	 * macOS prefixes all object level symbols with an underscore. But neither
 	 * dlsym() nor PG's inliner expect that. So undo.
 	 */
 #if defined(__darwin__)
diff --git a/src/backend/jit/llvm/llvmjit_error.cpp b/src/backend/jit/llvm/llvmjit_error.cpp
index edc1c479d01..a2bdfe3fb87 100644
--- a/src/backend/jit/llvm/llvmjit_error.cpp
+++ b/src/backend/jit/llvm/llvmjit_error.cpp
@@ -4,7 +4,7 @@
  *	  LLVM error related handling that requires interfacing with C++
  *
  * Unfortunately neither (re)setting the C++ new handler, nor the LLVM OOM
- * handler are exposed to C. Therefore this file wraps the necesary code.
+ * handler are exposed to C. Therefore this file wraps the necessary code.
  *
  * Copyright (c) 2016-2018, PostgreSQL Global Development Group
  *
@@ -39,12 +39,12 @@ static void fatal_llvm_error_handler(void *user_data, const std::string& reason,
  *
  * This is necessary for LLVM as LLVM's error handling for such cases
  * (exit()ing, throwing std::bad_alloc() if compiled with exceptions, abort())
- * isn't compatible with postgres error handling.  Thus in section where LLVM
+ * isn't compatible with postgres error handling.  Thus in sections where LLVM
  * code, not LLVM generated functions!, is executing, standard new, LLVM OOM
  * and LLVM fatal errors (some OOM errors masquerade as those) are redirected
  * to our own error handlers.
  *
- * These error handlers FATAL, because there's no reliable way from within
+ * These error handlers use FATAL, because there's no reliable way from within
  * LLVM to throw an error that's guaranteed not to corrupt LLVM's state.
  *
  * To avoid disturbing extensions using C++ and/or LLVM, these handlers are
diff --git a/src/backend/jit/llvm/llvmjit_expr.c b/src/backend/jit/llvm/llvmjit_expr.c
index 667fb01d3be..927f1bde426 100644
--- a/src/backend/jit/llvm/llvmjit_expr.c
+++ b/src/backend/jit/llvm/llvmjit_expr.c
@@ -1941,7 +1941,7 @@ llvm_compile_expr(ExprState *state)
 								isnull;
 
 					/*
-					 * At this point aggref->aggno is not yet set (it's setup
+					 * At this point aggref->aggno is not yet set (it's set up
 					 * in ExecInitAgg() after initializing the expression). So
 					 * load it from memory each time round.
 					 */
@@ -1977,7 +1977,7 @@ llvm_compile_expr(ExprState *state)
 
 					/*
 					 * At this point aggref->wfuncno is not yet set (it's
-					 * setup in ExecInitWindowAgg() after initializing the
+					 * set up in ExecInitWindowAgg() after initializing the
 					 * expression). So load it from memory each time round.
 					 */
 					v_wfuncnop = l_ptr_const(&wfunc->wfuncno,
diff --git a/src/backend/jit/llvm/llvmjit_types.c b/src/backend/jit/llvm/llvmjit_types.c
index 84bc1407373..ac7b41ea08c 100644
--- a/src/backend/jit/llvm/llvmjit_types.c
+++ b/src/backend/jit/llvm/llvmjit_types.c
@@ -8,7 +8,7 @@
  * low chance of definitions getting out of sync, this file lists types and
  * functions that directly need to be accessed from LLVM.
  *
- * When LlVM is first used in a backend, a bitcode version of this file, will
+ * When LLVM is first used in a backend, a bitcode version of this file will
  * be loaded. The needed types and signatures will be stored into Struct*,
  * Type*, Func* variables.
  *
-- 
2.16.2

0002-Minor-code-cleanup-for-llvmjit_wrap.cpp.patchapplication/octet-stream; name=0002-Minor-code-cleanup-for-llvmjit_wrap.cpp.patchDownload
From 648e303072c77e781eca2bb06f488f6be9ccac84 Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.munro@enterprisedb.com>
Date: Sat, 24 Mar 2018 23:12:40 +1300
Subject: [PATCH 2/2] Minor code cleanup for llvmjit_wrap.cpp.

llvm::sys::getHostCPUName()'s result is a llvm::StringRef.  Its data() member
function doesn't guarantee a null-terminated result, so we'd better jump
through an extra hoop to get a C string.

It seems better to use LLVMCreateMessage() rather than strdup() to allocate
the copy returned by LLVMGetHostCPUFeatures() and LLVMGetHostCPUName(),
since the contract is that the caller should free it with
LLVMDisposeMessage().  While we can see that LLVMCreateMessage() and
LLVMDisposeMessage() are currently just wrappers for strdup() and free(),
using them symmetrically seems like a good idea for future Windows support,
where DLLs can be using different heap allocators (the same reason we provide
PQfreemem in libpq).

Fix brace style.

Thomas Munro
---
 src/backend/jit/llvm/llvmjit_wrap.cpp | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/src/backend/jit/llvm/llvmjit_wrap.cpp b/src/backend/jit/llvm/llvmjit_wrap.cpp
index 5d1a17cde04..d2b19ab9a8b 100644
--- a/src/backend/jit/llvm/llvmjit_wrap.cpp
+++ b/src/backend/jit/llvm/llvmjit_wrap.cpp
@@ -18,6 +18,7 @@ extern "C"
 
 #include <llvm/MC/SubtargetFeature.h>
 #include <llvm/Support/Host.h>
+#include <llvm-c/Core.h>
 
 #include "jit/llvmjit.h"
 
@@ -26,13 +27,15 @@ extern "C"
  * C-API extensions.
  */
 #if defined(HAVE_DECL_LLVMGETHOSTCPUNAME) && !HAVE_DECL_LLVMGETHOSTCPUNAME
-char *LLVMGetHostCPUName(void) {
-	return strdup(llvm::sys::getHostCPUName().data());
+char *LLVMGetHostCPUName(void)
+{
+	return LLVMCreateMessage(llvm::sys::getHostCPUName().str().c_str());
 }
 #endif
 
 
-char *LLVMGetHostCPUFeatures(void) {
+char *LLVMGetHostCPUFeatures(void)
+{
 	llvm::SubtargetFeatures Features;
 	llvm::StringMap<bool> HostFeatures;
 
@@ -40,5 +43,5 @@ char *LLVMGetHostCPUFeatures(void) {
 		for (auto &F : HostFeatures)
 			Features.AddFeature(F.first(), F.second);
 
-	return strdup(Features.getString().c_str());
+	return LLVMCreateMessage(Features.getString().c_str());
 }
-- 
2.16.2

#237Thomas Munro
thomas.munro@enterprisedb.com
In reply to: Thomas Munro (#236)
1 attachment(s)
Re: JIT compiling with LLVM v12.2

Thomas Munro <thomas.munro@enterprisedb.com> wrote:

typos

A dead line.

--
Thomas Munro
http://www.enterprisedb.com

Attachments:

0003-Remove-dead-code.patchapplication/octet-stream; name=0003-Remove-dead-code.patchDownload
From b0eb9dbf9fbe7e2903d7cb0f1ef38d5639678ec0 Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.munro@enterprisedb.com>
Date: Sun, 25 Mar 2018 15:15:29 +1300
Subject: [PATCH 3/3] Remove dead code.

---
 src/backend/jit/llvm/llvmjit.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/backend/jit/llvm/llvmjit.c b/src/backend/jit/llvm/llvmjit.c
index 54f6d3685ee..ba822786bfa 100644
--- a/src/backend/jit/llvm/llvmjit.c
+++ b/src/backend/jit/llvm/llvmjit.c
@@ -392,7 +392,6 @@ llvm_function_reference(LLVMJitContext *context,
 		LLVMSetGlobalConstant(v_fn, true);
 
 		return LLVMBuildLoad(builder, v_fn, "");
-		return v_fn;
 	}
 
 	/* check if function already has been added */
-- 
2.16.2

#238Andres Freund
andres@anarazel.de
In reply to: Thomas Munro (#236)
Re: JIT compiling with LLVM v12.2

Hi,

On 2018-03-25 00:07:11 +1300, Thomas Munro wrote:

I spotted a couple of typos and some very minor coding details -- see
please see attached.

Thanks, applying 0001 in a bit.

From 648e303072c77e781eca2bb06f488f6be9ccac84 Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.munro@enterprisedb.com>
Date: Sat, 24 Mar 2018 23:12:40 +1300
Subject: [PATCH 2/2] Minor code cleanup for llvmjit_wrap.cpp.

llvm::sys::getHostCPUName()'s result is a llvm::StringRef. Its data() member
function doesn't guarantee a null-terminated result, so we'd better jump
through an extra hoop to get a C string.

Hm, I checked, and it's fine, I'm not enthusiastic about this...

It seems better to use LLVMCreateMessage() rather than strdup() to allocate
the copy returned by LLVMGetHostCPUFeatures() and LLVMGetHostCPUName(),
since the contract is that the caller should free it with
LLVMDisposeMessage(). While we can see that LLVMCreateMessage() and
LLVMDisposeMessage() are currently just wrappers for strdup() and free(),
using them symmetrically seems like a good idea for future Windows support,
where DLLs can be using different heap allocators (the same reason we provide
PQfreemem in libpq).

I just kept it similar to nearby functions in the LLVM code.

Fix brace style.

I tried to keep this as it's submitted to LLVM, I hope we can get rid of
them for newer version soon... I think I'll update them to be exactly
the same as soon as the upstream patch is applied.

Greetings,

Andres Freund

#239Peter Eisentraut
peter.eisentraut@2ndquadrant.com
In reply to: Andres Freund (#187)
Re: JIT compiling with LLVM v12

On 3/13/18 19:40, Andres Freund wrote:

I've pushed a revised and rebased version of my JIT patchset.

What is the status of this item as far as the commitfest is concerned?

--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#240Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#239)
Re: JIT compiling with LLVM v12

On 2018-03-27 10:05:47 -0400, Peter Eisentraut wrote:

On 3/13/18 19:40, Andres Freund wrote:

I've pushed a revised and rebased version of my JIT patchset.

What is the status of this item as far as the commitfest is concerned?

7/10 committed. Inlining, Explain, Docs remain.

Greetings,

Andres Freund

#241Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#240)
Re: JIT compiling with LLVM v12

On 2018-03-27 10:34:26 -0700, Andres Freund wrote:

On 2018-03-27 10:05:47 -0400, Peter Eisentraut wrote:

On 3/13/18 19:40, Andres Freund wrote:

I've pushed a revised and rebased version of my JIT patchset.

What is the status of this item as far as the commitfest is concerned?

7/10 committed. Inlining, Explain, Docs remain.

I've pushed these three.

As explained in the inline commit, I've found an edge case where I could
hit an assert in LLVM when using a more efficient interaction with
on-disk files. That appears to be a spurious assert, but I don't want
to ignore it until that's confirmed from the LLVM side of things.

For now LLVM is enabled by default when compiled --with-llvm. I'm mildly
inclined to leave it like that until shortly before the release, and
then disable it by default (i.e. change the default of jit=off). But I
think we can make that decision based on experience during the testing
window. I'm opening an open items entry for that.

Yay. Also: Tired.

Greetings,

Andres Freund

#242Andres Freund
andres@anarazel.de
In reply to: Andres Freund (#241)
Re: JIT compiling with LLVM v12

Hi,

On 2018-03-28 14:27:51 -0700, Andres Freund wrote:

7/10 committed. Inlining, Explain, Docs remain.

I've pushed these three.

One tiny pending commit I have is to add a few pg_noinline annotations
to slow-path functions, to avoid very common spurious inlines. I'll play
a littlebit more with the set that I think make sense there, and will
send a separate email about that.

Greetings,

Andres Freund

#243Peter Eisentraut
peter.eisentraut@2ndquadrant.com
In reply to: Andres Freund (#241)
Re: JIT compiling with LLVM v12

On 3/28/18 17:27, Andres Freund wrote:

I've pushed these three.

Great, now the only thing remaining is to prepare an unconference
session explaining all this to the rest of us. ;-)

--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#244Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#243)
Re: JIT compiling with LLVM v12

Hi,

On 2018-03-28 18:06:24 -0400, Peter Eisentraut wrote:

On 3/28/18 17:27, Andres Freund wrote:

I've pushed these three.

Great, now the only thing remaining is to prepare an unconference
session explaining all this to the rest of us. ;-)

Hah! Happy to, if there's enough people interested. I've a talk about
it too (state of jit, 2018 edition), but I wasn't planning to go into
too low level details. More about what is good, what is bad, and how we
make it better ;)

Greetings,

Andres Freund

#245David Steele
david@pgmasters.net
In reply to: Andres Freund (#244)
Re: JIT compiling with LLVM v12

On 3/28/18 6:09 PM, Andres Freund wrote:

On 2018-03-28 18:06:24 -0400, Peter Eisentraut wrote:

On 3/28/18 17:27, Andres Freund wrote:

I've pushed these three.

Great, now the only thing remaining is to prepare an unconference
session explaining all this to the rest of us. ;-)

Hah! Happy to, if there's enough people interested. I've a talk about
it too (state of jit, 2018 edition), but I wasn't planning to go into
too low level details. More about what is good, what is bad, and how we
make it better ;)

+1 for an unconference session. This is some seriously cool stuff.

--
-David
david@pgmasters.net

#246Michael Paquier
michael@paquier.xyz
In reply to: David Steele (#245)
Re: JIT compiling with LLVM v12

On Wed, Mar 28, 2018 at 06:24:53PM -0400, David Steele wrote:

On 3/28/18 6:09 PM, Andres Freund wrote:

Hah! Happy to, if there's enough people interested. I've a talk about
it too (state of jit, 2018 edition), but I wasn't planning to go into
too low level details. More about what is good, what is bad, and how we
make it better ;)

+1 for an unconference session. This is some seriously cool stuff.

Take room for two sessions then, with a break in-between to give enough
time to people to recover from the damage of the first session :)

Jokes apart, an unconference session at PGcon would be great.
--
Michael

#247Amit Langote
Langote_Amit_f8@lab.ntt.co.jp
In reply to: Michael Paquier (#246)
Re: JIT compiling with LLVM v12

On 2018/03/29 9:35, Michael Paquier wrote:

On Wed, Mar 28, 2018 at 06:24:53PM -0400, David Steele wrote:

On 3/28/18 6:09 PM, Andres Freund wrote:

Hah! Happy to, if there's enough people interested. I've a talk about
it too (state of jit, 2018 edition), but I wasn't planning to go into
too low level details. More about what is good, what is bad, and how we
make it better ;)

+1 for an unconference session. This is some seriously cool stuff.

Take room for two sessions then, with a break in-between to give enough
time to people to recover from the damage of the first session :)

Jokes apart, an unconference session at PGcon would be great.

+1

Thanks,
Amit

#248Jesper Pedersen
jesper.pedersen@redhat.com
In reply to: Andres Freund (#241)
Re: JIT compiling with LLVM v12

Hi Andres,

On 03/28/2018 05:27 PM, Andres Freund wrote:

On 2018-03-27 10:34:26 -0700, Andres Freund wrote:

On 2018-03-27 10:05:47 -0400, Peter Eisentraut wrote:

On 3/13/18 19:40, Andres Freund wrote:

I've pushed a revised and rebased version of my JIT patchset.

What is the status of this item as far as the commitfest is concerned?

7/10 committed. Inlining, Explain, Docs remain.

I've pushed these three.

It seems that clang is being picked up as the main compiler in certain
situations, ala

ccache gcc -Wall -Wmissing-prototypes -Wpointer-arith
-Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute
-Wformat-security -fno-strict-aliasing -fwrapv
-fexcess-precision=standard -g -O0 -fno-omit-frame-pointer
-I../../../src/include -D_GNU_SOURCE -I/usr/include/libxml2 -c -o
auth-scram.o auth-scram.c -MMD -MP -MF .deps/auth-scram.Po
ccache gcc -Wall -Wmissing-prototypes -Wpointer-arith
-Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute
-Wformat-security -fno-strict-aliasing -fwrapv
-fexcess-precision=standard -g -O0 -fno-omit-frame-pointer
-I../../../src/include -D_GNU_SOURCE -I/usr/include/libxml2 -c -o
be-secure-openssl.o be-secure-openssl.c -MMD -MP -MF
.deps/be-secure-openssl.Po
/usr/lib64/ccache/clang -Wno-ignored-attributes -fno-strict-aliasing
-fwrapv -O2 -I../../../src/include -D_GNU_SOURCE
-I/usr/include/libxml2 -flto=thin -emit-llvm -c -o be-fsstubs.bc
be-fsstubs.c
/usr/lib64/ccache/clang -Wno-ignored-attributes -fno-strict-aliasing
-fwrapv -O2 -I../../../src/include -D_GNU_SOURCE
-I/usr/include/libxml2 -flto=thin -emit-llvm -c -o namespace.bc namespace.c

I would expect LLVM to be isolated to the jit/ hierarchy.

Using CC="ccache gcc" and --with-llvm.

And congrats on getting the feature in !

Best regards,
Jesper

#249John Naylor
jcnaylor@gmail.com
In reply to: Andres Freund (#238)
1 attachment(s)
Re: JIT compiling with LLVM v12.2

Hi Andres,
I spent some time over pouring over the JIT README, and I've attached
a patch with some additional corrections as well as some stylistic
suggestions. The latter may be debatable, but I'm sure you can take
and pick as you see fit. If there are cases where I misunderstood your
intent, maybe that's also useful information. :-)

-John Naylor

Attachments:

LLVM-README-edits-JCN.patchtext/x-patch; charset=US-ASCII; name=LLVM-README-edits-JCN.patchDownload
diff --git a/src/backend/jit/README b/src/backend/jit/README
index bfed319..7924127 100644
--- a/src/backend/jit/README
+++ b/src/backend/jit/README
@@ -13,12 +13,12 @@ the CPU that just handles that expression, yielding a speedup.
 That this is done at query execution time, possibly even only in cases
 the relevant task is done a number of times, makes it JIT, rather than
 ahead-of-time (AOT). Given the way JIT compilation is used in
-postgres, the lines between interpretation, AOT and JIT are somewhat
+PostgreSQL, the lines between interpretation, AOT and JIT are somewhat
 blurry.
 
 Note that the interpreted program turned into a native program does
 not necessarily have to be a program in the classical sense. E.g. it
-is highly beneficial JIT compile tuple deforming into a native
+is highly beneficial to JIT compile tuple deforming into a native
 function just handling a specific type of table, despite tuple
 deforming not commonly being understood as a "program".
 
@@ -26,7 +26,7 @@ deforming not commonly being understood as a "program".
 Why JIT?
 ========
 
-Parts of postgres are commonly bottlenecked by comparatively small
+Parts of PostgreSQL are commonly bottlenecked by comparatively small
 pieces of CPU intensive code. In a number of cases that is because the
 relevant code has to be very generic (e.g. handling arbitrary SQL
 level expressions, over arbitrary tables, with arbitrary extensions
@@ -49,11 +49,11 @@ particularly beneficial for removing branches during tuple deforming.
 How to JIT
 ==========
 
-Postgres, by default, uses LLVM to perform JIT. LLVM was chosen
+PostgreSQL, by default, uses LLVM to perform JIT. LLVM was chosen
 because it is developed by several large corporations and therefore
 unlikely to be discontinued, because it has a license compatible with
-PostgreSQL, and because its LLVM IR can be generated from C
-using the clang compiler.
+PostgreSQL, and because its IR can be generated from C using the Clang
+compiler.
 
 
 Shared Library Separation
@@ -68,20 +68,20 @@ An additional benefit of doing so is that it is relatively easy to
 evaluate JIT compilation that does not use LLVM, by changing out the
 shared library used to provide JIT compilation.
 
-To achieve this code, e.g. expression evaluation, intending to perform
-JIT, calls a LLVM independent wrapper located in jit.c to do so. If
-the shared library providing JIT support can be loaded (i.e. postgres
-was compiled with LLVM support and the shared library is installed),
-the task of JIT compiling an expression gets handed of to shared
-library. This obviously requires that the function in jit.c is allowed
-to fail in case no JIT provider can be loaded.
+To achieve this, code intending to perform JIT (e.g. expression evaluation)
+calls an LLVM independent wrapper located in jit.c to do so. If the
+shared library providing JIT support can be loaded (i.e. PostgreSQL was
+compiled with LLVM support and the shared library is installed), the task
+of JIT compiling an expression gets handed of to the shared library. This
+obviously requires that the function in jit.c is allowed to fail in case
+no JIT provider can be loaded.
 
 Which shared library is loaded is determined by the jit_provider GUC,
 defaulting to "llvmjit".
 
 Cloistering code performing JIT into a shared library unfortunately
 also means that code doing JIT compilation for various parts of code
-has to be located separately from the code doing so without
+has to be located separately from the code that executes without
 JIT. E.g. the JITed version of execExprInterp.c is located in
 jit/llvm/ rather than executor/.
 
@@ -105,17 +105,21 @@ implementations.
 
 Emitting individual functions separately is more expensive than
 emitting several functions at once, and emitting them together can
-provide additional optimization opportunities. To facilitate that the
-LLVM provider separates function definition from emitting them in an
-executable way.
+provide additional optimization opportunities. To facilitate that, the
+LLVM provider separates function definition (LLVM IR) from function
+emission (executable mmap()ed segments).
 
 Creating functions into the current mutable module (a module
 essentially is LLVM's equivalent of a translation unit in C) is done
 using
+
   extern LLVMModuleRef llvm_mutable_module(LLVMJitContext *context);
+
 in which it then can emit as much code using the LLVM APIs as it
 wants. Whenever a function actually needs to be called
+
   extern void *llvm_get_function(LLVMJitContext *context, const char *funcname);
+
 returns a pointer to it.
 
 E.g. in the expression evaluation case this setup allows most
@@ -127,12 +131,12 @@ used.
 Error Handling
 --------------
 
-There are two aspects to error handling.  Firstly, generated (LLVM IR)
-and emitted functions (mmap()ed segments) need to be cleaned up both
-after a successful query execution and after an error. This is done by
-registering each created JITContext with the current resource owner,
-and cleaning it up on error / end of transaction. If it is desirable
-to release resources earlier, jit_release_context() can be used.
+There are two aspects of error handling.  Firstly, generated and
+emitted functions need to be cleaned up both after a successful query
+execution and after an error. This is done by registering each created
+JITContext with the current resource owner, and cleaning it up on error /
+end of transaction. If it is desirable to release resources earlier,
+jit_release_context() can be used.
 
 The second, less pretty, aspect of error handling is OOM handling
 inside LLVM itself. The above resowner based mechanism takes care of
@@ -140,14 +144,18 @@ cleaning up emitted code upon ERROR, but there's also the chance that
 LLVM itself runs out of memory. LLVM by default does *not* use any C++
 exceptions. Its allocations are primarily funneled through the
 standard "new" handlers, and some direct use of malloc() and
-mmap(). For the former a 'new handler' exists
-http://en.cppreference.com/w/cpp/memory/new/set_new_handler for the
-latter LLVM provides callback that get called upon failure
-(unfortunately mmap() failures are treated as fatal rather than OOM
-errors).  What we've, for now, chosen to do, is to have two functions
-that LLVM using code must use:
+mmap(). For the former a 'new handler' exists:
+
+http://en.cppreference.com/w/cpp/memory/new/set_new_handler
+
+For the latter LLVM provides callbacks that get called upon failure
+(unfortunately mmap() failures are treated as fatal rather than OOM errors).
+What we've chosen to do for now is have two functions that LLVM using code
+must use:
+
 extern void llvm_enter_fatal_on_oom(void);
 extern void llvm_leave_fatal_on_oom(void);
+
 before interacting with LLVM code.
 
 When a libstdc++ new or LLVM error occurs, the handlers set up by the
@@ -156,11 +164,11 @@ than ERROR, as we *cannot* reliably throw ERROR inside a foreign
 library without risking corrupting its internal state.
 
 Users of the above sections do *not* have to use PG_TRY/CATCH blocks,
-the handlers instead are reset on toplevel sigsetjmp() level.
+the handlers are reset at the toplevel sigsetjmp() level instead.
 
 Using a relatively small enter/leave protected section of code, rather
 than setting up these handlers globally, avoids negative interactions
-with extensions that might use C++ like e.g. postgis. As LLVM code
+with extensions that might use C++ such as PostGIS. As LLVM code
 generation should never execute arbitrary code, just setting these
 handlers temporarily ought to suffice.
 
@@ -168,9 +176,9 @@ handlers temporarily ought to suffice.
 Type Synchronization
 --------------------
 
-To able to generate code performing tasks that are done in "interpreted"
-postgres, it obviously is required that code generation knows about at
-least a few postgres types.  While it is possible to inform LLVM about
+To able to generate code that can perform tasks done by "interpreted"
+PostgreSQL, it is obviously required that code generation knows about at
+least a few PostgreSQL types.  While it is possible to inform LLVM about
 type definitions by recreating them manually in C code, that is failure
 prone and labor intensive.
 
@@ -178,13 +186,15 @@ Instead there is one small file (llvmjit_types.c) which references each of
 the types required for JITing. That file is translated to bitcode at
 compile time, and loaded when LLVM is initialized in a backend.
 
-That works very well to synchronize the type definition, unfortunately
+That works very well to synchronize the type definition, but unfortunately
 it does *not* synchronize offsets as the IR level representation doesn't
-know field names.  Instead required offsets are maintained as defines in
-the original struct definition. E.g.
+know field names.  Instead, required offsets are maintained as defines in
+the original struct definition, like so:
+
 #define FIELDNO_TUPLETABLESLOT_NVALID 9
         int                     tts_nvalid;             /* # of valid values in tts_values */
-while that still needs to be defined, it's only required for a
+
+While that still needs to be defined, it's only required for a
 relatively small number of fields, and it's bunched together with the
 struct definition, so it's easily kept synchronized.
 
@@ -193,23 +203,25 @@ Inlining
 --------
 
 One big advantage of JITing expressions is that it can significantly
-reduce the overhead of postgres's extensible function/operator
-mechanism, by inlining the body of called functions / operators.
+reduce the overhead of PostgreSQL's extensible function/operator
+mechanism, by inlining the body of called functions/operators.
 
-It obviously is undesirable to maintain a second implementation of
+It is obviously undesirable to maintain a second implementation of
 commonly used functions, just for inlining purposes. Instead we take
-advantage of the fact that the clang compiler can emit LLVM IR.
+advantage of the fact that the Clang compiler can emit LLVM IR.
 
 The ability to do so allows us to get the LLVM IR for all operators
 (e.g. int8eq, float8pl etc), without maintaining two copies.  These
 bitcode files get installed into the server's
   $pkglibdir/bitcode/postgres/
-Using existing LLVM functionality (for parallel LTO compilation),
-additionally an index is over these is stored to
-$pkglibdir/bitcode/postgres.index.bc
+
+To use existing LLVM functionality for parallel LTO compilation,
+additionally an index over these is stored in
+  $pkglibdir/bitcode/postgres.index.bc
 
 Similarly extensions can install code into
   $pkglibdir/bitcode/[extension]/
+
 accompanied by
   $pkglibdir/bitcode/[extension].index.bc
 
@@ -225,7 +237,7 @@ Caching
 Currently it is not yet possible to cache generated functions, even
 though that'd be desirable from a performance point of view. The
 problem is that the generated functions commonly contain pointers into
-per-execution memory. The expression evaluation functionality needs to
+per-execution memory. The expression evaluation machinery needs to
 be redesigned a bit to avoid that. Basically all per-execution memory
 needs to be referenced as an offset to one block of memory stored in
 an ExprState, rather than absolute pointers into memory.
@@ -247,13 +259,13 @@ What to JIT
 ===========
 
 Currently expression evaluation and tuple deforming are JITed. Those
-were chosen because they commonly are major CPU bottlenecks in
+were chosen because they are commonly major CPU bottlenecks in
 analytics queries, but are by no means the only potentially beneficial cases.
 
 For JITing to be beneficial a piece of code first and foremost has to
 be a CPU bottleneck. But also importantly, JITing can only be
-beneficial if overhead can be removed by doing so. E.g. in the tuple
-deforming case the knowledge about the number of columns and their
+beneficial if overhead can be removed by doing so. In the tuple
+deforming case the knowledge about the number of columns and their
 types can remove a significant number of branches, and in the
 expression evaluation case a lot of indirect jumps/calls can be
 removed.  If neither of these is the case, JITing is a waste of
@@ -278,11 +290,11 @@ Currently there are a number of GUCs that influence JITing:
 - jit_inline_above_cost = -1, 0-DBL_MAX - inlining is tried if query has
   higher cost.
 
-whenever a query's total cost is above these limits, JITing is
+Whenever a query's total cost is above these limits, JITing is
 performed.
 
 Alternative costing models, e.g. by generating separate paths for
-parts of a query with lower cpu_* costs, are also a possibility, but
+parts of a query with lower CPU costs, are also a possibility, but
 it's doubtful the overhead of doing so is sufficient.  Another
 alternative would be to count the number of times individual
 expressions are estimated to be evaluated, and perform JITing of these
@@ -291,5 +303,5 @@ individual expressions.
 The obvious seeming approach of JITing expressions individually after
 a number of execution turns out not to work too well. Primarily
 because emitting many small functions individually has significant
-overhead. Secondarily because the time till JITing occurs causes
+overhead. Secondarily because the time until JITing occurs causes
 relative slowdowns that eat into the gain of JIT compilation.
#250Pierre Ducroquet
p.psql@pinaraf.info
In reply to: Jesper Pedersen (#248)
Re: JIT compiling with LLVM v12

On Thursday, March 29, 2018 2:39:17 PM CEST Jesper Pedersen wrote:

Hi Andres,

On 03/28/2018 05:27 PM, Andres Freund wrote:

On 2018-03-27 10:34:26 -0700, Andres Freund wrote:

On 2018-03-27 10:05:47 -0400, Peter Eisentraut wrote:

On 3/13/18 19:40, Andres Freund wrote:

I've pushed a revised and rebased version of my JIT patchset.

What is the status of this item as far as the commitfest is concerned?

7/10 committed. Inlining, Explain, Docs remain.

I've pushed these three.

It seems that clang is being picked up as the main compiler in certain
situations, ala

ccache gcc -Wall -Wmissing-prototypes -Wpointer-arith
-Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute
-Wformat-security -fno-strict-aliasing -fwrapv
-fexcess-precision=standard -g -O0 -fno-omit-frame-pointer
-I../../../src/include -D_GNU_SOURCE -I/usr/include/libxml2 -c -o
auth-scram.o auth-scram.c -MMD -MP -MF .deps/auth-scram.Po
ccache gcc -Wall -Wmissing-prototypes -Wpointer-arith
-Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute
-Wformat-security -fno-strict-aliasing -fwrapv
-fexcess-precision=standard -g -O0 -fno-omit-frame-pointer
-I../../../src/include -D_GNU_SOURCE -I/usr/include/libxml2 -c -o
be-secure-openssl.o be-secure-openssl.c -MMD -MP -MF
.deps/be-secure-openssl.Po
/usr/lib64/ccache/clang -Wno-ignored-attributes -fno-strict-aliasing
-fwrapv -O2 -I../../../src/include -D_GNU_SOURCE
-I/usr/include/libxml2 -flto=thin -emit-llvm -c -o be-fsstubs.bc
be-fsstubs.c
/usr/lib64/ccache/clang -Wno-ignored-attributes -fno-strict-aliasing
-fwrapv -O2 -I../../../src/include -D_GNU_SOURCE
-I/usr/include/libxml2 -flto=thin -emit-llvm -c -o namespace.bc namespace.c

I would expect LLVM to be isolated to the jit/ hierarchy.

Clang is needed to emit the LLVM bitcode required for inlining. The "-emit-
llvm" flag is used for that. A dual compilation is required for inlining to
work, one compilation with gcc/clang/msvc/… to build the postgresql binary,
one with clang to generate the .bc files for inlining.
It can be surprising, but there is little way around that (or we accept only
clang to build postgresql, but there would be a riot).

#251Jesper Pedersen
jesper.pedersen@redhat.com
In reply to: Pierre Ducroquet (#250)
1 attachment(s)
Re: JIT compiling with LLVM v12

Hi,

On 03/29/2018 11:03 AM, Pierre Ducroquet wrote:

Clang is needed to emit the LLVM bitcode required for inlining. The "-emit-
llvm" flag is used for that. A dual compilation is required for inlining to
work, one compilation with gcc/clang/msvc/… to build the postgresql binary,
one with clang to generate the .bc files for inlining.
It can be surprising, but there is little way around that (or we accept only
clang to build postgresql, but there would be a riot).

Thanks Pierre.

Best regards,
Jesper

Attachments:

README.patchtext/x-patch; name=README.patchDownload
diff --git a/src/backend/jit/README b/src/backend/jit/README
index bfed319189..dca4aa761c 100644
--- a/src/backend/jit/README
+++ b/src/backend/jit/README
@@ -55,6 +55,9 @@ unlikely to be discontinued, because it has a license compatible with
 PostgreSQL, and because its LLVM IR can be generated from C
 using the clang compiler.
 
+clang will be used to compile files where LLVM bitcode is required to
+inline functions using the -emit-llvm flag. This may cause PostgreSQL
+to be compiled with multiple compilers, such as gcc and clang.
 
 Shared Library Separation
 -------------------------
#252Andres Freund
andres@anarazel.de
In reply to: John Naylor (#249)
Re: JIT compiling with LLVM v12.2

Hi,

On 2018-03-29 19:57:42 +0700, John Naylor wrote:

Hi Andres,
I spent some time over pouring over the JIT README, and I've attached
a patch with some additional corrections as well as some stylistic
suggestions. The latter may be debatable, but I'm sure you can take
and pick as you see fit. If there are cases where I misunderstood your
intent, maybe that's also useful information. :-)

I've picked most of them, and pushed a change including some additional
changes. Thanks!

- Andres

#253Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Andres Freund (#252)
Re: JIT compiling with LLVM v12.2

On 30.03.2018 02:14, Andres Freund wrote:

Hi,

On 2018-03-29 19:57:42 +0700, John Naylor wrote:

Hi Andres,
I spent some time over pouring over the JIT README, and I've attached
a patch with some additional corrections as well as some stylistic
suggestions. The latter may be debatable, but I'm sure you can take
and pick as you see fit. If there are cases where I misunderstood your
intent, maybe that's also useful information. :-)

I've picked most of them, and pushed a change including some additional
changes. Thanks!

- Andres

I have repeated performance tests at my computer and find out some
regression comparing with previous JIT version.
Previously JIT provides about 2 times improvement at TPC-H Q1. Now the
difference is reduced to 1.4 without parallel execution and 1.3 with
parallel execution:

max_parallel_workers_per_gather=0
max_parallel_workers_per_gather=4
jit=on
17500
5730
jit=off
25100
7550

Previous my result for JIT was 13440 for sequential execution.
I know that performance is not the high priority now, it is more
important to commit infrastructure.
Just want to inform that such regression takes place.
It will be nice if you can mark future directions of improving JIT
performance...
postgres=# explain (analyze,buffers) select
    l_returnflag,
    l_linestatus,
    sum(l_quantity) as sum_qty,
    sum(l_extendedprice) as sum_base_price,
    sum(l_extendedprice*(1-l_discount)) as sum_disc_price,
    sum(l_extendedprice*(1-l_discount)*(1+l_tax)) as sum_charge,
    avg(l_quantity) as avg_qty,
    avg(l_extendedprice) as avg_price,
    avg(l_discount) as avg_disc,
    count(*) as count_order
from
    lineitem
where
    l_shipdate <= '1998-12-01'
group by
    l_returnflag,
    l_linestatus
order by
    l_returnflag,
    l_linestatus;
QUERY PLAN

-------------------------------------------------------------------------------------------------------------------------------
------------------------------
 Finalize GroupAggregate  (cost=2064556.89..2064560.47 rows=6 width=60)
(actual time=6573.905..6573.915 rows=4 loops=1)
   Group Key: l_returnflag, l_linestatus
   Buffers: shared hit=240472
   ->  Gather Merge  (cost=2064556.89..2064559.76 rows=24 width=132)
(actual time=6573.888..6573.897 rows=20 loops=1)
         Workers Planned: 4
         Workers Launched: 4
         Buffers: shared hit=240472
         ->  Sort  (cost=2063556.83..2063556.85 rows=6 width=132)
(actual time=6562.256..6562.256 rows=4 loops=5)
               Sort Key: l_returnflag, l_linestatus
               Sort Method: quicksort  Memory: 26kB
               Worker 0:  Sort Method: quicksort  Memory: 26kB
               Worker 1:  Sort Method: quicksort  Memory: 26kB
               Worker 2:  Sort Method: quicksort  Memory: 26kB
               Worker 3:  Sort Method: quicksort  Memory: 26kB
               Buffers: shared hit=1276327
               ->  Partial HashAggregate (cost=2063556.69..2063556.75
rows=6 width=132) (actual time=6562.222..6562.224 rows=4
 loops=5)
                     Group Key: l_returnflag, l_linestatus
                     Buffers: shared hit=1276299
                     ->  Parallel Seq Scan on lineitem
(cost=0.00..1463755.41 rows=14995032 width=20) (actual time=312.454..25
20.753 rows=11997210 loops=5)
                           Filter: (l_shipdate <= '1998-12-01'::date)
                           Buffers: shared hit=1276299
 Planning Time: 0.130 ms
 JIT:
   Functions: 18
   Generation Time: 2.344 ms
   Inlining: true
   Inlining Time: 15.364 ms
   Optimization: true
   Optimization Time: 298.833 ms
   Emission Time: 155.257 ms
 Execution Time: 6807.751 ms
(31 rows)

Time: 6808.216 ms (00:06.808)

--
Konstantin Knizhnik
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

#254Andres Freund
andres@anarazel.de
In reply to: Konstantin Knizhnik (#253)
Re: JIT compiling with LLVM v12.2

On 2018-03-30 15:12:05 +0300, Konstantin Knizhnik wrote:

I have repeated performance tests at my computer and find out some
regression comparing with previous JIT version.
Previously JIT provides about 2 times improvement at TPC-H Q1. Now the
difference is reduced to 1.4 without parallel execution and 1.3 with
parallel execution:

Huh. That's the same computer you did the tests on?

There shouldn't have been any, I'll check it out.

- Andres

#255Konstantin Knizhnik
k.knizhnik@postgrespro.ru
In reply to: Andres Freund (#254)
Re: JIT compiling with LLVM v12.2

On 30.03.2018 18:54, Andres Freund wrote:

On 2018-03-30 15:12:05 +0300, Konstantin Knizhnik wrote:

I have repeated performance tests at my computer and find out some
regression comparing with previous JIT version.
Previously JIT provides about 2 times improvement at TPC-H Q1. Now the
difference is reduced to 1.4 without parallel execution and 1.3 with
parallel execution:

Huh. That's the same computer you did the tests on?

There shouldn't have been any, I'll check it out.

- Andres

Yes, it is the same computer.
But sorry, may be it is false alarm.
I noticed that the time of normal (non-jit) query execution was also
faster in the past: for parallel execution 6549 vs. 7550 now, for
non-parallel execution 20075 vs. 25100.
I do not know whether this difference is caused by some changes in
Postgres committed since this time (end of January) or just because of
different layout of data in memory.
But JIT performance improvement is almost the same in both cases: 1.493
vs 1.434 now.

--
Konstantin Knizhnik
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

#256Andres Freund
andres@anarazel.de
In reply to: Konstantin Knizhnik (#255)
Re: JIT compiling with LLVM v12.2

On March 30, 2018 10:04:25 AM PDT, Konstantin Knizhnik <k.knizhnik@postgrespro.ru> wrote:

On 30.03.2018 18:54, Andres Freund wrote:

On 2018-03-30 15:12:05 +0300, Konstantin Knizhnik wrote:

I have repeated performance tests at my computer and find out some
regression comparing with previous JIT version.
Previously JIT provides about 2 times improvement at TPC-H Q1. Now

the

difference is reduced to 1.4 without parallel execution and 1.3 with
parallel execution:

Huh. That's the same computer you did the tests on?

There shouldn't have been any, I'll check it out.

- Andres

Yes, it is the same computer.
But sorry, may be it is false alarm.
I noticed that the time of normal (non-jit) query execution was also
faster in the past: for parallel execution 6549 vs. 7550 now, for
non-parallel execution 20075 vs. 25100.
I do not know whether this difference is caused by some changes in
Postgres committed since this time (end of January) or just because of
different layout of data in memory.

A brief attempt at bisecting would be good. That's quite the regression. Possibly it's OS related though. Meltdown / Spectre?

Andres
--
Sent from my Android device with K-9 Mail. Please excuse my brevity.

#257Noah Misch
noah@leadboat.com
In reply to: Andres Freund (#241)
Re: JIT compiling with LLVM v12

On Wed, Mar 28, 2018 at 02:27:51PM -0700, Andres Freund wrote:

For now LLVM is enabled by default when compiled --with-llvm. I'm mildly
inclined to leave it like that until shortly before the release, and
then disable it by default (i.e. change the default of jit=off). But I
think we can make that decision based on experience during the testing
window. I'm opening an open items entry for that.

I'll vote for jit=on and letting any bugs shake out earlier, but it's not a
strong preference.

I see jit slows the regression tests considerably:

# x86_64, non-assert, w/o llvm
$ for n in 1 2 3; do env time make -C src/bin/pg_upgrade check; done 2>&1 | grep elapsed
7.64user 4.24system 0:36.40elapsed 32%CPU (0avgtext+0avgdata 36712maxresident)k
8.09user 4.50system 0:37.71elapsed 33%CPU (0avgtext+0avgdata 36712maxresident)k
7.53user 4.18system 0:36.54elapsed 32%CPU (0avgtext+0avgdata 36712maxresident)k

# x86_64, non-assert, w/ llvm trunk
$ for n in 1 2 3; do env time make -C src/bin/pg_upgrade check; done 2>&1 | grep elapsed
9.58user 5.79system 0:49.61elapsed 30%CPU (0avgtext+0avgdata 36712maxresident)k
9.47user 5.92system 0:47.84elapsed 32%CPU (0avgtext+0avgdata 36712maxresident)k
9.09user 5.51system 0:47.94elapsed 30%CPU (0avgtext+0avgdata 36712maxresident)k

# mips32el, assert, w/o llvm (buildfarm member topminnow) [1]The mips32el runs used "nice -+20" and ran on a shared machine. I include them to show the trend, but exact figures may be non-reproducible.
28min install-check-*
35min check-pg_upgrade

# mips32el, assert, w/ llvm 6.0.1 [1]The mips32el runs used "nice -+20" and ran on a shared machine. I include them to show the trend, but exact figures may be non-reproducible.
63min install-check-*
166min check-pg_upgrade

Regardless of the choice of jit={on|off} default, these numbers tell me that
some or all of jit_*_cost defaults are too low.

[1]: The mips32el runs used "nice -+20" and ran on a shared machine. I include them to show the trend, but exact figures may be non-reproducible.
them to show the trend, but exact figures may be non-reproducible.

#258Andres Freund
andres@anarazel.de
In reply to: Noah Misch (#257)
Re: JIT compiling with LLVM v12

On 2018-08-22 06:20:21 +0000, Noah Misch wrote:

On Wed, Mar 28, 2018 at 02:27:51PM -0700, Andres Freund wrote:

For now LLVM is enabled by default when compiled --with-llvm. I'm mildly
inclined to leave it like that until shortly before the release, and
then disable it by default (i.e. change the default of jit=off). But I
think we can make that decision based on experience during the testing
window. I'm opening an open items entry for that.

I'll vote for jit=on and letting any bugs shake out earlier, but it's not a
strong preference.

Similar.

I see jit slows the regression tests considerably:

# x86_64, non-assert, w/o llvm
$ for n in 1 2 3; do env time make -C src/bin/pg_upgrade check; done 2>&1 | grep elapsed
7.64user 4.24system 0:36.40elapsed 32%CPU (0avgtext+0avgdata 36712maxresident)k
8.09user 4.50system 0:37.71elapsed 33%CPU (0avgtext+0avgdata 36712maxresident)k
7.53user 4.18system 0:36.54elapsed 32%CPU (0avgtext+0avgdata 36712maxresident)k

# x86_64, non-assert, w/ llvm trunk
$ for n in 1 2 3; do env time make -C src/bin/pg_upgrade check; done 2>&1 | grep elapsed
9.58user 5.79system 0:49.61elapsed 30%CPU (0avgtext+0avgdata 36712maxresident)k
9.47user 5.92system 0:47.84elapsed 32%CPU (0avgtext+0avgdata 36712maxresident)k
9.09user 5.51system 0:47.94elapsed 30%CPU (0avgtext+0avgdata 36712maxresident)k

# mips32el, assert, w/o llvm (buildfarm member topminnow) [1]
28min install-check-*
35min check-pg_upgrade

# mips32el, assert, w/ llvm 6.0.1 [1]
63min install-check-*
166min check-pg_upgrade

Regardless of the choice of jit={on|off} default, these numbers tell me that
some or all of jit_*_cost defaults are too low.

I don't think it really shows that. The reason that JITing gets started
there is that the tables aren't analyzed and we end up with crazy ass
estimates about the cost of the queries. No useful setting of the cost
limits will protect against that... :(

Greetings,

Andres Freund

#259Peter Eisentraut
peter.eisentraut@2ndquadrant.com
In reply to: Noah Misch (#257)
Re: JIT compiling with LLVM v12

On 22/08/2018 08:20, Noah Misch wrote:

Regardless of the choice of jit={on|off} default, these numbers tell me that
some or all of jit_*_cost defaults are too low.

That was also my earlier analysis.

I'm suspicious that we haven't had much feedback about this. We've
heard of one or two cases where LLVM broke a query outright, and that
was fixed and that was a good result. But we haven't heard anything
about performance regressions. Surely there must be some. There hasn't
been any discussion or further analysis of the default cost settings
either. I feel that we don't have enough information.

Another problem is that LLVM is only enabled in some versions of
packages. For example, in the PGDG RPMs, it's enabled for RHEL 7 but
not RHEL 6. So you could be in for a surprise if you upgrade your
operating system at some point.

I would like, however, that we make a decision one way or the other
before the next beta. I've been handwaving a bit to users not to rely
on the current betas for performance testing because the defaults might
change later. That's bad either way.

--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#260Andres Freund
andres@anarazel.de
In reply to: Peter Eisentraut (#259)
Re: JIT compiling with LLVM v12

Hi,

On 2018-08-22 16:36:00 +0200, Peter Eisentraut wrote:

I'm suspicious that we haven't had much feedback about this. We've
heard of one or two cases where LLVM broke a query outright, and that
was fixed and that was a good result. But we haven't heard anything
about performance regressions. Surely there must be some. There hasn't
been any discussion or further analysis of the default cost settings
either. I feel that we don't have enough information.

Yea. I don't think we'll get really good feedback before production
unfortunately :(

I would like, however, that we make a decision one way or the other
before the next beta. I've been handwaving a bit to users not to rely
on the current betas for performance testing because the defaults might
change later. That's bad either way.

I don't see particularly much benefit in deciding before beta,
personally. What's making you think it'd be important to decide before?
Pretty fundamentally, it'll be a setting you don't know is effectively
on, for the forseeable future anyway?

Greetings,

Andres Freund

#261Andreas Joseph Krogh
andreas@visena.com
In reply to: Peter Eisentraut (#259)
Sv: Re: JIT compiling with LLVM v12

På onsdag 22. august 2018 kl. 16:36:00, skrev Peter Eisentraut <
peter.eisentraut@2ndquadrant.com <mailto:peter.eisentraut@2ndquadrant.com>>:
On 22/08/2018 08:20, Noah Misch wrote:

Regardless of the choice of jit={on|off} default, these numbers tell me that
some or all of jit_*_cost defaults are too low.

That was also my earlier analysis.

I'm suspicious that we haven't had much feedback about this.  We've
heard of one or two cases where LLVM broke a query outright, and that
was fixed and that was a good result.  But we haven't heard anything
about performance regressions.  Surely there must be some.  There hasn't
been any discussion or further analysis of the default cost settings
either.  I feel that we don't have enough information.

Another problem is that LLVM is only enabled in some versions of
packages.  For example, in the PGDG RPMs, it's enabled for RHEL 7 but
not RHEL 6.  So you could be in for a surprise if you upgrade your
operating system at some point.

I would like, however, that we make a decision one way or the other
before the next beta.  I've been handwaving a bit to users not to rely
on the current betas for performance testing because the defaults might
change later.  That's bad either way.
 
FWIW; Our largest report-queries perform worse (then v10) with
jit=on; /messages/by-id/VisenaEmail.24.e60072a07f006130.162d95c3e17@tc7-visena
 
Disabling JIT makes them perform slightly better than v10.
 
--
Andreas Joseph Krogh

#262Peter Eisentraut
peter.eisentraut@2ndquadrant.com
In reply to: Andres Freund (#260)
Re: JIT compiling with LLVM v12

On 22/08/2018 16:54, Andres Freund wrote:

I don't see particularly much benefit in deciding before beta,
personally. What's making you think it'd be important to decide before?
Pretty fundamentally, it'll be a setting you don't know is effectively
on, for the forseeable future anyway?

Users are evaluating PostgreSQL 11 beta in their environments, including
its performance. I have to tell them, whatever performance test results
you get now might not be what you'll get with the final 11.0.

--
Peter Eisentraut http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#263Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#258)
Re: JIT compiling with LLVM v12

Andres Freund <andres@anarazel.de> writes:

On 2018-08-22 06:20:21 +0000, Noah Misch wrote:

Regardless of the choice of jit={on|off} default, these numbers tell me that
some or all of jit_*_cost defaults are too low.

I don't think it really shows that. The reason that JITing gets started
there is that the tables aren't analyzed and we end up with crazy ass
estimates about the cost of the queries. No useful setting of the cost
limits will protect against that... :(

I don't buy that line of argument one bit. No, we generally don't
analyze most of the regression test tables, but the planner still
knows that they're not very large. If JIT is kicking in for those
queries, the defaults are set wrong. Additional evidence for the
defaults being wrong is the number of reports we've had of JIT making
things slower.

I was OK with that happening during early beta, on the grounds of getting
more testing for the JIT code; but it's time to fix the numbers.

regards, tom lane

#264Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#263)
Re: JIT compiling with LLVM v12

Hi,

On 2018-08-22 18:15:29 -0400, Tom Lane wrote:

Andres Freund <andres@anarazel.de> writes:

On 2018-08-22 06:20:21 +0000, Noah Misch wrote:

Regardless of the choice of jit={on|off} default, these numbers tell me that
some or all of jit_*_cost defaults are too low.

I don't think it really shows that. The reason that JITing gets started
there is that the tables aren't analyzed and we end up with crazy ass
estimates about the cost of the queries. No useful setting of the cost
limits will protect against that... :(

I don't buy that line of argument one bit. No, we generally don't
analyze most of the regression test tables, but the planner still
knows that they're not very large. If JIT is kicking in for those
queries, the defaults are set wrong.

I looked at the queries that get JITed, I didn't just make that claim up
out of thin air. The first query that's JITed e.g. is:

+explain analyze SELECT '' AS tf_12, BOOLTBL1.*, BOOLTBL2.*
+   FROM BOOLTBL1, BOOLTBL2
+   WHERE BOOLTBL2.f1 <> BOOLTBL1.f1;
+                                                    QUERY PLAN
+------------------------------------------------------------------------------------------------------------------
+ Nested Loop  (cost=0.00..118524.73 rows=3948050 width=34) (actual time=8.376..8.390 rows=12 loops=1)
+   Join Filter: (booltbl2.f1 <> booltbl1.f1)
+   Rows Removed by Join Filter: 4
+   ->  Seq Scan on booltbl1  (cost=0.00..38.10 rows=2810 width=1) (actual time=0.018..0.019 rows=4 loops=1)
+   ->  Materialize  (cost=0.00..52.15 rows=2810 width=1) (actual time=0.004..0.005 rows=4 loops=4)
+         ->  Seq Scan on booltbl2  (cost=0.00..38.10 rows=2810 width=1) (actual time=0.007..0.009 rows=4 loops=1)
+ Planning Time: 0.074 ms
+ JIT:
+   Functions: 6
+   Generation Time: 0.935 ms
+   Inlining: false
+   Inlining Time: 0.000 ms
+   Optimization: false
+   Optimization Time: 0.451 ms
+   Emission Time: 7.716 ms
+ Execution Time: 43.466 ms
+(16 rows)

Now you can say that'd be solved by bumping the cost up, sure. But
obviously the row / cost model is pretty much out of whack here, I don't
see how we can make reasonable decisions in a trivial query that has a
misestimation by five orders of magnitude.

Another subsequent case is:
set enable_sort = off; -- try to make it pick a hash setop implementation
select '(2,5)'::cashrange except select '(5,6)'::cashrange;
which is expensive because a sort is chosen even though sort is disabled
(yes, this might be a bug in the test):
EXPLAIN select '(2,5)'::cashrange except select '(5,6)'::cashrange;
┌────────────────────────────────────────────────────────────────────────────────────┐
│ QUERY PLAN │
├────────────────────────────────────────────────────────────────────────────────────┤
│ SetOp Except (cost=10000000000.06..10000000000.07 rows=1 width=36) │
│ -> Sort (cost=10000000000.06..10000000000.06 rows=2 width=36) │
│ Sort Key: ('($2.00,$5.00)'::cashrange) │
│ -> Append (cost=0.00..0.05 rows=2 width=36) │
│ -> Subquery Scan on "*SELECT* 1" (cost=0.00..0.02 rows=1 width=36) │
│ -> Result (cost=0.00..0.01 rows=1 width=32) │
│ -> Subquery Scan on "*SELECT* 2" (cost=0.00..0.02 rows=1 width=36) │
│ -> Result (cost=0.00..0.01 rows=1 width=32) │
│ JIT: │
│ Functions: 7 │
│ Inlining: true │
│ Optimization: true │
└────────────────────────────────────────────────────────────────────────────────────┘
(12 rows)

Obviously the high costing here distorts things. Many of the other
cases here are along similar lines as the two cases before.

Additional evidence for the
defaults being wrong is the number of reports we've had of JIT making
things slower.

Maybe.

Greetings,

Andres Freund

#265Noah Misch
noah@leadboat.com
In reply to: Noah Misch (#257)
Re: JIT compiling with LLVM v12

On Wed, Aug 22, 2018 at 06:20:21AM +0000, Noah Misch wrote:

On Wed, Mar 28, 2018 at 02:27:51PM -0700, Andres Freund wrote:

For now LLVM is enabled by default when compiled --with-llvm. I'm mildly
inclined to leave it like that until shortly before the release, and
then disable it by default (i.e. change the default of jit=off). But I
think we can make that decision based on experience during the testing
window. I'm opening an open items entry for that.

I'll vote for jit=on and letting any bugs shake out earlier, but it's not a
strong preference.

In light of later discussion on this thread, my preference bore undue
optimism. I maintain that vote philosophically, but that course of action
probably entails too much short-term development work. jit=off is reasonable,
along with documentation changes to set expectations.

#266Robert Haas
robertmhaas@gmail.com
In reply to: Andres Freund (#264)
Re: JIT compiling with LLVM v12

On Wed, Aug 22, 2018 at 6:43 PM, Andres Freund <andres@anarazel.de> wrote:

Now you can say that'd be solved by bumping the cost up, sure. But
obviously the row / cost model is pretty much out of whack here, I don't
see how we can make reasonable decisions in a trivial query that has a
misestimation by five orders of magnitude.

Before JIT, it didn't matter whether the costing was wrong, provided
that the path with the lowest cost was the cheapest path (or at least
close enough to the cheapest path not to bother anyone). Now it does.
If the intended path is chosen but the costing is higher than it
should be, JIT will erroneously activate. If you had designed this in
such a way that we added separate paths for the JIT and non-JIT
versions and the JIT version had a bigger startup cost but a reduced
runtime cost, then you probably would not have run into this issue, or
at least not to the same degree. But as it is, JIT activates when the
plan looks expensive, regardless of whether activating JIT will do
anything to make it cheaper. As a blindingly obvious example, turning
on JIT to mitigate the effects of disable_cost is senseless, but as
you point out, that's exactly what happens right now.

I'd guess that, as you read this, you're thinking, well, but if I'd
added JIT and non-JIT paths for every option, it would have doubled
the number of paths, and that would have slowed the planner down way
too much. That's certainly true, but my point is just that the
problem is probably not as simple as "the defaults are too low". I
think the problem is more fundamentally that the model you've chosen
is kinda broken. I'm not saying I know how you could have done any
better, but I do think we're going to have to try to figure out
something to do about it, because saying, "check-pg_upgrade is 4x
slower, but that's just because of all those bad estimates" is not
going to fly. Those bad estimates were harmlessly bad before, and now
they are harmfully bad, and similar bad estimates are going to exist
in real-world queries, and those are going to be harmful now too.

Blaming the bad costing is a red herring. The problem is that you've
made the costing matter in a way that it previously didn't.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

#267Fabien COELHO
coelho@cri.ensmp.fr
In reply to: Robert Haas (#266)
Re: JIT compiling with LLVM v12

Now you can say that'd be solved by bumping the cost up, sure. But
obviously the row / cost model is pretty much out of whack here, I don't
see how we can make reasonable decisions in a trivial query that has a
misestimation by five orders of magnitude.

Before JIT, it didn't matter whether the costing was wrong, provided
that the path with the lowest cost was the cheapest path (or at least
close enough to the cheapest path not to bother anyone). Now it does.
If the intended path is chosen but the costing is higher than it
should be, JIT will erroneously activate. If you had designed this in
such a way that we added separate paths for the JIT and non-JIT
versions and the JIT version had a bigger startup cost but a reduced
runtime cost, then you probably would not have run into this issue, or
at least not to the same degree. But as it is, JIT activates when the
plan looks expensive, regardless of whether activating JIT will do
anything to make it cheaper. As a blindingly obvious example, turning
on JIT to mitigate the effects of disable_cost is senseless, but as
you point out, that's exactly what happens right now.

I'd guess that, as you read this, you're thinking, well, but if I'd
added JIT and non-JIT paths for every option, it would have doubled
the number of paths, and that would have slowed the planner down way
too much. That's certainly true, but my point is just that the
problem is probably not as simple as "the defaults are too low". I
think the problem is more fundamentally that the model you've chosen
is kinda broken. I'm not saying I know how you could have done any
better, but I do think we're going to have to try to figure out
something to do about it, because saying, "check-pg_upgrade is 4x
slower, but that's just because of all those bad estimates" is not
going to fly. Those bad estimates were harmlessly bad before, and now
they are harmfully bad, and similar bad estimates are going to exist
in real-world queries, and those are going to be harmful now too.

Blaming the bad costing is a red herring. The problem is that you've
made the costing matter in a way that it previously didn't.

My 0.02€ on this interesting subject.

Historically, external IOs, ak rotating disk accesses, have been the main
cost (by several order of magnitude) of executing database queries, and
cpu costs are relatively very low in most queries. The point of the query
planner is mostly to avoid very bad path wrt to IOs.

Now, even with significanly faster IOs, eg SSD's, IOs are still a few
order of magnitude slower, but less so, so cpu may matter more.

Now again, for small database data are often in memory and stay there, in
which case CPU is the only cost.

This would suggest the following approach to evaluating costs in the
planner:

(1) are the needed data already in memory? if so use cpu only costs this
implies that the planner would know about it... which is probably not the
case.

(2) if not, then optimise for IOs first, because they are likely to
be the main cost driver anyway.

(3) once an "IO-optimal" (eg not too bad) plan is selected, consider
whether to apply JIT to part of it: if cpu costs are significant and some
parts are likely to be executed a lot, with a significant high margin
because JIT costs.

Basically, I'm suggesting to reevaluate the selected plan, without
changing it, with a JIT cost to improve it, as a second stage.

--
Fabien.

#268Tels
nospam-pg-abuse@bloodgate.com
In reply to: Robert Haas (#266)
Re: JIT compiling with LLVM v12

Moin,

On Sat, August 25, 2018 9:34 pm, Robert Haas wrote:

On Wed, Aug 22, 2018 at 6:43 PM, Andres Freund <andres@anarazel.de> wrote:

Now you can say that'd be solved by bumping the cost up, sure. But
obviously the row / cost model is pretty much out of whack here, I don't
see how we can make reasonable decisions in a trivial query that has a
misestimation by five orders of magnitude.

Before JIT, it didn't matter whether the costing was wrong, provided
that the path with the lowest cost was the cheapest path (or at least
close enough to the cheapest path not to bother anyone). Now it does.
If the intended path is chosen but the costing is higher than it
should be, JIT will erroneously activate. If you had designed this in
such a way that we added separate paths for the JIT and non-JIT
versions and the JIT version had a bigger startup cost but a reduced
runtime cost, then you probably would not have run into this issue, or
at least not to the same degree. But as it is, JIT activates when the
plan looks expensive, regardless of whether activating JIT will do
anything to make it cheaper. As a blindingly obvious example, turning
on JIT to mitigate the effects of disable_cost is senseless, but as
you point out, that's exactly what happens right now.

I'd guess that, as you read this, you're thinking, well, but if I'd
added JIT and non-JIT paths for every option, it would have doubled
the number of paths, and that would have slowed the planner down way
too much. That's certainly true, but my point is just that the
problem is probably not as simple as "the defaults are too low". I
think the problem is more fundamentally that the model you've chosen
is kinda broken. I'm not saying I know how you could have done any
better, but I do think we're going to have to try to figure out
something to do about it, because saying, "check-pg_upgrade is 4x
slower, but that's just because of all those bad estimates" is not
going to fly. Those bad estimates were harmlessly bad before, and now
they are harmfully bad, and similar bad estimates are going to exist
in real-world queries, and those are going to be harmful now too.

Blaming the bad costing is a red herring. The problem is that you've
made the costing matter in a way that it previously didn't.

Hm, no, I don't quite follow this argument. Isn't trying to avoid "bad
costing having bad consequences" just hiding the symponts instead of
curing them? It would have a high development cost, and still bad
estimates could ruin your day in other places.

Wouldn't it be much smarter to look at why and how the bad costing appears
and try to fix this? If a query that returns 12 rows was estimated to
return about 4 million, something is wrong on a ridiculous scale.

If the costing didn't produce so much "to the moon" values, then it
wouldn't matter so much what later decisions do depending on it. I mean,
JIT is not the only thing here, even choosing the wrong plan can lead to
large runtime differences (think of a sort that spills to disk etc.)

So, is there a limit on how many rows can be estimated? Maybe based on
things like:

* how big the table is? E.g. a table with 2 pages can't have a million rows.
* what the column types are? E.g. if you do:

SELECT * FROM table WHERE id >= 100 AND id < 200;

you cannot have more than 100 rows as a result if "id" is a unique integer
column.
* Index size: You can't pull out more rows from an index than it contains,
maybe this helps limiting "worst estimate"?

These things might also be cheaper to implement that rewriting the entire
JIT model.

Also, why does PG allow the stats to be that outdated - or missing, I'm
not sure which case it is in this example. Shouldn't the system aim to
have at least some basic stats, even if the user never runs ANALYZE? Or is
this on purpose for these tests to see what happens?

Best regards,

Tels

#269Andres Freund
andres@anarazel.de
In reply to: Robert Haas (#266)
Re: JIT compiling with LLVM v12

Hi,

On 2018-08-25 21:34:22 -0400, Robert Haas wrote:

On Wed, Aug 22, 2018 at 6:43 PM, Andres Freund <andres@anarazel.de> wrote:

Now you can say that'd be solved by bumping the cost up, sure. But
obviously the row / cost model is pretty much out of whack here, I don't
see how we can make reasonable decisions in a trivial query that has a
misestimation by five orders of magnitude.

Before JIT, it didn't matter whether the costing was wrong, provided
that the path with the lowest cost was the cheapest path (or at least
close enough to the cheapest path not to bother anyone).

I don't thinkt that's really true. Due to the cost fuzzing absurdly high
cost very commonly lead to the actually different planning choices to
not have a large enough influence to matter.

I'd guess that, as you read this, you're thinking, well, but if I'd
added JIT and non-JIT paths for every option, it would have doubled
the number of paths, and that would have slowed the planner down way
too much. That's certainly true, but my point is just that the
problem is probably not as simple as "the defaults are too low". I
think the problem is more fundamentally that the model you've chosen
is kinda broken.

Right. And that's why I repeatedly brought up this part in
discussions... I still think it's a reasonable compromise, but it
certainly has costs.

I'm also doubtful that just adding a separate path for JIT (with a
significantly smaller cpu_*_cost or such) would really have helped in
the cases with borked estimations - we'd *still* end up choosing JITing
if the loop count is absurd, just because the cost is high.

There *are* cases where it helps - if all the cost is incurred, say, due
to random page fetches, then JITing isn't going to help that much.

I'm not saying I know how you could have done any better, but I do
think we're going to have to try to figure out something to do about
it, because saying, "check-pg_upgrade is 4x slower, but that's just
because of all those bad estimates" is not going to fly.

That I'm unconvinced by however. This was on some quite slow machine
and/or with LLVM assertions enabled - the performance difference on a
normal machine is smaller:

$ PGOPTIONS='-cjit=0' time make -s check
...
5.21user 2.11system 0:24.95elapsed 29%CPU (0avgtext+0avgdata 54212maxresident)k
20976inputs+340848outputs (14major+342228minor)pagefaults 0swaps

$ PGOPTIONS='-cjit=1' time make -s check
...
5.33user 2.01system 0:30.49elapsed 24%CPU (0avgtext+0avgdata 54236maxresident)k
0inputs+340856outputs (0major+342616minor)pagefaults 0swaps

But also importantly, I think there's actual advantages in triggering
JIT in some places in the regression tests. There's buildfarm animals
exercising the path that everything is JITed, but that's not really
helpful during development.

Those bad estimates were harmlessly bad before,

I think that's not true.

Greetings,

Andres Freund

#270Andres Freund
andres@anarazel.de
In reply to: Noah Misch (#257)
Re: JIT compiling with LLVM v12

Hi,

On 2018-08-22 06:20:21 +0000, Noah Misch wrote:

I see jit slows the regression tests considerably:

Is this with LLVM assertions enabled or not? The differences seem
bigger than what I'm observing, especially on the mips animal - which I
observe uses a separately installed LLVM build.

On my machine, with master, on a postgres assert build w/ non-debug llvm build:
PGOPTIONS='-c jit=0' time make -Otarget -j10 -s check-world && echo success || echo f
240.37user 55.55system 2:08.17elapsed 230%CPU (0avgtext+0avgdata 66264maxresident)k

PGOPTIONS='-c jit=1' time make -Otarget -j10 -s check-world && echo success || echo f
253.02user 55.77system 2:16.22elapsed 226%CPU (0avgtext+0avgdata 54756maxresident)k

Using your command, on a postgres optimized build w/ non-debug llvm build:

# x86_64, non-assert, w/o llvm
$ for n in 1 2 3; do env time make -C src/bin/pg_upgrade check; done 2>&1 | grep elapsed
7.64user 4.24system 0:36.40elapsed 32%CPU (0avgtext+0avgdata 36712maxresident)k
8.09user 4.50system 0:37.71elapsed 33%CPU (0avgtext+0avgdata 36712maxresident)k
7.53user 4.18system 0:36.54elapsed 32%CPU (0avgtext+0avgdata 36712maxresident)k

# x86_64, non-assert, w/ llvm trunk
$ for n in 1 2 3; do env time make -C src/bin/pg_upgrade check; done 2>&1 | grep elapsed
9.58user 5.79system 0:49.61elapsed 30%CPU (0avgtext+0avgdata 36712maxresident)k
9.47user 5.92system 0:47.84elapsed 32%CPU (0avgtext+0avgdata 36712maxresident)k
9.09user 5.51system 0:47.94elapsed 30%CPU (0avgtext+0avgdata 36712maxresident)k

andres@alap4:~/build/postgres/master-optimize/vpath$ for n in 1 2 3; do PGOPTIONS='-cjit=0' env time make -C src/bin/pg_upgrade check; done 2>&1 | grep elapsed
8.01user 3.63system 0:39.88elapsed 29%CPU (0avgtext+0avgdata 50196maxresident)k
7.96user 3.86system 0:39.70elapsed 29%CPU (0avgtext+0avgdata 50064maxresident)k
7.96user 3.80system 0:37.17elapsed 31%CPU (0avgtext+0avgdata 50148maxresident)k
andres@alap4:~/build/postgres/master-optimize/vpath$ for n in 1 2 3; do PGOPTIONS='-cjit=1' env time make -C src/bin/pg_upgrade check; done 2>&1 | grep elapsed
7.88user 3.76system 0:44.98elapsed 25%CPU (0avgtext+0avgdata 50092maxresident)k
7.99user 3.72system 0:46.53elapsed 25%CPU (0avgtext+0avgdata 50036maxresident)k
7.88user 3.87system 0:45.26elapsed 25%CPU (0avgtext+0avgdata 50132maxresident)k

So here the difference is smaller, but not hugely so.

# mips32el, assert, w/o llvm (buildfarm member topminnow) [1]
28min install-check-*
35min check-pg_upgrade

# mips32el, assert, w/ llvm 6.0.1 [1]
63min install-check-*
166min check-pg_upgrade

But this seems so absurdly large of a difference that I kinda think LLVM
assertions (wich are really expensive and add O(N) operations in a bunch
of places) might be to blame.

Greetings,

Andres Freund

#271Noah Misch
noah@leadboat.com
In reply to: Andres Freund (#270)
Re: JIT compiling with LLVM v12

On Wed, Sep 05, 2018 at 11:55:39AM -0700, Andres Freund wrote:

On 2018-08-22 06:20:21 +0000, Noah Misch wrote:

I see jit slows the regression tests considerably:

Is this with LLVM assertions enabled or not?

Without, I think. I configured them like this:
cmake -G Ninja -DCMAKE_INSTALL_PREFIX=$HOME/sw/nopath/llvm -DCMAKE_BUILD_TYPE=MinSizeRel -DLLVM_USE_LINKER=gold -DLLVM_TARGETS_TO_BUILD=X86 ../llvm
cmake -G Ninja -DCMAKE_INSTALL_PREFIX=$HOME/sw/nopath/llvm-el32 -DCMAKE_BUILD_TYPE=MinSizeRel -DLLVM_USE_LINKER=gold -DLLVM_PARALLEL_LINK_JOBS=1 ../llvm

# mips32el, assert, w/o llvm (buildfarm member topminnow) [1]
28min install-check-*
35min check-pg_upgrade

# mips32el, assert, w/ llvm 6.0.1 [1]
63min install-check-*
166min check-pg_upgrade

But this seems so absurdly large of a difference that I kinda think LLVM
assertions (wich are really expensive and add O(N) operations in a bunch
of places) might be to blame.

The 2018-08-25 and 2018-09-01 published runs were far less bad. Most of the
blame goes to the reason given in the footnote (competing load on a shared
machine), not to JIT.