Skip to content

Instantly share code, notes, and snippets.

@tonmcg
Last active January 4, 2024 06:50
Show Gist options
  • Save tonmcg/6c64614758c73cafe266ad4f3b81f60f to your computer and use it in GitHub Desktop.
Save tonmcg/6c64614758c73cafe266ad4f3b81f60f to your computer and use it in GitHub Desktop.
Moving Bubbles + Vue + GSAP + D3

This visualization tracks a sample of couples in the 1970's to show how long they transition through relationship stages. It is wholly based on Nathan Yau's The Stages of Relationships, Distributed and his companion tutorial How to Make a Moving Bubble Chart, Based on a Dataset (note: you'll need a FlowingData membership to view this tutorial.)

Nathan's example uses D3.js to get the data, render the text and circles, simulate physical forces, apply transitions and animations, and update DOM elements. This example uses the browser's native Fetch API to get the data, Vue.js instance lifecycle statges to update the data and render the circles and text; GSAP to transition and animate SVG circles and text; and finally, D3.js to simulate physical forces on the circles.

The idea here is twofold: 1) to use the latest JavaScript frameworks to create a fast, responsive, and nimble visualization application and 2) to ask of these frameworks to do what they do best: D3.js to represent geometric and mathematical abstractions as SVG elements; Vue.js to manage the application's state via a virtual DOM; and GSAP to quickly transition and animate.

To the extent possible, I try to avoid D3.js General Update Pattern since it operates on the DOM directly, which in theory can be more computationally expensive than doing the same through a virtual DOM.

Colors chosen by my daughter Eliza.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Moving Bubbles + Vue + GSAP + D3</title>
<style type="text/css" media="screen">
body {
font-family: "Courier New", Georgia;
background: #f4f4f4;
}
#main-wrapper {
margin: 40px auto;
}
#chart {
margin: 0px auto;
}
h1 {
font-size: 3em;
padding: 0px;
font-weight: normal;
text-align: center;
text-transform: uppercase;
}
h2 {
font-size: 1.5em;
padding: 0px;
font-weight: normal;
text-align: center;
}
.lede {
font-style: italic;
font-weight: 400;
font-size: .9em;
font-size: 14px;
line-height: 1.4em;
text-align: center;
}
.circles-move {
transition: transform 1s;
}
</style>
</head>
<body>
<!-- header template -->
<script type="text/x-template" id="time-header">
<div>
<h1 class="g-header centered">Time After First Meeting</h1>
<p class="lede centered" style="margin-bottom:0rem">Viewing the timeline of relationship stages of couples from the 1970s.</p>
<h2 id="timecount">Time so far:
<span
class="cnt"
>{{animatedTime}}
</span>
</h2>
</div>
</script>
<!-- category name template -->
<script type="text/x-template" id="category-name">
<text
class="grpname"
text-anchor="middle"
:x="x"
:name="name"
:fill="fill"
:stroke="animatedColor"
>{{categoryName}}
</text>
</script>
<!-- category count template -->
<script type="text/x-template" id="category-count">
<text
class="grpcnt"
text-anchor="middle"
:x="x"
:count="count"
:stroke="animatedColor"
>{{tweenedCount}}
</text>
</script>
<!-- circle template -->
<script type="text/x-template" id="svg-circle">
<circle
:r="animatedRadius"
:stroke="stroke"
:stroke-width="strokewidth"
:opacity="opacity"
:fill-opacity="fillopacity"
:stroke-opacity="strokeopacity"
:fill="fill"
ref="circle"></circle>
</script>
<!-- Vue render -->
<div id="main-wrapper">
<div id="chart">
<time-header :elapsedtime="time_so_far"></time-header>
<svg :width="chart.width + margins.left + margins.right"
:height="chart.height + margins.top + margins.bottom"
:style="(chart. width + margins.left + margins.right)+'px'">
<transition-group tag="g" name="circles" :css="false" @enter="enter" class="transitionGroup">
<g v-for="(datum, i) in nodes" :key="i" class="circleGroup">
<svg-circle :id="'key_' + i" :r="datum.r" :cx="datum.x" :cy="datum.y" :fill="datum.color"
stroke="#a39193">
</svg-circle>
</g>
</transition-group>
<g v-for="(key) in Object.keys(groups)" :key="key">
<category-name :x="groups[key].x" :fill="groups[key].color" :name="groups[key].fullname" y="50">
</category-name>
<category-count :x="groups[key].x" :fill="groups[key].color" :count="groups[key].cnt" y="70">
</category-count>
</g>
</svg>
</div>
</div><!-- @end #main-wrapper -->
<script src="https://unpkg.com/vue"></script>
<script src="https://d3js.org/d3-dispatch.v1.min.js"></script>
<script src="https://d3js.org/d3-quadtree.v1.min.js"></script>
<script src="https://d3js.org/d3-timer.v1.min.js"></script>
<script src="https://d3js.org/d3-force.v2.js"></script>
<script src="https://d3js.org/d3-dsv.v1.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/2.1.2/TweenMax.min.js"></script>
<!-- Vue instance -->
<script src="main.js"></script>
</body>
</html>
Vue.component('time-header', {
template: '#time-header',
props: {
elapsedtime: {
type: Number,
default: 0
}
},
data: function () {
return {
tweenedTime: this.elapsedtime
};
},
watch: {
elapsedtime: function (newVal) {
TweenLite.to(this.$data,
0.75, {
tweenedTime: newVal,
roundProps: "tweenedTime"
});
}
},
computed: {
animatedTime: function () {
let tweenedTime = this.tweenedTime;
let tweenedMsg = null;
if (tweenedTime == 1) {
tweenedMsg = tweenedTime + ' ' + 'Month';
} else if (tweenedTime < 12) {
tweenedMsg = tweenedTime + ' ' + 'Months';
} else {
let year = parseInt(tweenedTime / 12);
let month = tweenedTime % 12;
let yearText = year > 1 ? year + ' Years' : year + ' Year';
let monthText = month == 0 ? '' : month == 1 ? month + ' Month' : month + ' Months';
let dateText = month == 0 ? yearText : yearText + ', ' + monthText;
tweenedMsg = dateText;
}
return tweenedMsg;
}
}
});
Vue.component('category-count', {
template: '#category-count',
props: {
x: {
type: Number,
default: 0
},
fill: {
type: String
},
count: {
type: Number,
default: 0
}
},
data: function () {
return {
tweenedCount: this.count,
categoryColor: this.fill
};
},
watch: {
count: function (newVal) {
TweenLite.to(this.$data,
0.75, {
tweenedCount: newVal,
roundProps: "tweenedCount"
});
}
},
methods: {},
computed: {
animatedCount: function () {
return this.tweenedCount;
},
animatedColor: function () {
return this.categoryColor;
}
}
});
Vue.component('category-name', {
template: '#category-name',
props: {
x: {
type: Number,
default: 0
},
fill: {
type: String
},
name: {
type: String
}
},
data: function () {
return {
categoryName: this.name,
categoryColor: this.fill
};
},
computed: {
animatedColor: function () {
return this.categoryColor;
}
}
});
Vue.component('svg-circle', {
template: '#svg-circle',
props: {
r: {
type: Number,
default: 3
},
stroke: {
type: String,
default: 'black'
},
strokewidth: {
type: Number,
default: 0.75
},
opacity: {
type: String,
default: '0.8'
},
fillopacity: {
type: String,
default: '1'
},
strokeopacity: {
type: String,
default: '1'
},
fill: {
type: String,
default: 'steelblue'
}
},
data: function () {
return {
tweenRadius: this.r
};
},
watch: {
r: function (newVal) {
TweenLite.to(this.$data,
0.75, {
tweenRadius: newVal
});
}
},
methods: {
circleClick: function (event) {
console.log("This is the circleClick function to handle the click event.\nInfo on the event: ", event.target.value);
}
},
computed: {
animatedRadius: function () {
return this.tweenRadius;
}
}
});
new Vue({
el: '#chart',
data: function () {
return {
chart: {
width: window.innerWidth,
height: 360
},
margins: {
top: 20,
right: 20,
bottom: 20,
left: 20
},
colors: ['#66545e', '#aa6f73', '#eea990', '#000000'],
simulation: null,
radius: 5,
padding: 0.5, // Space between nodes
cluster_padding: 5,
groups: {},
people: {},
nodes: [],
time_so_far: 0
};
},
mounted: function () {
this.calculateGroups();
fetch('./stages.json', {
headers: {
"Method": "GET",
"Accept": "applicaiton/json"
}
})
.then(response =>
response.json()
)
.then(results => {
this.parseData(results);
this.computeNodes();
this.simulation = d3.forceSimulation(this.nodes)
.force("x", d => d3.forceX(d.x))
.force("y", d => d3.forceY(d.y))
.force("cluster", this.forceCluster())
.force("collide", this.forceCollide())
.alpha(0.35)
.alphaDecay(0)
;
});
setTimeout(() => {
this.movePosition();
setInterval(() => {
this.movePosition();
}, 2000);
}, 5000);
},
methods: {
parseData: function (data) {
let that = this;
data.forEach(d => {
if (Object.keys(that.people).indexOf(d.pid + "") > -1) {
that.people[d.pid + ""].push(d);
} else {
that.people[d.pid + ""] = [d];
}
});
},
calculateGroups: function () {
this.groups = {
"met": {
x: this.chart.width / 5,
y: this.chart.height / 2,
color: this.colors[0],
cnt: 0,
fullname: "Met"
},
"romantic": {
x: 2 * this.chart.width / 5,
y: this.chart.height / 2,
color: this.colors[1],
cnt: 0,
fullname: "Romantic"
},
"lived": {
x: 3 * this.chart.width / 5,
y: this.chart.height / 2,
color: this.colors[2],
cnt: 0,
fullname: "Lived Together"
},
"married": {
x: 4 * this.chart.width / 5,
y: this.chart.height / 2,
color: this.colors[3],
cnt: 0,
fullname: "Married"
}
};
},
computeNodes: function () {
let that = this;
this.nodes = Object.keys(this.people).map(function (d) {
// Initialize count for each group.
that.groups[that.people[d][0].grp].cnt += 1;
return {
id: "node" + d,
x: that.groups[that.people[d][0].grp].x + Math.random(),
y: that.groups[that.people[d][0].grp].y + Math.random(),
r: that.radius,
color: that.groups[that.people[d][0].grp].color,
group: that.people[d][0].grp,
timeleft: that.people[d][0].duration,
istage: 0,
stages: that.people[d]
};
});
},
forceCluster: function () {
const strength = 0.11;
let nodes;
let that = this;
function force(alpha) {
const l = alpha * strength;
for (const d of nodes) {
d.vx -= (d.x - that.groups[d.group].x) * l;
d.vy -= (d.y - that.groups[d.group].y) * l;
}
}
force.initialize = _ => nodes = _;
return force;
},
forceCollide: function () {
const alpha = 0.2;
const padding1 = this.padding;
const padding2 = this.cluster_padding;
let nodes;
let maxRadius;
function force() {
const quadtree = d3.quadtree(nodes, d => d.x, d => d.y);
for (const d of nodes) {
const r = d.r + maxRadius;
const nx1 = d.x - r,
ny1 = d.y - r;
const nx2 = d.x + r,
ny2 = d.y + r;
quadtree.visit((q, x1, y1, x2, y2) => {
if (!q.length)
do {
if (q.data !== d) {
const r = d.r + q.data.r + (d.group === q.data.group ? padding1 : padding2);
let x = d.x - q.data.x,
y = d.y - q.data.y,
l = Math.hypot(x, y);
if (l < r) {
l = (l - r) / l * alpha;
d.x -= x *= l, d.y -= y *= l;
q.data.x += x, q.data.y += y;
}
}
} while (q = q.next);
return x1 > nx2 || x2 < nx1 || y1 > ny2 || y2 < ny1;
});
}
}
force.initialize = _ => maxRadius = Math.max(nodes = _, d => d.r) + Math.max(padding1, padding2);
return force;
},
enter: function (el, i) {
const circle = el.children[0];
const currRadius = circle.getAttribute('r');
const currId = circle.getAttribute('id');
let currIndex = Number(currId.slice(currId.indexOf("_") + 1, currId.length));
TweenLite.fromTo(
circle,
0.5, {
attr: {
r: 0
}
}, {
attr: {
r: currRadius
},
delay: 0.005 * currIndex
}
);
},
movePosition: function () {
let that = this;
this.nodes.forEach((node) => {
node.timeleft -= 1;
if (node.timeleft == 0 && node.istage < node.stages.length - 1) {
// Decrease count for previous group.
that.groups[node.group].cnt -= 1;
// Update current node to new group.
node.istage += 1;
node.group = node.stages[node.istage].grp;
node.timeleft = node.stages[node.istage].duration;
// Increment count for new group.
that.groups[node.group].cnt += 1;
}
});
this.time_so_far += 1;
}
}
});
[
{
"pid": 1,
"grp": "met",
"duration": 16
},
{
"pid": 1,
"grp": "lived",
"duration": 246
},
{
"pid": 1,
"grp": "married",
"duration": -99
},
{
"pid": 2,
"grp": "met",
"duration": 46
},
{
"pid": 2,
"grp": "romantic",
"duration": 3
},
{
"pid": 2,
"grp": "lived",
"duration": 89
},
{
"pid": 2,
"grp": "married",
"duration": -99
},
{
"pid": 3,
"grp": "met",
"duration": 26
},
{
"pid": 3,
"grp": "romantic",
"duration": 21
},
{
"pid": 3,
"grp": "married",
"duration": -99
},
{
"pid": 4,
"grp": "met",
"duration": 7
},
{
"pid": 4,
"grp": "romantic",
"duration": 10
},
{
"pid": 4,
"grp": "lived",
"duration": 17
},
{
"pid": 4,
"grp": "married",
"duration": -99
},
{
"pid": 5,
"grp": "romantic",
"duration": 114
},
{
"pid": 5,
"grp": "married",
"duration": -99
},
{
"pid": 6,
"grp": "met",
"duration": 28
},
{
"pid": 6,
"grp": "romantic",
"duration": 47
},
{
"pid": 6,
"grp": "married",
"duration": -99
},
{
"pid": 7,
"grp": "met",
"duration": 9
},
{
"pid": 7,
"grp": "romantic",
"duration": 45
},
{
"pid": 7,
"grp": "lived",
"duration": 24
},
{
"pid": 7,
"grp": "married",
"duration": -99
},
{
"pid": 8,
"grp": "met",
"duration": 1
},
{
"pid": 8,
"grp": "romantic",
"duration": 95
},
{
"pid": 8,
"grp": "lived",
"duration": 16
},
{
"pid": 8,
"grp": "married",
"duration": -99
},
{
"pid": 9,
"grp": "met",
"duration": 5
},
{
"pid": 9,
"grp": "romantic",
"duration": 31
},
{
"pid": 9,
"grp": "lived",
"duration": 40
},
{
"pid": 9,
"grp": "married",
"duration": -99
},
{
"pid": 10,
"grp": "met",
"duration": 35
},
{
"pid": 10,
"grp": "romantic",
"duration": 130
},
{
"pid": 10,
"grp": "married",
"duration": -99
},
{
"pid": 11,
"grp": "met",
"duration": 22
},
{
"pid": 11,
"grp": "romantic",
"duration": 74
},
{
"pid": 11,
"grp": "lived",
"duration": 26
},
{
"pid": 11,
"grp": "married",
"duration": -99
},
{
"pid": 12,
"grp": "met",
"duration": 1
},
{
"pid": 12,
"grp": "romantic",
"duration": 16
},
{
"pid": 12,
"grp": "lived",
"duration": 13
},
{
"pid": 12,
"grp": "married",
"duration": -99
},
{
"pid": 13,
"grp": "met",
"duration": 2
},
{
"pid": 13,
"grp": "romantic",
"duration": 61
},
{
"pid": 13,
"grp": "lived",
"duration": 11
},
{
"pid": 13,
"grp": "married",
"duration": -99
},
{
"pid": 14,
"grp": "met",
"duration": 13
},
{
"pid": 14,
"grp": "romantic",
"duration": 6
},
{
"pid": 14,
"grp": "lived",
"duration": 22
},
{
"pid": 14,
"grp": "married",
"duration": -99
},
{
"pid": 15,
"grp": "met",
"duration": 108
},
{
"pid": 15,
"grp": "romantic",
"duration": 7
},
{
"pid": 15,
"grp": "married",
"duration": -99
},
{
"pid": 16,
"grp": "lived",
"duration": 19
},
{
"pid": 16,
"grp": "married",
"duration": -99
},
{
"pid": 17,
"grp": "met",
"duration": 1
},
{
"pid": 17,
"grp": "romantic",
"duration": 4
},
{
"pid": 17,
"grp": "lived",
"duration": 32
},
{
"pid": 17,
"grp": "married",
"duration": -99
},
{
"pid": 18,
"grp": "met",
"duration": 7
},
{
"pid": 18,
"grp": "romantic",
"duration": 10
},
{
"pid": 18,
"grp": "lived",
"duration": 17
},
{
"pid": 18,
"grp": "married",
"duration": -99
},
{
"pid": 19,
"grp": "met",
"duration": 17
},
{
"pid": 19,
"grp": "romantic",
"duration": 33
},
{
"pid": 19,
"grp": "lived",
"duration": 44
},
{
"pid": 19,
"grp": "married",
"duration": -99
},
{
"pid": 20,
"grp": "romantic",
"duration": 1
},
{
"pid": 20,
"grp": "lived",
"duration": 118
},
{
"pid": 20,
"grp": "married",
"duration": -99
},
{
"pid": 21,
"grp": "met",
"duration": 11
},
{
"pid": 21,
"grp": "romantic",
"duration": 7
},
{
"pid": 21,
"grp": "lived",
"duration": 9
},
{
"pid": 21,
"grp": "married",
"duration": -99
},
{
"pid": 22,
"grp": "romantic",
"duration": 6
},
{
"pid": 22,
"grp": "lived",
"duration": 14
},
{
"pid": 22,
"grp": "married",
"duration": -99
},
{
"pid": 23,
"grp": "met",
"duration": 90
},
{
"pid": 23,
"grp": "romantic",
"duration": 21
},
{
"pid": 23,
"grp": "lived",
"duration": 44
},
{
"pid": 23,
"grp": "married",
"duration": -99
},
{
"pid": 24,
"grp": "met",
"duration": 50
},
{
"pid": 24,
"grp": "romantic",
"duration": 40
},
{
"pid": 24,
"grp": "lived",
"duration": 2
},
{
"pid": 24,
"grp": "married",
"duration": -99
},
{
"pid": 25,
"grp": "met",
"duration": 69
},
{
"pid": 25,
"grp": "romantic",
"duration": 5
},
{
"pid": 25,
"grp": "lived",
"duration": 17
},
{
"pid": 25,
"grp": "married",
"duration": -99
},
{
"pid": 26,
"grp": "met",
"duration": 3
},
{
"pid": 26,
"grp": "romantic",
"duration": 6
},
{
"pid": 26,
"grp": "married",
"duration": -99
},
{
"pid": 27,
"grp": "met",
"duration": 26
},
{
"pid": 27,
"grp": "romantic",
"duration": 12
},
{
"pid": 27,
"grp": "lived",
"duration": 7
},
{
"pid": 27,
"grp": "married",
"duration": -99
},
{
"pid": 28,
"grp": "romantic",
"duration": 43
},
{
"pid": 28,
"grp": "lived",
"duration": 36
},
{
"pid": 28,
"grp": "married",
"duration": -99
},
{
"pid": 29,
"grp": "met",
"duration": 1
},
{
"pid": 29,
"grp": "romantic",
"duration": 34
},
{
"pid": 29,
"grp": "lived",
"duration": 230
},
{
"pid": 29,
"grp": "married",
"duration": -99
},
{
"pid": 30,
"grp": "met",
"duration": 119
},
{
"pid": 30,
"grp": "romantic",
"duration": 20
},
{
"pid": 30,
"grp": "lived",
"duration": 19
},
{
"pid": 30,
"grp": "married",
"duration": -99
},
{
"pid": 31,
"grp": "met",
"duration": 220
},
{
"pid": 31,
"grp": "romantic",
"duration": 4
},
{
"pid": 31,
"grp": "lived",
"duration": 2
},
{
"pid": 31,
"grp": "married",
"duration": -99
},
{
"pid": 32,
"grp": "met",
"duration": 3
},
{
"pid": 32,
"grp": "lived",
"duration": 63
},
{
"pid": 32,
"grp": "married",
"duration": -99
},
{
"pid": 33,
"grp": "met",
"duration": 93
},
{
"pid": 33,
"grp": "romantic",
"duration": 50
},
{
"pid": 33,
"grp": "married",
"duration": -99
},
{
"pid": 34,
"grp": "romantic",
"duration": 32
},
{
"pid": 34,
"grp": "lived",
"duration": 101
},
{
"pid": 34,
"grp": "married",
"duration": -99
},
{
"pid": 35,
"grp": "met",
"duration": 5
},
{
"pid": 35,
"grp": "romantic",
"duration": 378
},
{
"pid": 35,
"grp": "lived",
"duration": 1
},
{
"pid": 35,
"grp": "married",
"duration": -99
},
{
"pid": 36,
"grp": "met",
"duration": 11
},
{
"pid": 36,
"grp": "romantic",
"duration": 2
},
{
"pid": 36,
"grp": "lived",
"duration": 24
},
{
"pid": 36,
"grp": "married",
"duration": -99
},
{
"pid": 37,
"grp": "romantic",
"duration": 5
},
{
"pid": 37,
"grp": "married",
"duration": -99
},
{
"pid": 38,
"grp": "romantic",
"duration": 21
},
{
"pid": 38,
"grp": "lived",
"duration": 33
},
{
"pid": 38,
"grp": "married",
"duration": -99
},
{
"pid": 39,
"grp": "met",
"duration": 1
},
{
"pid": 39,
"grp": "romantic",
"duration": 2
},
{
"pid": 39,
"grp": "married",
"duration": -99
},
{
"pid": 40,
"grp": "met",
"duration": 2
},
{
"pid": 40,
"grp": "romantic",
"duration": 41
},
{
"pid": 40,
"grp": "lived",
"duration": 139
},
{
"pid": 40,
"grp": "married",
"duration": -99
},
{
"pid": 41,
"grp": "met",
"duration": 31
},
{
"pid": 41,
"grp": "romantic",
"duration": 57
},
{
"pid": 41,
"grp": "married",
"duration": -99
},
{
"pid": 42,
"grp": "met",
"duration": 10
},
{
"pid": 42,
"grp": "romantic",
"duration": 2
},
{
"pid": 42,
"grp": "lived",
"duration": 36
},
{
"pid": 42,
"grp": "married",
"duration": -99
},
{
"pid": 43,
"grp": "met",
"duration": 22
},
{
"pid": 43,
"grp": "romantic",
"duration": 74
},
{
"pid": 43,
"grp": "lived",
"duration": 26
},
{
"pid": 43,
"grp": "married",
"duration": -99
},
{
"pid": 44,
"grp": "met",
"duration": 1
},
{
"pid": 44,
"grp": "romantic",
"duration": 2
},
{
"pid": 44,
"grp": "married",
"duration": -99
},
{
"pid": 45,
"grp": "romantic",
"duration": 1
},
{
"pid": 45,
"grp": "lived",
"duration": 2
},
{
"pid": 45,
"grp": "married",
"duration": -99
},
{
"pid": 46,
"grp": "met",
"duration": 1
},
{
"pid": 46,
"grp": "romantic",
"duration": 20
},
{
"pid": 46,
"grp": "lived",
"duration": 70
},
{
"pid": 46,
"grp": "married",
"duration": -99
},
{
"pid": 47,
"grp": "met",
"duration": 21
},
{
"pid": 47,
"grp": "lived",
"duration": 12
},
{
"pid": 47,
"grp": "married",
"duration": -99
},
{
"pid": 48,
"grp": "met",
"duration": 57
},
{
"pid": 48,
"grp": "romantic",
"duration": 193
},
{
"pid": 48,
"grp": "lived",
"duration": 9
},
{
"pid": 48,
"grp": "married",
"duration": -99
},
{
"pid": 49,
"grp": "met",
"duration": 3
},
{
"pid": 49,
"grp": "romantic",
"duration": 12
},
{
"pid": 49,
"grp": "lived",
"duration": 16
},
{
"pid": 49,
"grp": "married",
"duration": -99
},
{
"pid": 50,
"grp": "romantic",
"duration": 45
},
{
"pid": 50,
"grp": "lived",
"duration": 1
},
{
"pid": 50,
"grp": "married",
"duration": -99
},
{
"pid": 51,
"grp": "met",
"duration": 3
},
{
"pid": 51,
"grp": "romantic",
"duration": 21
},
{
"pid": 51,
"grp": "lived",
"duration": 13
},
{
"pid": 51,
"grp": "married",
"duration": -99
},
{
"pid": 52,
"grp": "met",
"duration": 9
},
{
"pid": 52,
"grp": "romantic",
"duration": 45
},
{
"pid": 52,
"grp": "lived",
"duration": 24
},
{
"pid": 52,
"grp": "married",
"duration": -99
},
{
"pid": 53,
"grp": "met",
"duration": 3
},
{
"pid": 53,
"grp": "lived",
"duration": 10
},
{
"pid": 53,
"grp": "married",
"duration": -99
},
{
"pid": 54,
"grp": "met",
"duration": 3
},
{
"pid": 54,
"grp": "romantic",
"duration": 2
},
{
"pid": 54,
"grp": "lived",
"duration": 109
},
{
"pid": 54,
"grp": "married",
"duration": -99
},
{
"pid": 55,
"grp": "met",
"duration": 3
},
{
"pid": 55,
"grp": "romantic",
"duration": 7
},
{
"pid": 55,
"grp": "lived",
"duration": 11
},
{
"pid": 55,
"grp": "married",
"duration": -99
},
{
"pid": 56,
"grp": "met",
"duration": 31
},
{
"pid": 56,
"grp": "romantic",
"duration": 161
},
{
"pid": 56,
"grp": "lived",
"duration": 13
},
{
"pid": 56,
"grp": "married",
"duration": -99
},
{
"pid": 57,
"grp": "romantic",
"duration": 31
},
{
"pid": 57,
"grp": "married",
"duration": -99
},
{
"pid": 58,
"grp": "met",
"duration": 22
},
{
"pid": 58,
"grp": "romantic",
"duration": 74
},
{
"pid": 58,
"grp": "lived",
"duration": 26
},
{
"pid": 58,
"grp": "married",
"duration": -99
},
{
"pid": 59,
"grp": "met",
"duration": 3
},
{
"pid": 59,
"grp": "romantic",
"duration": 21
},
{
"pid": 59,
"grp": "lived",
"duration": 13
},
{
"pid": 59,
"grp": "married",
"duration": -99
},
{
"pid": 60,
"grp": "romantic",
"duration": 3
},
{
"pid": 60,
"grp": "lived",
"duration": 22
},
{
"pid": 60,
"grp": "married",
"duration": -99
},
{
"pid": 61,
"grp": "met",
"duration": 31
},
{
"pid": 61,
"grp": "romantic",
"duration": 13
},
{
"pid": 61,
"grp": "lived",
"duration": 30
},
{
"pid": 61,
"grp": "married",
"duration": -99
},
{
"pid": 62,
"grp": "met",
"duration": 49
},
{
"pid": 62,
"grp": "romantic",
"duration": 35
},
{
"pid": 62,
"grp": "lived",
"duration": 18
},
{
"pid": 62,
"grp": "married",
"duration": -99
},
{
"pid": 63,
"grp": "met",
"duration": 1
},
{
"pid": 63,
"grp": "romantic",
"duration": 46
},
{
"pid": 63,
"grp": "married",
"duration": -99
},
{
"pid": 64,
"grp": "met",
"duration": 1
},
{
"pid": 64,
"grp": "romantic",
"duration": 11
},
{
"pid": 64,
"grp": "lived",
"duration": 16
},
{
"pid": 64,
"grp": "married",
"duration": -99
},
{
"pid": 65,
"grp": "romantic",
"duration": 25
},
{
"pid": 65,
"grp": "lived",
"duration": 102
},
{
"pid": 65,
"grp": "married",
"duration": -99
},
{
"pid": 66,
"grp": "met",
"duration": 1
},
{
"pid": 66,
"grp": "romantic",
"duration": 27
},
{
"pid": 66,
"grp": "lived",
"duration": 42
},
{
"pid": 66,
"grp": "married",
"duration": -99
},
{
"pid": 67,
"grp": "met",
"duration": 3
},
{
"pid": 67,
"grp": "romantic",
"duration": 2
},
{
"pid": 67,
"grp": "lived",
"duration": 10
},
{
"pid": 67,
"grp": "married",
"duration": -99
},
{
"pid": 68,
"grp": "met",
"duration": 21
},
{
"pid": 68,
"grp": "lived",
"duration": 12
},
{
"pid": 68,
"grp": "married",
"duration": -99
},
{
"pid": 69,
"grp": "met",
"duration": 87
},
{
"pid": 69,
"grp": "romantic",
"duration": 16
},
{
"pid": 69,
"grp": "married",
"duration": -99
},
{
"pid": 70,
"grp": "met",
"duration": 3
},
{
"pid": 70,
"grp": "romantic",
"duration": 1
},
{
"pid": 70,
"grp": "lived",
"duration": 90
},
{
"pid": 70,
"grp": "married",
"duration": -99
},
{
"pid": 71,
"grp": "met",
"duration": 1
},
{
"pid": 71,
"grp": "romantic",
"duration": 3
},
{
"pid": 71,
"grp": "lived",
"duration": 77
},
{
"pid": 71,
"grp": "married",
"duration": -99
},
{
"pid": 72,
"grp": "met",
"duration": 1
},
{
"pid": 72,
"grp": "romantic",
"duration": 5
},
{
"pid": 72,
"grp": "lived",
"duration": 5
},
{
"pid": 72,
"grp": "married",
"duration": -99
},
{
"pid": 73,
"grp": "romantic",
"duration": 4
},
{
"pid": 73,
"grp": "lived",
"duration": 8
},
{
"pid": 73,
"grp": "married",
"duration": -99
},
{
"pid": 74,
"grp": "romantic",
"duration": 41
},
{
"pid": 74,
"grp": "lived",
"duration": 34
},
{
"pid": 74,
"grp": "married",
"duration": -99
},
{
"pid": 75,
"grp": "met",
"duration": 67
},
{
"pid": 75,
"grp": "romantic",
"duration": 8
},
{
"pid": 75,
"grp": "lived",
"duration": 33
},
{
"pid": 75,
"grp": "married",
"duration": -99
},
{
"pid": 76,
"grp": "met",
"duration": 3
},
{
"pid": 76,
"grp": "romantic",
"duration": 4
},
{
"pid": 76,
"grp": "married",
"duration": -99
},
{
"pid": 77,
"grp": "romantic",
"duration": 9
},
{
"pid": 77,
"grp": "lived",
"duration": 29
},
{
"pid": 77,
"grp": "married",
"duration": -99
},
{
"pid": 78,
"grp": "met",
"duration": 28
},
{
"pid": 78,
"grp": "romantic",
"duration": 22
},
{
"pid": 78,
"grp": "lived",
"duration": 21
},
{
"pid": 78,
"grp": "married",
"duration": -99
},
{
"pid": 79,
"grp": "met",
"duration": 1
},
{
"pid": 79,
"grp": "romantic",
"duration": 9
},
{
"pid": 79,
"grp": "lived",
"duration": 25
},
{
"pid": 79,
"grp": "married",
"duration": -99
},
{
"pid": 80,
"grp": "romantic",
"duration": 2
},
{
"pid": 80,
"grp": "lived",
"duration": 15
},
{
"pid": 80,
"grp": "married",
"duration": -99
},
{
"pid": 81,
"grp": "met",
"duration": 9
},
{
"pid": 81,
"grp": "romantic",
"duration": 21
},
{
"pid": 81,
"grp": "lived",
"duration": 127
},
{
"pid": 81,
"grp": "married",
"duration": -99
},
{
"pid": 82,
"grp": "met",
"duration": 5
},
{
"pid": 82,
"grp": "romantic",
"duration": 7
},
{
"pid": 82,
"grp": "married",
"duration": -99
},
{
"pid": 83,
"grp": "romantic",
"duration": 63
},
{
"pid": 83,
"grp": "lived",
"duration": 11
},
{
"pid": 83,
"grp": "married",
"duration": -99
},
{
"pid": 84,
"grp": "romantic",
"duration": 5
},
{
"pid": 84,
"grp": "lived",
"duration": 52
},
{
"pid": 84,
"grp": "married",
"duration": -99
},
{
"pid": 85,
"grp": "met",
"duration": 286
},
{
"pid": 85,
"grp": "romantic",
"duration": 6
},
{
"pid": 85,
"grp": "lived",
"duration": 13
},
{
"pid": 85,
"grp": "married",
"duration": -99
},
{
"pid": 86,
"grp": "met",
"duration": 39
},
{
"pid": 86,
"grp": "romantic",
"duration": 13
},
{
"pid": 86,
"grp": "lived",
"duration": 8
},
{
"pid": 86,
"grp": "married",
"duration": -99
},
{
"pid": 87,
"grp": "met",
"duration": 21
},
{
"pid": 87,
"grp": "lived",
"duration": 12
},
{
"pid": 87,
"grp": "married",
"duration": -99
},
{
"pid": 88,
"grp": "met",
"duration": 1
},
{
"pid": 88,
"grp": "romantic",
"duration": 46
},
{
"pid": 88,
"grp": "married",
"duration": -99
},
{
"pid": 89,
"grp": "romantic",
"duration": 18
},
{
"pid": 89,
"grp": "lived",
"duration": 61
},
{
"pid": 89,
"grp": "married",
"duration": -99
},
{
"pid": 90,
"grp": "romantic",
"duration": 2
},
{
"pid": 90,
"grp": "lived",
"duration": 41
},
{
"pid": 90,
"grp": "married",
"duration": -99
},
{
"pid": 91,
"grp": "met",
"duration": 11
},
{
"pid": 91,
"grp": "romantic",
"duration": 22
},
{
"pid": 91,
"grp": "married",
"duration": -99
},
{
"pid": 92,
"grp": "romantic",
"duration": 12
},
{
"pid": 92,
"grp": "lived",
"duration": 5
},
{
"pid": 92,
"grp": "married",
"duration": -99
},
{
"pid": 93,
"grp": "met",
"duration": 3
},
{
"pid": 93,
"grp": "romantic",
"duration": 7
},
{
"pid": 93,
"grp": "lived",
"duration": 6
},
{
"pid": 93,
"grp": "married",
"duration": -99
},
{
"pid": 94,
"grp": "met",
"duration": 54
},
{
"pid": 94,
"grp": "romantic",
"duration": 19
},
{
"pid": 94,
"grp": "married",
"duration": -99
},
{
"pid": 95,
"grp": "met",
"duration": 36
},
{
"pid": 95,
"grp": "romantic",
"duration": 9
},
{
"pid": 95,
"grp": "lived",
"duration": 25
},
{
"pid": 95,
"grp": "married",
"duration": -99
},
{
"pid": 96,
"grp": "met",
"duration": 3
},
{
"pid": 96,
"grp": "romantic",
"duration": 82
},
{
"pid": 96,
"grp": "married",
"duration": -99
},
{
"pid": 97,
"grp": "met",
"duration": 5
},
{
"pid": 97,
"grp": "lived",
"duration": 12
},
{
"pid": 97,
"grp": "married",
"duration": -99
},
{
"pid": 98,
"grp": "romantic",
"duration": 6
},
{
"pid": 98,
"grp": "lived",
"duration": 14
},
{
"pid": 98,
"grp": "married",
"duration": -99
},
{
"pid": 99,
"grp": "met",
"duration": 84
},
{
"pid": 99,
"grp": "romantic",
"duration": 2
},
{
"pid": 99,
"grp": "married",
"duration": -99
},
{
"pid": 100,
"grp": "met",
"duration": 2
},
{
"pid": 100,
"grp": "romantic",
"duration": 103
},
{
"pid": 100,
"grp": "lived",
"duration": 5
},
{
"pid": 100,
"grp": "married",
"duration": -99
},
{
"pid": 101,
"grp": "met",
"duration": 31
},
{
"pid": 101,
"grp": "romantic",
"duration": 161
},
{
"pid": 101,
"grp": "lived",
"duration": 13
},
{
"pid": 101,
"grp": "married",
"duration": -99
},
{
"pid": 102,
"grp": "met",
"duration": 20
},
{
"pid": 102,
"grp": "romantic",
"duration": 3
},
{
"pid": 102,
"grp": "lived",
"duration": 70
},
{
"pid": 102,
"grp": "married",
"duration": -99
},
{
"pid": 103,
"grp": "met",
"duration": 1
},
{
"pid": 103,
"grp": "romantic",
"duration": 125
},
{
"pid": 103,
"grp": "married",
"duration": -99
},
{
"pid": 104,
"grp": "met",
"duration": 1
},
{
"pid": 104,
"grp": "romantic",
"duration": 6
},
{
"pid": 104,
"grp": "lived",
"duration": 78
},
{
"pid": 104,
"grp": "married",
"duration": -99
},
{
"pid": 105,
"grp": "met",
"duration": 4
},
{
"pid": 105,
"grp": "romantic",
"duration": 17
},
{
"pid": 105,
"grp": "married",
"duration": -99
},
{
"pid": 106,
"grp": "romantic",
"duration": 31
},
{
"pid": 106,
"grp": "married",
"duration": -99
},
{
"pid": 107,
"grp": "met",
"duration": 5
},
{
"pid": 107,
"grp": "romantic",
"duration": 12
},
{
"pid": 107,
"grp": "married",
"duration": -99
},
{
"pid": 108,
"grp": "met",
"duration": 5
},
{
"pid": 108,
"grp": "romantic",
"duration": 16
},
{
"pid": 108,
"grp": "married",
"duration": -99
},
{
"pid": 109,
"grp": "met",
"duration": 1
},
{
"pid": 109,
"grp": "romantic",
"duration": 34
},
{
"pid": 109,
"grp": "married",
"duration": -99
},
{
"pid": 110,
"grp": "met",
"duration": 2
},
{
"pid": 110,
"grp": "romantic",
"duration": 61
},
{
"pid": 110,
"grp": "lived",
"duration": 11
},
{
"pid": 110,
"grp": "married",
"duration": -99
},
{
"pid": 111,
"grp": "romantic",
"duration": 3
},
{
"pid": 111,
"grp": "lived",
"duration": 22
},
{
"pid": 111,
"grp": "married",
"duration": -99
},
{
"pid": 112,
"grp": "met",
"duration": 2
},
{
"pid": 112,
"grp": "romantic",
"duration": 61
},
{
"pid": 112,
"grp": "lived",
"duration": 11
},
{
"pid": 112,
"grp": "married",
"duration": -99
},
{
"pid": 113,
"grp": "met",
"duration": 5
},
{
"pid": 113,
"grp": "romantic",
"duration": 12
},
{
"pid": 113,
"grp": "lived",
"duration": 51
},
{
"pid": 113,
"grp": "married",
"duration": -99
},
{
"pid": 114,
"grp": "romantic",
"duration": 4
},
{
"pid": 114,
"grp": "married",
"duration": -99
},
{
"pid": 115,
"grp": "met",
"duration": 6
},
{
"pid": 115,
"grp": "romantic",
"duration": 33
},
{
"pid": 115,
"grp": "lived",
"duration": 28
},
{
"pid": 115,
"grp": "married",
"duration": -99
},
{
"pid": 116,
"grp": "met",
"duration": 7
},
{
"pid": 116,
"grp": "romantic",
"duration": 10
},
{
"pid": 116,
"grp": "lived",
"duration": 17
},
{
"pid": 116,
"grp": "married",
"duration": -99
},
{
"pid": 117,
"grp": "met",
"duration": 14
},
{
"pid": 117,
"grp": "romantic",
"duration": 61
},
{
"pid": 117,
"grp": "married",
"duration": -99
},
{
"pid": 118,
"grp": "met",
"duration": 7
},
{
"pid": 118,
"grp": "romantic",
"duration": 10
},
{
"pid": 118,
"grp": "lived",
"duration": 17
},
{
"pid": 118,
"grp": "married",
"duration": -99
},
{
"pid": 119,
"grp": "met",
"duration": 3
},
{
"pid": 119,
"grp": "romantic",
"duration": 9
},
{
"pid": 119,
"grp": "lived",
"duration": 17
},
{
"pid": 119,
"grp": "married",
"duration": -99
},
{
"pid": 120,
"grp": "romantic",
"duration": 6
},
{
"pid": 120,
"grp": "married",
"duration": -99
},
{
"pid": 121,
"grp": "met",
"duration": 54
},
{
"pid": 121,
"grp": "romantic",
"duration": 22
},
{
"pid": 121,
"grp": "married",
"duration": -99
},
{
"pid": 122,
"grp": "met",
"duration": 49
},
{
"pid": 122,
"grp": "romantic",
"duration": 16
},
{
"pid": 122,
"grp": "married",
"duration": -99
},
{
"pid": 123,
"grp": "met",
"duration": 1
},
{
"pid": 123,
"grp": "romantic",
"duration": 4
},
{
"pid": 123,
"grp": "lived",
"duration": 32
},
{
"pid": 123,
"grp": "married",
"duration": -99
},
{
"pid": 124,
"grp": "met",
"duration": 1
},
{
"pid": 124,
"grp": "romantic",
"duration": 16
},
{
"pid": 124,
"grp": "lived",
"duration": 13
},
{
"pid": 124,
"grp": "married",
"duration": -99
},
{
"pid": 125,
"grp": "met",
"duration": 3
},
{
"pid": 125,
"grp": "romantic",
"duration": 53
},
{
"pid": 125,
"grp": "lived",
"duration": 189
},
{
"pid": 125,
"grp": "married",
"duration": -99
},
{
"pid": 126,
"grp": "romantic",
"duration": 19
},
{
"pid": 126,
"grp": "lived",
"duration": 43
},
{
"pid": 126,
"grp": "married",
"duration": -99
},
{
"pid": 127,
"grp": "met",
"duration": 37
},
{
"pid": 127,
"grp": "romantic",
"duration": 36
},
{
"pid": 127,
"grp": "lived",
"duration": 16
},
{
"pid": 127,
"grp": "married",
"duration": -99
},
{
"pid": 128,
"grp": "met",
"duration": 11
},
{
"pid": 128,
"grp": "romantic",
"duration": 22
},
{
"pid": 128,
"grp": "married",
"duration": -99
},
{
"pid": 129,
"grp": "met",
"duration": 12
},
{
"pid": 129,
"grp": "lived",
"duration": 33
},
{
"pid": 129,
"grp": "married",
"duration": -99
},
{
"pid": 130,
"grp": "met",
"duration": 37
},
{
"pid": 130,
"grp": "romantic",
"duration": 36
},
{
"pid": 130,
"grp": "lived",
"duration": 16
},
{
"pid": 130,
"grp": "married",
"duration": -99
},
{
"pid": 131,
"grp": "romantic",
"duration": 2
},
{
"pid": 131,
"grp": "lived",
"duration": 23
},
{
"pid": 131,
"grp": "married",
"duration": -99
},
{
"pid": 132,
"grp": "met",
"duration": 3
},
{
"pid": 132,
"grp": "romantic",
"duration": 82
},
{
"pid": 132,
"grp": "married",
"duration": -99
},
{
"pid": 133,
"grp": "met",
"duration": 16
},
{
"pid": 133,
"grp": "romantic",
"duration": 4
},
{
"pid": 133,
"grp": "lived",
"duration": 18
},
{
"pid": 133,
"grp": "married",
"duration": -99
},
{
"pid": 134,
"grp": "met",
"duration": 11
},
{
"pid": 134,
"grp": "romantic",
"duration": 3
},
{
"pid": 134,
"grp": "lived",
"duration": 6
},
{
"pid": 134,
"grp": "married",
"duration": -99
},
{
"pid": 135,
"grp": "met",
"duration": 1
},
{
"pid": 135,
"grp": "lived",
"duration": 1
},
{
"pid": 135,
"grp": "married",
"duration": -99
},
{
"pid": 136,
"grp": "met",
"duration": 11
},
{
"pid": 136,
"grp": "romantic",
"duration": 7
},
{
"pid": 136,
"grp": "lived",
"duration": 9
},
{
"pid": 136,
"grp": "married",
"duration": -99
},
{
"pid": 137,
"grp": "met",
"duration": 5
},
{
"pid": 137,
"grp": "romantic",
"duration": 12
},
{
"pid": 137,
"grp": "lived",
"duration": 51
},
{
"pid": 137,
"grp": "married",
"duration": -99
},
{
"pid": 138,
"grp": "met",
"duration": 9
},
{
"pid": 138,
"grp": "romantic",
"duration": 3
},
{
"pid": 138,
"grp": "lived",
"duration": 29
},
{
"pid": 138,
"grp": "married",
"duration": -99
},
{
"pid": 139,
"grp": "met",
"duration": 1
},
{
"pid": 139,
"grp": "romantic",
"duration": 3
},
{
"pid": 139,
"grp": "lived",
"duration": 15
},
{
"pid": 139,
"grp": "married",
"duration": -99
},
{
"pid": 140,
"grp": "met",
"duration": 130
},
{
"pid": 140,
"grp": "romantic",
"duration": 40
},
{
"pid": 140,
"grp": "lived",
"duration": 17
},
{
"pid": 140,
"grp": "married",
"duration": -99
},
{
"pid": 141,
"grp": "met",
"duration": 5
},
{
"pid": 141,
"grp": "romantic",
"duration": 7
},
{
"pid": 141,
"grp": "married",
"duration": -99
},
{
"pid": 142,
"grp": "met",
"duration": 84
},
{
"pid": 142,
"grp": "romantic",
"duration": 2
},
{
"pid": 142,
"grp": "married",
"duration": -99
},
{
"pid": 143,
"grp": "met",
"duration": 6
},
{
"pid": 143,
"grp": "romantic",
"duration": 29
},
{
"pid": 143,
"grp": "married",
"duration": -99
},
{
"pid": 144,
"grp": "met",
"duration": 130
},
{
"pid": 144,
"grp": "romantic",
"duration": 40
},
{
"pid": 144,
"grp": "lived",
"duration": 17
},
{
"pid": 144,
"grp": "married",
"duration": -99
},
{
"pid": 145,
"grp": "met",
"duration": 11
},
{
"pid": 145,
"grp": "romantic",
"duration": 7
},
{
"pid": 145,
"grp": "lived",
"duration": 9
},
{
"pid": 145,
"grp": "married",
"duration": -99
},
{
"pid": 146,
"grp": "met",
"duration": 43
},
{
"pid": 146,
"grp": "romantic",
"duration": 51
},
{
"pid": 146,
"grp": "lived",
"duration": 9
},
{
"pid": 146,
"grp": "married",
"duration": -99
},
{
"pid": 147,
"grp": "met",
"duration": 6
},
{
"pid": 147,
"grp": "romantic",
"duration": 30
},
{
"pid": 147,
"grp": "married",
"duration": -99
},
{
"pid": 148,
"grp": "met",
"duration": 26
},
{
"pid": 148,
"grp": "romantic",
"duration": 3
},
{
"pid": 148,
"grp": "lived",
"duration": 25
},
{
"pid": 148,
"grp": "married",
"duration": -99
},
{
"pid": 149,
"grp": "met",
"duration": 69
},
{
"pid": 149,
"grp": "romantic",
"duration": 26
},
{
"pid": 149,
"grp": "lived",
"duration": 62
},
{
"pid": 149,
"grp": "married",
"duration": -99
},
{
"pid": 150,
"grp": "romantic",
"duration": 2
},
{
"pid": 150,
"grp": "lived",
"duration": 356
},
{
"pid": 150,
"grp": "married",
"duration": -99
},
{
"pid": 151,
"grp": "met",
"duration": 9
},
{
"pid": 151,
"grp": "romantic",
"duration": 3
},
{
"pid": 151,
"grp": "lived",
"duration": 29
},
{
"pid": 151,
"grp": "married",
"duration": -99
},
{
"pid": 152,
"grp": "met",
"duration": 25
},
{
"pid": 152,
"grp": "romantic",
"duration": 34
},
{
"pid": 152,
"grp": "lived",
"duration": 20
},
{
"pid": 152,
"grp": "married",
"duration": -99
},
{
"pid": 153,
"grp": "met",
"duration": 31
},
{
"pid": 153,
"grp": "romantic",
"duration": 13
},
{
"pid": 153,
"grp": "lived",
"duration": 30
},
{
"pid": 153,
"grp": "married",
"duration": -99
},
{
"pid": 154,
"grp": "met",
"duration": 11
},
{
"pid": 154,
"grp": "romantic",
"duration": 7
},
{
"pid": 154,
"grp": "lived",
"duration": 9
},
{
"pid": 154,
"grp": "married",
"duration": -99
},
{
"pid": 155,
"grp": "met",
"duration": 286
},
{
"pid": 155,
"grp": "romantic",
"duration": 6
},
{
"pid": 155,
"grp": "lived",
"duration": 13
},
{
"pid": 155,
"grp": "married",
"duration": -99
},
{
"pid": 156,
"grp": "romantic",
"duration": 6
},
{
"pid": 156,
"grp": "lived",
"duration": 23
},
{
"pid": 156,
"grp": "married",
"duration": -99
},
{
"pid": 157,
"grp": "met",
"duration": 13
},
{
"pid": 157,
"grp": "romantic",
"duration": 11
},
{
"pid": 157,
"grp": "lived",
"duration": 81
},
{
"pid": 157,
"grp": "married",
"duration": -99
},
{
"pid": 158,
"grp": "met",
"duration": 5
},
{
"pid": 158,
"grp": "romantic",
"duration": 13
},
{
"pid": 158,
"grp": "married",
"duration": -99
},
{
"pid": 159,
"grp": "met",
"duration": 1
},
{
"pid": 159,
"grp": "romantic",
"duration": 16
},
{
"pid": 159,
"grp": "lived",
"duration": 13
},
{
"pid": 159,
"grp": "married",
"duration": -99
},
{
"pid": 160,
"grp": "romantic",
"duration": 6
},
{
"pid": 160,
"grp": "lived",
"duration": 16
},
{
"pid": 160,
"grp": "married",
"duration": -99
},
{
"pid": 161,
"grp": "met",
"duration": 12
},
{
"pid": 161,
"grp": "married",
"duration": -99
},
{
"pid": 162,
"grp": "lived",
"duration": 42
},
{
"pid": 162,
"grp": "married",
"duration": -99
},
{
"pid": 163,
"grp": "lived",
"duration": 22
},
{
"pid": 163,
"grp": "married",
"duration": -99
},
{
"pid": 164,
"grp": "met",
"duration": 10
},
{
"pid": 164,
"grp": "romantic",
"duration": 35